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
@@ -8,45 +8,52 @@ before the experiment is run.
8
8
 
9
9
  import logging
10
10
  from dataclasses import dataclass
11
- from typing import Union, List, Optional, Annotated
12
- from pydantic import Field
11
+ from typing import Annotated
12
+
13
13
  import basico
14
+ from pydantic import Field
14
15
 
15
16
  # Initialize logger
16
17
  logging.basicConfig(level=logging.INFO)
17
18
  logger = logging.getLogger(__name__)
18
19
 
20
+
19
21
  @dataclass
20
22
  class TimeData:
21
23
  """
22
24
  Dataclass for storing the time data.
23
25
  """
24
- duration: Union[int, float] = Field(
25
- description="Duration of the simulation",
26
- default=100)
27
- interval: Union[int, float] = Field(
26
+
27
+ duration: int | float = Field(description="Duration of the simulation", default=100)
28
+ interval: int | float = Field(
28
29
  description="The interval is the time step or"
29
30
  " the step size of the simulation. It is unrelated"
30
31
  " to the step size of species concentration and parameter values.",
31
- default=100)
32
+ default=100,
33
+ )
34
+
32
35
 
33
36
  @dataclass
34
37
  class SpeciesInitialData:
35
38
  """
36
39
  Dataclass for storing the species initial data.
37
40
  """
38
- species_name: List[str] = Field(
41
+
42
+ species_name: list[str] = Field(
39
43
  description="List of species whose initial concentration is to be set."
40
44
  " This does not include species that reoccur or the species whose"
41
45
  " concentration is to be determined/observed at the end of the experiment."
42
46
  " Do not hallucinate the species name.",
43
- default=[])
44
- species_concentration: List[Union[int, float]] = Field(
47
+ default=[],
48
+ )
49
+ species_concentration: list[int | float] = Field(
45
50
  description="List of initial concentrations of species."
46
51
  " This does not include species that reoccur or the species whose"
47
52
  " concentration is to be determined/observed at the end of the experiment."
48
53
  " Do not hallucinate the species concentration.",
49
- default=[])
54
+ default=[],
55
+ )
56
+
50
57
 
51
58
  @dataclass
52
59
  class TimeSpeciesNameConcentration:
@@ -54,10 +61,13 @@ class TimeSpeciesNameConcentration:
54
61
  Dataclass for storing the time,
55
62
  species name, and concentration data.
56
63
  """
57
- time: Union[int, float] = Field(description="time point where the event occurs")
64
+
65
+ time: int | float = Field(description="time point where the event occurs")
58
66
  species_name: str = Field(description="species name")
59
- species_concentration: Union[int, float] = Field(
60
- description="species concentration at the time point")
67
+ species_concentration: int | float = Field(
68
+ description="species concentration at the time point"
69
+ )
70
+
61
71
 
62
72
  @dataclass
63
73
  class ReocurringData:
@@ -66,34 +76,42 @@ class ReocurringData:
66
76
  the concentration of the species resets to a certain
67
77
  value after a certain time interval.
68
78
  """
69
- data: List[TimeSpeciesNameConcentration] = Field(
79
+
80
+ data: list[TimeSpeciesNameConcentration] = Field(
70
81
  description="List of time, name, and concentration data"
71
- " of species or parameters that reoccur",
72
- default=[])
82
+ " of species or parameters that reoccur",
83
+ default=[],
84
+ )
85
+
73
86
 
74
87
  @dataclass
75
88
  class ArgumentData:
76
89
  """
77
90
  Dataclass for storing the argument data.
78
91
  """
79
- experiment_name: Annotated[str, "An AI assigned _ separated name of"
80
- " the experiment based on human query"
81
- " and the context of the experiment."
82
- " This must be set before the experiment is run."]
83
- time_data: Optional[TimeData] = Field(
84
- description="time data",
85
- default=None)
86
- species_to_be_analyzed_before_experiment: Optional[SpeciesInitialData] = Field(
92
+
93
+ experiment_name: Annotated[
94
+ str,
95
+ "An AI assigned _ separated name of"
96
+ " the experiment based on human query"
97
+ " and the context of the experiment."
98
+ " This must be set before the experiment is run.",
99
+ ]
100
+ time_data: TimeData | None = Field(description="time data", default=None)
101
+ species_to_be_analyzed_before_experiment: SpeciesInitialData | None = Field(
87
102
  description="Data of species whose initial concentration"
88
103
  " is to be set before the experiment. This does not include"
89
104
  " species that reoccur or the species whose concentration"
90
105
  " is to be determined at the end of the experiment.",
91
- default=None)
92
- reocurring_data: Optional[ReocurringData] = Field(
106
+ default=None,
107
+ )
108
+ reocurring_data: ReocurringData | None = Field(
93
109
  description="List of concentration and time data of species that"
94
110
  " reoccur. For example, a species whose concentration resets"
95
111
  " to a certain value after a certain time interval.",
96
- default=None)
112
+ default=None,
113
+ )
114
+
97
115
 
98
116
  def add_rec_events(model_object, reocurring_data):
99
117
  """
@@ -108,7 +126,9 @@ def add_rec_events(model_object, reocurring_data):
108
126
  """
109
127
  for row in reocurring_data.data:
110
128
  tp, sn, sc = row.time, row.species_name, row.species_concentration
111
- basico.add_event(f'{sn}_{tp}',
112
- f'Time > {tp}',
113
- [[sn, str(sc)]],
114
- model=model_object.copasi_model)
129
+ basico.add_event(
130
+ f"{sn}_{tp}",
131
+ f"Time > {tp}",
132
+ [[sn, str(sc)]],
133
+ model=model_object.copasi_model,
134
+ )
@@ -4,10 +4,13 @@
4
4
  Function for loading the BioModel.
5
5
  """
6
6
 
7
- from typing import Annotated, Any, Union
7
+ from typing import Annotated, Any
8
+
8
9
  from pydantic import BaseModel, BeforeValidator
10
+
9
11
  from ..models.basico_model import BasicoModel
10
12
 
13
+
11
14
  def ensure_biomodel_id(value: Any) -> Any:
12
15
  """
13
16
  Ensure that the biomodel_id is an integer or a string starting with 'BIOMD' or 'MODEL'.
@@ -18,14 +21,17 @@ def ensure_biomodel_id(value: Any) -> Any:
18
21
  return value
19
22
  raise ValueError("biomodel_id must be an integer or a string starting with 'BIOMD' or 'MODEL'.")
20
23
 
24
+
21
25
  class ModelData(BaseModel):
22
26
  """
23
27
  Base model for the model data.
24
28
  """
25
- biomodel_id: Annotated[Union[int, str], BeforeValidator(ensure_biomodel_id)] = None
29
+
30
+ biomodel_id: Annotated[int | str, BeforeValidator(ensure_biomodel_id)] = None
26
31
  # sbml_file_path: Optional[str] = None
27
32
  use_uploaded_sbml_file: bool = False
28
33
 
34
+
29
35
  def load_biomodel(sys_bio_model, sbml_file_path=None):
30
36
  """
31
37
  Load the BioModel.
@@ -6,69 +6,79 @@ Tool for parameter scan.
6
6
 
7
7
  import logging
8
8
  from dataclasses import dataclass
9
- from typing import Type, Union, List, Annotated, Optional
10
- import pandas as pd
9
+ from typing import Annotated
10
+
11
11
  import basico
12
- from pydantic import BaseModel, Field
13
- from langgraph.types import Command
14
- from langgraph.prebuilt import InjectedState
15
- from langchain_core.tools import BaseTool
12
+ import pandas as pd
16
13
  from langchain_core.messages import ToolMessage
14
+ from langchain_core.tools import BaseTool
17
15
  from langchain_core.tools.base import InjectedToolCallId
16
+ from langgraph.prebuilt import InjectedState
17
+ from langgraph.types import Command
18
+ from pydantic import BaseModel, Field
19
+
20
+ from .load_arguments import SpeciesInitialData, TimeData
18
21
  from .load_biomodel import ModelData, load_biomodel
19
- from .load_arguments import TimeData, SpeciesInitialData
20
22
  from .utils import get_model_units
21
23
 
22
24
  # Initialize logger
23
25
  logging.basicConfig(level=logging.INFO)
24
26
  logger = logging.getLogger(__name__)
25
27
 
28
+
26
29
  @dataclass
27
30
  class ParameterScanData(BaseModel):
28
31
  """
29
32
  Dataclass for storing the parameter scan data.
30
33
  """
31
- species_names: List[str] = Field(
32
- description="species to be observed after each scan."
33
- " These are the species whose concentration"
34
- " will be observed after the parameter scan."
35
- " Do not make up this data.",
36
- default=[])
34
+
35
+ species_names: list[str] = Field(
36
+ description="species to be observed after each scan."
37
+ " These are the species whose concentration"
38
+ " will be observed after the parameter scan."
39
+ " Do not make up this data.",
40
+ default=[],
41
+ )
37
42
  species_parameter_name: str = Field(
38
- description="Species or parameter name to be scanned."
39
- " This is the species or parameter whose value will be scanned"
40
- " over a range of values. This does not include the species"
41
- " that are to be observed after the scan."
42
- "Do not make up this data.",
43
- default=None)
44
- species_parameter_values: List[Union[int, float]] = Field(
45
- description="Species or parameter values to be scanned."
46
- " These are the values of the species or parameters that will be"
47
- " scanned over a range of values. This does not include the "
48
- "species that are to be observed after the scan."
49
- "Do not make up this data.",
50
- default=None)
43
+ description="Species or parameter name to be scanned."
44
+ " This is the species or parameter whose value will be scanned"
45
+ " over a range of values. This does not include the species"
46
+ " that are to be observed after the scan."
47
+ "Do not make up this data.",
48
+ default=None,
49
+ )
50
+ species_parameter_values: list[int | float] = Field(
51
+ description="Species or parameter values to be scanned."
52
+ " These are the values of the species or parameters that will be"
53
+ " scanned over a range of values. This does not include the "
54
+ "species that are to be observed after the scan."
55
+ "Do not make up this data.",
56
+ default=None,
57
+ )
58
+
51
59
 
52
60
  @dataclass
53
61
  class ArgumentData:
54
62
  """
55
63
  Dataclass for storing the argument data.
56
64
  """
65
+
57
66
  time_data: TimeData = Field(description="time data", default=None)
58
- species_to_be_analyzed_before_experiment: Optional[SpeciesInitialData] = Field(
59
- description=" This is the initial condition of the model."
60
- " This does not include species that reoccur or the species"
61
- " whose concentration is to be determined/observed at the end"
62
- " of the experiment. This also does not include the species"
63
- " or the parameter that is to be scanned. Do not make up this data.",
64
- default=None)
65
- parameter_scan_data: ParameterScanData = Field(
66
- description="parameter scan data",
67
- default=None)
67
+ species_to_be_analyzed_before_experiment: SpeciesInitialData | None = Field(
68
+ description=" This is the initial condition of the model."
69
+ " This does not include species that reoccur or the species"
70
+ " whose concentration is to be determined/observed at the end"
71
+ " of the experiment. This also does not include the species"
72
+ " or the parameter that is to be scanned. Do not make up this data.",
73
+ default=None,
74
+ )
75
+ parameter_scan_data: ParameterScanData = Field(description="parameter scan data", default=None)
68
76
  experiment_name: str = Field(
69
- description="An AI assigned `_` separated unique name of"
70
- " the parameter scan experiment based on human query."
71
- " This must be unique for each experiment.")
77
+ description="An AI assigned `_` separated unique name of"
78
+ " the parameter scan experiment based on human query."
79
+ " This must be unique for each experiment."
80
+ )
81
+
72
82
 
73
83
  def make_list_dic_scanned_data(dic_param_scan, arg_data, sys_bio_model, tool_call_id):
74
84
  """
@@ -86,24 +96,26 @@ def make_list_dic_scanned_data(dic_param_scan, arg_data, sys_bio_model, tool_cal
86
96
  """
87
97
  list_dic_scanned_data = []
88
98
  for species_name, df_param_scan in dic_param_scan.items():
89
- logger.log(logging.INFO, "Parameter scan results for %s with shape %s",
90
- species_name,
91
- df_param_scan.shape)
99
+ logger.log(
100
+ logging.INFO,
101
+ "Parameter scan results for %s with shape %s",
102
+ species_name,
103
+ df_param_scan.shape,
104
+ )
92
105
  # Prepare the list dictionary of scanned data
93
106
  # that will be passed to the state of the graph
94
- list_dic_scanned_data.append({
95
- 'name': arg_data.experiment_name+':'+species_name,
96
- 'source': sys_bio_model.biomodel_id if sys_bio_model.biomodel_id else 'upload',
97
- 'tool_call_id': tool_call_id,
98
- 'data': df_param_scan.to_dict()
99
- })
107
+ list_dic_scanned_data.append(
108
+ {
109
+ "name": arg_data.experiment_name + ":" + species_name,
110
+ "source": (sys_bio_model.biomodel_id if sys_bio_model.biomodel_id else "upload"),
111
+ "tool_call_id": tool_call_id,
112
+ "data": df_param_scan.to_dict(),
113
+ }
114
+ )
100
115
  return list_dic_scanned_data
101
116
 
102
- def run_parameter_scan(model_object,
103
- arg_data,
104
- dic_species_data,
105
- duration,
106
- interval) -> dict:
117
+
118
+ def run_parameter_scan(model_object, arg_data, dic_species_data, duration, interval) -> dict:
107
119
  """
108
120
  Run parameter scan on the model.
109
121
 
@@ -128,16 +140,18 @@ def run_parameter_scan(model_object,
128
140
 
129
141
  # Extract all species name from the model
130
142
  df_all_species = basico.model_info.get_species(model=model_object.copasi_model)
131
- all_species = df_all_species['display_name'].tolist()
143
+ all_species = df_all_species["display_name"].tolist()
132
144
 
133
145
  # Verify if the given species or parameter names to be scanned are valid
134
146
  if arg_data.parameter_scan_data.species_parameter_name not in all_parameters + all_species:
135
147
  logger.error(
136
148
  "Invalid species or parameter name: %s",
137
- arg_data.parameter_scan_data.species_parameter_name)
149
+ arg_data.parameter_scan_data.species_parameter_name,
150
+ )
138
151
  raise ValueError(
139
152
  "Invalid species or parameter name: "
140
- f"{arg_data.parameter_scan_data.species_parameter_name}.")
153
+ f"{arg_data.parameter_scan_data.species_parameter_name}."
154
+ )
141
155
 
142
156
  # Dictionary to store the parameter scan results
143
157
  dic_param_scan_results = {}
@@ -165,12 +179,13 @@ def run_parameter_scan(model_object,
165
179
  for param_value in arg_data.parameter_scan_data.species_parameter_values:
166
180
  # Update the parameter value in the model
167
181
  model_object_copy.update_parameters(
168
- {arg_data.parameter_scan_data.species_parameter_name: param_value})
182
+ {arg_data.parameter_scan_data.species_parameter_name: param_value}
183
+ )
169
184
  # Simulate the model
170
185
  model_object_copy.simulate(duration=duration, interval=interval)
171
186
  # If the column name 'Time' is not present in the results DataFrame
172
- if 'Time' not in df_param_scan.columns:
173
- df_param_scan['Time'] = model_object_copy.simulation_results['Time']
187
+ if "Time" not in df_param_scan.columns:
188
+ df_param_scan["Time"] = model_object_copy.simulation_results["Time"]
174
189
  # Add the simulation results to the results DataFrame
175
190
  col_name = f"{arg_data.parameter_scan_data.species_parameter_name}_{param_value}"
176
191
  df_param_scan[col_name] = model_object_copy.simulation_results[species_name]
@@ -182,37 +197,42 @@ def run_parameter_scan(model_object,
182
197
  # return df_param_scan
183
198
  return dic_param_scan_results
184
199
 
200
+
185
201
  class ParameterScanInput(BaseModel):
186
202
  """
187
203
  Input schema for the ParameterScan tool.
188
204
  """
189
- sys_bio_model: ModelData = Field(description="model data",
190
- default=None)
191
- arg_data: ArgumentData = Field(description=
192
- """time, species, and reocurring data
205
+
206
+ sys_bio_model: ModelData = Field(description="model data", default=None)
207
+ arg_data: ArgumentData = Field(
208
+ description="""time, species, and reocurring data
193
209
  as well as the parameter scan name and
194
210
  data""",
195
- default=None)
211
+ default=None,
212
+ )
196
213
  tool_call_id: Annotated[str, InjectedToolCallId]
197
214
  state: Annotated[dict, InjectedState]
198
215
 
216
+
199
217
  # Note: It's important that every field has type hints. BaseTool is a
200
218
  # Pydantic class and not having type hints can lead to unexpected behavior.
201
219
  class ParameterScanTool(BaseTool):
202
220
  """
203
221
  Tool for parameter scan.
204
222
  """
223
+
205
224
  name: str = "parameter_scan"
206
225
  description: str = """A tool to perform scanning of a given
207
226
  parameter over a range of values and observe the effect on
208
227
  the concentration of a given species"""
209
- args_schema: Type[BaseModel] = ParameterScanInput
228
+ args_schema: type[BaseModel] = ParameterScanInput
210
229
 
211
- def _run(self,
230
+ def _run(
231
+ self,
212
232
  tool_call_id: Annotated[str, InjectedToolCallId],
213
233
  state: Annotated[dict, InjectedState],
214
234
  sys_bio_model: ModelData = None,
215
- arg_data: ArgumentData = None
235
+ arg_data: ArgumentData = None,
216
236
  ) -> Command:
217
237
  """
218
238
  Run the tool.
@@ -226,11 +246,9 @@ class ParameterScanTool(BaseTool):
226
246
  Returns:
227
247
  Command: The updated state of the tool.
228
248
  """
229
- logger.log(logging.INFO, "Calling parameter_scan tool %s, %s",
230
- sys_bio_model, arg_data)
231
- sbml_file_path = state['sbml_file_path'][-1] if len(state['sbml_file_path']) > 0 else None
232
- model_object = load_biomodel(sys_bio_model,
233
- sbml_file_path=sbml_file_path)
249
+ logger.log(logging.INFO, "Calling parameter_scan tool %s, %s", sys_bio_model, arg_data)
250
+ sbml_file_path = state["sbml_file_path"][-1] if len(state["sbml_file_path"]) > 0 else None
251
+ model_object = load_biomodel(sys_bio_model, sbml_file_path=sbml_file_path)
234
252
  # Prepare the dictionary of species data
235
253
  # that will be passed to the simulate method
236
254
  # of the BasicoModel class
@@ -243,9 +261,10 @@ class ParameterScanTool(BaseTool):
243
261
  dic_species_data = dict(
244
262
  zip(
245
263
  arg_data.species_to_be_analyzed_before_experiment.species_name,
246
- arg_data.species_to_be_analyzed_before_experiment.species_concentration
247
- )
264
+ arg_data.species_to_be_analyzed_before_experiment.species_concentration,
265
+ strict=False,
248
266
  )
267
+ )
249
268
 
250
269
  # # Add reocurring events (if any) to the model
251
270
  # if arg_data.reocurring_data is not None:
@@ -257,37 +276,35 @@ class ParameterScanTool(BaseTool):
257
276
  interval = arg_data.time_data.interval
258
277
 
259
278
  # Run the parameter scan
260
- dic_param_scan = run_parameter_scan(model_object,
261
- arg_data,
262
- dic_species_data,
263
- duration,
264
- interval)
279
+ dic_param_scan = run_parameter_scan(
280
+ model_object, arg_data, dic_species_data, duration, interval
281
+ )
265
282
 
266
283
  logger.log(logging.INFO, "Parameter scan results ready")
267
284
  # Prepare the list dictionary of scanned data
268
- list_dic_scanned_data = make_list_dic_scanned_data(dic_param_scan,
269
- arg_data,
270
- sys_bio_model,
271
- tool_call_id)
285
+ list_dic_scanned_data = make_list_dic_scanned_data(
286
+ dic_param_scan, arg_data, sys_bio_model, tool_call_id
287
+ )
272
288
  # Prepare the dictionary of updated state for the model
273
289
  dic_updated_state_for_model = {}
274
290
  for key, value in {
275
291
  "model_id": [sys_bio_model.biomodel_id],
276
292
  "sbml_file_path": [sbml_file_path],
277
293
  "dic_scanned_data": list_dic_scanned_data,
278
- }.items():
294
+ }.items():
279
295
  if value:
280
296
  dic_updated_state_for_model[key] = value
281
297
  # Return the updated state
282
298
  return Command(
283
- update=dic_updated_state_for_model|{
299
+ update=dic_updated_state_for_model
300
+ | {
284
301
  # update the message history
285
302
  "messages": [
286
303
  ToolMessage(
287
304
  content=f"Parameter scan results of {arg_data.experiment_name}",
288
305
  tool_call_id=tool_call_id,
289
- artifact=get_model_units(model_object)
290
- )
291
- ],
292
- }
293
- )
306
+ artifact=get_model_units(model_object),
307
+ )
308
+ ],
309
+ }
310
+ )
@@ -5,58 +5,59 @@ Tool for asking questions to the article.
5
5
  """
6
6
 
7
7
  import logging
8
- from typing import Type, Annotated
9
- from pydantic import BaseModel, Field
8
+ from typing import Annotated
9
+
10
+ from langchain_community.document_loaders import PyPDFLoader
10
11
  from langchain_core.tools import BaseTool
11
12
  from langchain_core.vectorstores import InMemoryVectorStore
12
- from langchain_community.document_loaders import PyPDFLoader
13
13
  from langgraph.prebuilt import InjectedState
14
+ from pydantic import BaseModel, Field
14
15
 
15
16
  # Initialize logger
16
17
  logging.basicConfig(level=logging.INFO)
17
18
  logger = logging.getLogger(__name__)
18
19
 
20
+
19
21
  class QueryArticleInput(BaseModel):
20
22
  """
21
23
  Input schema for the query_articles tool.
22
24
  """
25
+
23
26
  question: Annotated[str, Field(description="User question to search articles.")]
24
27
  state: Annotated[dict, InjectedState]
25
28
 
29
+
26
30
  # Note: It's important that every field has type hints. BaseTool is a
27
31
  # Pydantic class and not having type hints can lead to unexpected behavior.
28
32
  class QueryArticle(BaseTool):
29
33
  """
30
34
  Tool to ask questions to the article.
31
35
  """
36
+
32
37
  name: str = "query_article"
33
38
  description: str = "Ask questions to the article."
34
- args_schema: Type[BaseModel] = QueryArticleInput
39
+ args_schema: type[BaseModel] = QueryArticleInput
35
40
 
36
- def _run(self,
37
- question: str,
38
- state: Annotated[dict, InjectedState]):
41
+ def _run(self, question: str, state: Annotated[dict, InjectedState]):
39
42
  """
40
43
  Run the tool.
41
44
 
42
45
  Args:
43
46
  query (str): The search query.
44
47
  """
45
- logger.log(logging.INFO, "loading the article from %s", state['pdf_file_name'])
48
+ logger.log(logging.INFO, "loading the article from %s", state["pdf_file_name"])
46
49
  logger.log(logging.INFO, "searching the article with the question: %s", question)
47
50
  # Load the article
48
- loader = PyPDFLoader(state['pdf_file_name'])
51
+ loader = PyPDFLoader(state["pdf_file_name"])
49
52
  # Load the pages of the article
50
53
  pages = []
51
54
  for page in loader.lazy_load():
52
55
  pages.append(page)
53
56
  # Set up text embedding model
54
- text_embedding_model = state['text_embedding_model']
57
+ text_embedding_model = state["text_embedding_model"]
55
58
  logging.info("Loaded text embedding model %s", text_embedding_model)
56
59
  # Create a vector store from the pages
57
- vector_store = InMemoryVectorStore.from_documents(
58
- pages,
59
- text_embedding_model)
60
+ vector_store = InMemoryVectorStore.from_documents(pages, text_embedding_model)
60
61
  # Search the article with the question
61
62
  docs = vector_store.similarity_search(question)
62
63
  # Return the content of the pages