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
@@ -3,10 +3,12 @@ This is the state file for the Talk2AIAgents4Pharma agent.
3
3
  """
4
4
 
5
5
  from ...talk2biomodels.states.state_talk2biomodels import Talk2Biomodels
6
- from ...talk2knowledgegraphs.states.state_talk2knowledgegraphs import Talk2KnowledgeGraphs
6
+ from ...talk2knowledgegraphs.states.state_talk2knowledgegraphs import (
7
+ Talk2KnowledgeGraphs,
8
+ )
7
9
 
8
- class Talk2AIAgents4Pharma(Talk2Biomodels,
9
- Talk2KnowledgeGraphs):
10
+
11
+ class Talk2AIAgents4Pharma(Talk2Biomodels, Talk2KnowledgeGraphs):
10
12
  """
11
13
  The state for the Talk2AIAgents4Pharma agent.
12
14
 
@@ -1,3 +1,3 @@
1
- '''
1
+ """
2
2
  This module contains the test cases.
3
- '''
3
+ """
@@ -1,17 +1,21 @@
1
- '''
1
+ """
2
2
  Test Talk2AIAgents4Pharma supervisor agent.
3
- '''
4
- from unittest.mock import patch, MagicMock
3
+ """
4
+
5
+ from unittest.mock import MagicMock, patch
6
+
7
+ import pandas as pd
5
8
  import pytest
6
9
  from langchain_core.messages import HumanMessage
7
10
  from langchain_openai import ChatOpenAI, OpenAIEmbeddings
8
- import pandas as pd
11
+
9
12
  from ..agents.main_agent import get_app
10
13
 
11
14
  # Define the data path for the test files of Talk2KnowledgeGraphs agent
12
15
  DATA_PATH = "aiagents4pharma/talk2knowledgegraphs/tests/files"
13
16
  LLM_MODEL = ChatOpenAI(model="gpt-4o-mini", temperature=0.0)
14
17
 
18
+
15
19
  @pytest.fixture(name="input_dict")
16
20
  def input_dict_fixture():
17
21
  """
@@ -27,7 +31,7 @@ def input_dict_fixture():
27
31
  "cellular_component": [],
28
32
  "biological_process": [],
29
33
  "drug": [],
30
- "disease": []
34
+ "disease": [],
31
35
  },
32
36
  "uploaded_files": [],
33
37
  "dic_source_graph": [
@@ -37,43 +41,54 @@ def input_dict_fixture():
37
41
  "kg_text_path": f"{DATA_PATH}/biobridge_multimodal_text_graph.pkl",
38
42
  }
39
43
  ],
40
- "dic_extracted_graph": []
44
+ "dic_extracted_graph": [],
41
45
  }
42
46
 
43
47
  return input_dict
44
48
 
49
+
45
50
  def mock_milvus_collection(name):
46
51
  """
47
52
  Mock Milvus collection for testing.
48
53
  """
49
54
  nodes = MagicMock()
50
55
  nodes.query.return_value = [
51
- {"node_index": 0,
52
- "node_id": "id1",
53
- "node_name": "Adalimumab",
54
- "node_type": "drug",
55
- "feat": "featA", "feat_emb": [0.1, 0.2, 0.3],
56
- "desc": "descA", "desc_emb": [0.1, 0.2, 0.3]},
57
- {"node_index": 1,
58
- "node_id": "id2",
59
- "node_name": "TNF",
60
- "node_type": "gene/protein",
61
- "feat": "featB", "feat_emb": [0.4, 0.5, 0.6],
62
- "desc": "descB", "desc_emb": [0.4, 0.5, 0.6]}
56
+ {
57
+ "node_index": 0,
58
+ "node_id": "id1",
59
+ "node_name": "Adalimumab",
60
+ "node_type": "drug",
61
+ "feat": "featA",
62
+ "feat_emb": [0.1, 0.2, 0.3],
63
+ "desc": "descA",
64
+ "desc_emb": [0.1, 0.2, 0.3],
65
+ },
66
+ {
67
+ "node_index": 1,
68
+ "node_id": "id2",
69
+ "node_name": "TNF",
70
+ "node_type": "gene/protein",
71
+ "feat": "featB",
72
+ "feat_emb": [0.4, 0.5, 0.6],
73
+ "desc": "descB",
74
+ "desc_emb": [0.4, 0.5, 0.6],
75
+ },
63
76
  ]
64
77
  nodes.load.return_value = None
65
78
 
66
79
  edges = MagicMock()
67
80
  edges.query.return_value = [
68
- {"triplet_index": 0,
69
- "head_id": "id1",
70
- "head_index": 0,
71
- "tail_id": "id2",
72
- "tail_index": 1,
73
- "edge_type": "drug,acts_on,gene/protein",
74
- "display_relation": "acts_on",
75
- "feat": "featC",
76
- "feat_emb": [0.7, 0.8, 0.9]}
81
+ {
82
+ "triplet_index": 0,
83
+ "head_id": "id1",
84
+ "head_index": 0,
85
+ "tail_id": "id2",
86
+ "tail_index": 1,
87
+ "edge_type": "drug,acts_on,gene/protein",
88
+ "display_relation": "acts_on",
89
+ "feat": "featC",
90
+ "feat_emb": [0.7, 0.8, 0.9],
91
+ }
77
92
  ]
78
93
  edges.load.return_value = None
79
94
 
@@ -83,6 +98,7 @@ def mock_milvus_collection(name):
83
98
  return edges
84
99
  return None
85
100
 
101
+
86
102
  def test_main_agent_invokes_t2kg(input_dict):
87
103
  """
88
104
  In the following test, we will ask the main agent (supervisor)
@@ -109,21 +125,31 @@ def test_main_agent_invokes_t2kg(input_dict):
109
125
  )
110
126
  prompt = "List drugs that target the gene Interleukin-6"
111
127
 
112
- with patch("aiagents4pharma.talk2knowledgegraphs.tools."
113
- "milvus_multimodal_subgraph_extraction.Collection",
114
- side_effect=mock_milvus_collection), \
115
- patch("aiagents4pharma.talk2knowledgegraphs.tools."
116
- "milvus_multimodal_subgraph_extraction.MultimodalPCSTPruning") as mock_pcst, \
117
- patch("pymilvus.connections") as mock_connections, \
118
- patch("aiagents4pharma.talk2knowledgegraphs.tools."
119
- "milvus_multimodal_subgraph_extraction.hydra.initialize"), \
120
- patch("aiagents4pharma.talk2knowledgegraphs.tools."
121
- "milvus_multimodal_subgraph_extraction.hydra.compose") as mock_compose:
128
+ with (
129
+ patch(
130
+ "aiagents4pharma.talk2knowledgegraphs.tools."
131
+ "milvus_multimodal_subgraph_extraction.Collection",
132
+ side_effect=mock_milvus_collection,
133
+ ),
134
+ patch(
135
+ "aiagents4pharma.talk2knowledgegraphs.tools."
136
+ "milvus_multimodal_subgraph_extraction.MultimodalPCSTPruning"
137
+ ) as mock_pcst,
138
+ patch("pymilvus.connections") as mock_connections,
139
+ patch(
140
+ "aiagents4pharma.talk2knowledgegraphs.tools."
141
+ "milvus_multimodal_subgraph_extraction.hydra.initialize"
142
+ ),
143
+ patch(
144
+ "aiagents4pharma.talk2knowledgegraphs.tools."
145
+ "milvus_multimodal_subgraph_extraction.hydra.compose"
146
+ ) as mock_compose,
147
+ ):
122
148
  mock_connections.has_connection.return_value = True
123
149
  mock_pcst_instance = MagicMock()
124
150
  mock_pcst_instance.extract_subgraph.return_value = {
125
151
  "nodes": pd.Series([0, 1]),
126
- "edges": pd.Series([0])
152
+ "edges": pd.Series([0]),
127
153
  }
128
154
  mock_pcst.return_value = mock_pcst_instance
129
155
  mock_cfg = MagicMock()
@@ -137,14 +163,12 @@ def test_main_agent_invokes_t2kg(input_dict):
137
163
  mock_cfg.node_colors_dict = {"drug": "blue", "gene/protein": "red"}
138
164
  mock_compose.return_value = MagicMock()
139
165
  mock_compose.return_value.tools.multimodal_subgraph_extraction = mock_cfg
140
- mock_compose.return_value.tools.subgraph_summarization.\
141
- prompt_subgraph_summarization = (
166
+ mock_compose.return_value.tools.subgraph_summarization.prompt_subgraph_summarization = (
142
167
  "Summarize the following subgraph: {textualized_subgraph}"
143
168
  )
144
169
 
145
170
  # Invoke the agent
146
- response = app.invoke({"messages": [HumanMessage(content=prompt)]},
147
- config=config)
171
+ response = app.invoke({"messages": [HumanMessage(content=prompt)]}, config=config)
148
172
 
149
173
  # Check assistant message
150
174
  assistant_msg = response["messages"][-1].content
@@ -168,23 +192,21 @@ def test_main_agent_invokes_t2kg(input_dict):
168
192
  result = mock_milvus_collection("unknown")
169
193
  assert result is None
170
194
 
195
+
171
196
  def test_main_agent_invokes_t2b():
172
- '''
197
+ """
173
198
  In the following test, we will ask the main agent (supervisor)
174
199
  to simulate a model. And we will check if the Talk2BioModels
175
200
  agent is invoked. We will do so by checking the state of the
176
201
  Talk2AIAgents4Pharma agent, which is partly inherited from the
177
202
  Talk2BioModels agent.
178
- '''
203
+ """
179
204
  unique_id = 123
180
205
  app = get_app(unique_id, llm_model=LLM_MODEL)
181
206
  config = {"configurable": {"thread_id": unique_id}}
182
207
  prompt = "Simulate model 64"
183
208
  # Invoke the agent
184
- app.invoke(
185
- {"messages": [HumanMessage(content=prompt)]},
186
- config=config
187
- )
209
+ app.invoke({"messages": [HumanMessage(content=prompt)]}, config=config)
188
210
  # Get the state of the Talk2AIAgents4Pharma agent
189
211
  current_state = app.get_state(config)
190
212
  # Check if the dic_simulated_data is in the state
@@ -194,7 +216,7 @@ def test_main_agent_invokes_t2b():
194
216
  # Check if the length of the dic_simulated_data is 1
195
217
  assert len(dic_simulated_data) == 1
196
218
  # Check if the source of the model is 64
197
- assert dic_simulated_data[0]['source'] == 64
219
+ assert dic_simulated_data[0]["source"] == 64
198
220
  # Check if the data of the model contains
199
221
  # '1,3-bisphosphoglycerate'
200
- assert '1,3-bisphosphoglycerate' in dic_simulated_data[0]['data']
222
+ assert "1,3-bisphosphoglycerate" in dic_simulated_data[0]["data"]
@@ -0,0 +1,13 @@
1
+ _pycache_/
2
+ *.pyc
3
+ *.log
4
+ *.csv
5
+ *.pt
6
+ *.pkl
7
+ models/
8
+ data/
9
+ env/
10
+ .venv/
11
+ .git/
12
+ .env
13
+ .cufile.log
@@ -0,0 +1,104 @@
1
+ # syntax=docker/dockerfile:1
2
+
3
+ # Dockerfile for the talk2biomodels application
4
+ # Multi-stage build for optimized image size with UV package manager
5
+
6
+ ARG BASE_IMAGE=ubuntu:24.04
7
+ ARG PYTHON_VERSION=3.12
8
+
9
+ FROM ${BASE_IMAGE} AS dev-base
10
+ RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
11
+ build-essential \
12
+ ca-certificates \
13
+ cmake \
14
+ curl \
15
+ g++ \
16
+ libopenblas-dev \
17
+ libomp-dev \
18
+ ninja-build \
19
+ wget \
20
+ && rm -rf /var/lib/apt/lists/*
21
+
22
+ FROM dev-base AS python-install
23
+ ARG PYTHON_VERSION=3.12
24
+
25
+ # Install Python (available in Ubuntu 24.04 default repos)
26
+ RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
27
+ python${PYTHON_VERSION} \
28
+ python${PYTHON_VERSION}-dev \
29
+ python${PYTHON_VERSION}-venv \
30
+ python3-pip \
31
+ && rm -rf /var/lib/apt/lists/* \
32
+ && update-alternatives --install /usr/bin/python3 python3 /usr/bin/python${PYTHON_VERSION} 1 \
33
+ && update-alternatives --install /usr/bin/python python /usr/bin/python${PYTHON_VERSION} 1
34
+
35
+ FROM python-install AS uv-install
36
+ WORKDIR /app
37
+
38
+ # Install UV package manager and dependencies
39
+ COPY pyproject.toml uv.lock* ./
40
+ RUN curl -LsSf https://astral.sh/uv/install.sh | sh && \
41
+ export PATH="/root/.local/bin:$PATH" && \
42
+ export UV_PROJECT_ENVIRONMENT="/opt/venv" && \
43
+ uv sync --frozen --extra dev --no-install-project --python python${PYTHON_VERSION} && \
44
+ . /opt/venv/bin/activate && \
45
+ # RAPIDS packages (commented out - will be added in future if needed)
46
+ # uv pip install \
47
+ # --extra-index-url=https://pypi.nvidia.com \
48
+ # --index-strategy unsafe-best-match \
49
+ # cudf-cu12 dask-cudf-cu12 && \
50
+ uv cache clean
51
+
52
+ FROM ${BASE_IMAGE} AS runtime
53
+ ARG PYTHON_VERSION=3.12
54
+ LABEL maintainer="talk2biomodels"
55
+ LABEL version="1.0.0"
56
+ LABEL description="AI Agents for Pharma - Biomodels Application"
57
+
58
+ # Install runtime dependencies
59
+ RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
60
+ ca-certificates \
61
+ curl \
62
+ libmagic1 \
63
+ libopenblas0 \
64
+ libomp5 \
65
+ python${PYTHON_VERSION} \
66
+ && rm -rf /var/lib/apt/lists/* \
67
+ && update-alternatives --install /usr/bin/python3 python3 /usr/bin/python${PYTHON_VERSION} 1 \
68
+ && update-alternatives --install /usr/bin/python python /usr/bin/python${PYTHON_VERSION} 1
69
+
70
+ # Copy UV virtual environment from build stage
71
+ COPY --from=uv-install /opt/venv /opt/venv
72
+
73
+ # Set environment variables
74
+ ENV PATH="/opt/venv/bin:$PATH"
75
+ ENV PYTHONPATH="/app"
76
+ ENV PYTHONUNBUFFERED=1
77
+ ENV PYTHONDONTWRITEBYTECODE=1
78
+ ENV STREAMLIT_SERVER_HEADLESS=true
79
+ ENV STREAMLIT_SERVER_ENABLE_CORS=false
80
+
81
+ # Set working directory and create necessary directories
82
+ WORKDIR /app
83
+
84
+ # Copy application code
85
+ COPY aiagents4pharma/talk2biomodels /app/aiagents4pharma/talk2biomodels
86
+ COPY docs /app/docs
87
+ COPY app /app/app
88
+
89
+ # Copy and set up the entrypoint script (commented out - will be added in future if needed)
90
+ # COPY aiagents4pharma/talk2knowledgegraphs/entrypoint.sh /usr/local/bin/entrypoint.sh
91
+ # RUN chmod +x /usr/local/bin/entrypoint.sh
92
+
93
+ # Health check for production monitoring
94
+ HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
95
+ CMD curl -f http://localhost:8501/health || exit 1
96
+
97
+ # Expose the default Streamlit port
98
+ EXPOSE 8501
99
+
100
+ # Set the entrypoint (commented out - will be added in future if needed)
101
+ # ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
102
+
103
+ # Default command (can be overridden)
104
+ CMD ["streamlit", "run", "/app/app/frontend/streamlit_app_talk2biomodels.py", "--server.port=8501", "--server.address=0.0.0.0"]
@@ -0,0 +1 @@
1
+ Please check out the README file in the root folder for more information.
@@ -1,9 +1,5 @@
1
- '''
1
+ """
2
2
  This file is used to import the models and tools.
3
- '''
4
- from . import models
5
- from . import tools
6
- from . import agents
7
- from . import states
8
- from . import api
9
- from . import configs
3
+ """
4
+
5
+ from . import agents, api, configs, models, states, tools
@@ -1,5 +1,6 @@
1
- '''
1
+ """
2
2
  This file is used to import all the modules in the package.
3
- '''
3
+ """
4
+
4
5
  # import everything from the module
5
6
  from . import t2b_agent
@@ -1,73 +1,77 @@
1
- #/usr/bin/env python3
1
+ # /usr/bin/env python3
2
2
 
3
- '''
3
+ """
4
4
  This is the agent file for the Talk2BioModels agent.
5
- '''
5
+ """
6
6
 
7
7
  import logging
8
8
  from typing import Annotated
9
+
9
10
  import hydra
10
11
  from langchain_core.language_models.chat_models import BaseChatModel
11
12
  from langgraph.checkpoint.memory import MemorySaver
12
13
  from langgraph.graph import START, StateGraph
13
- from langgraph.prebuilt import create_react_agent, ToolNode, InjectedState
14
- from ..tools.search_models import SearchModelsTool
15
- from ..tools.get_modelinfo import GetModelInfoTool
16
- from ..tools.simulate_model import SimulateModelTool
14
+ from langgraph.prebuilt import InjectedState, ToolNode, create_react_agent
15
+
16
+ from ..states.state_talk2biomodels import Talk2Biomodels
17
+ from ..tools.ask_question import AskQuestionTool
17
18
  from ..tools.custom_plotter import CustomPlotterTool
18
19
  from ..tools.get_annotation import GetAnnotationTool
19
- from ..tools.ask_question import AskQuestionTool
20
+ from ..tools.get_modelinfo import GetModelInfoTool
20
21
  from ..tools.parameter_scan import ParameterScanTool
21
- from ..tools.steady_state import SteadyStateTool
22
22
  from ..tools.query_article import QueryArticle
23
- from ..states.state_talk2biomodels import Talk2Biomodels
23
+ from ..tools.search_models import SearchModelsTool
24
+ from ..tools.simulate_model import SimulateModelTool
25
+ from ..tools.steady_state import SteadyStateTool
24
26
 
25
27
  # Initialize logger
26
28
  logging.basicConfig(level=logging.INFO)
27
29
  logger = logging.getLogger(__name__)
28
30
 
29
- def get_app(uniq_id,
30
- llm_model: BaseChatModel):
31
- '''
31
+
32
+ def get_app(uniq_id, llm_model: BaseChatModel):
33
+ """
32
34
  This function returns the langraph app.
33
- '''
35
+ """
36
+
34
37
  def agent_t2b_node(state: Annotated[dict, InjectedState]):
35
- '''
38
+ """
36
39
  This function calls the model.
37
- '''
40
+ """
38
41
  logger.log(logging.INFO, "Calling t2b_agent node with thread_id %s", uniq_id)
39
42
  response = model.invoke(state, {"configurable": {"thread_id": uniq_id}})
40
43
  return response
41
44
 
42
45
  # Define the tools
43
- tools = ToolNode([
44
- SimulateModelTool(),
45
- AskQuestionTool(),
46
- CustomPlotterTool(),
47
- SearchModelsTool(),
48
- GetModelInfoTool(),
49
- SteadyStateTool(),
50
- ParameterScanTool(),
51
- GetAnnotationTool(),
52
- QueryArticle()
53
- ])
46
+ tools = ToolNode(
47
+ [
48
+ SimulateModelTool(),
49
+ AskQuestionTool(),
50
+ CustomPlotterTool(),
51
+ SearchModelsTool(),
52
+ GetModelInfoTool(),
53
+ SteadyStateTool(),
54
+ ParameterScanTool(),
55
+ GetAnnotationTool(),
56
+ QueryArticle(),
57
+ ]
58
+ )
54
59
 
55
60
  # Load hydra configuration
56
61
  logger.log(logging.INFO, "Load Hydra configuration for Talk2BioModels agent.")
57
62
  with hydra.initialize(version_base=None, config_path="../configs"):
58
- cfg = hydra.compose(config_name='config',
59
- overrides=['agents/t2b_agent=default'])
63
+ cfg = hydra.compose(config_name="config", overrides=["agents/t2b_agent=default"])
60
64
  cfg = cfg.agents.t2b_agent
61
65
  logger.log(logging.INFO, "state_modifier: %s", cfg.state_modifier)
62
66
  # Create the agent
63
67
  model = create_react_agent(
64
- llm_model,
65
- tools=tools,
66
- state_schema=Talk2Biomodels,
67
- prompt=cfg.state_modifier,
68
- version='v2',
69
- checkpointer=MemorySaver()
70
- )
68
+ llm_model,
69
+ tools=tools,
70
+ state_schema=Talk2Biomodels,
71
+ prompt=cfg.state_modifier,
72
+ version="v2",
73
+ checkpointer=MemorySaver(),
74
+ )
71
75
 
72
76
  # Define a new graph
73
77
  workflow = StateGraph(Talk2Biomodels)
@@ -87,11 +91,12 @@ def get_app(uniq_id,
87
91
  # meaning you can use it as you would any other runnable.
88
92
  # Note that we're (optionally) passing the memory
89
93
  # when compiling the graph
90
- app = workflow.compile(checkpointer=checkpointer,
91
- name="T2B_Agent")
92
- logger.log(logging.INFO,
93
- "Compiled the graph with thread_id %s and llm_model %s",
94
- uniq_id,
95
- llm_model)
94
+ app = workflow.compile(checkpointer=checkpointer, name="T2B_Agent")
95
+ logger.log(
96
+ logging.INFO,
97
+ "Compiled the graph with thread_id %s and llm_model %s",
98
+ uniq_id,
99
+ llm_model,
100
+ )
96
101
 
97
102
  return app
@@ -1,6 +1,5 @@
1
- '''
1
+ """
2
2
  This file is used to import the modules in the package.
3
- '''
4
- from . import uniprot
5
- from . import ols
6
- from . import kegg
3
+ """
4
+
5
+ from . import kegg, ols, uniprot
@@ -1,10 +1,12 @@
1
1
  """
2
2
  This module contains the API for fetching Kegg database
3
3
  """
4
+
4
5
  import re
5
- from typing import List, Dict
6
+
6
7
  import requests
7
8
 
9
+
8
10
  def fetch_from_api(base_url: str, query: str) -> str:
9
11
  """Fetch data from the given API endpoint."""
10
12
  try:
@@ -15,7 +17,8 @@ def fetch_from_api(base_url: str, query: str) -> str:
15
17
  print(f"Error fetching data for query {query}: {e}")
16
18
  return ""
17
19
 
18
- def fetch_kegg_names(ids: List[str], batch_size: int = 10) -> Dict[str, str]:
20
+
21
+ def fetch_kegg_names(ids: list[str], batch_size: int = 10) -> dict[str, str]:
19
22
  """
20
23
  Fetch the names of multiple KEGG entries using the KEGG REST API in batches.
21
24
 
@@ -34,7 +37,7 @@ def fetch_kegg_names(ids: List[str], batch_size: int = 10) -> Dict[str, str]:
34
37
 
35
38
  # Process IDs in batches
36
39
  for i in range(0, len(ids), batch_size):
37
- batch = ids[i:i + batch_size]
40
+ batch = ids[i : i + batch_size]
38
41
  query = "+".join(batch)
39
42
  entry_data = fetch_from_api(base_url, query)
40
43
 
@@ -45,17 +48,15 @@ def fetch_kegg_names(ids: List[str], batch_size: int = 10) -> Dict[str, str]:
45
48
  if not entry.strip():
46
49
  continue
47
50
  lines = entry.strip().split("\n")
48
- entry_line = next((line for line in lines
49
- if line.startswith("ENTRY")), None)
50
- name_line = next((line for line in lines
51
- if line.startswith("NAME")), None)
51
+ entry_line = next((line for line in lines if line.startswith("ENTRY")), None)
52
+ name_line = next((line for line in lines if line.startswith("NAME")), None)
52
53
 
53
54
  # if not entry_line and not name_line:
54
55
  # continue
55
56
  entry_id = entry_line.split()[1]
56
57
  # Split multiple names in the NAME field and clean them
57
58
  names = [
58
- re.sub(r'[^a-zA-Z0-9\s]', '', name).strip()
59
+ re.sub(r"[^a-zA-Z0-9\s]", "", name).strip()
59
60
  for name in name_line.replace("NAME", "").strip().split(";")
60
61
  ]
61
62
  # Join cleaned names into a single string
@@ -63,8 +64,10 @@ def fetch_kegg_names(ids: List[str], batch_size: int = 10) -> Dict[str, str]:
63
64
 
64
65
  return entry_name_map
65
66
 
66
- def fetch_kegg_annotations(data: List[Dict[str, str]],
67
- batch_size: int = 10) -> Dict[str, Dict[str, str]]:
67
+
68
+ def fetch_kegg_annotations(
69
+ data: list[dict[str, str]], batch_size: int = 10
70
+ ) -> dict[str, dict[str, str]]:
68
71
  """Fetch KEGG entry descriptions grouped by database type."""
69
72
  grouped_data = {}
70
73
  for entry in data:
@@ -77,6 +80,7 @@ def fetch_kegg_annotations(data: List[Dict[str, str]],
77
80
 
78
81
  return results
79
82
 
83
+
80
84
  # def get_protein_name_or_label(data: List[Dict[str, str]],
81
85
  # batch_size: int = 10) -> Dict[str, Dict[str, str]]:
82
86
  # """Fetch descriptions for KEGG-related identifiers."""
@@ -1,9 +1,10 @@
1
1
  """
2
2
  This module contains the API for fetching ols database
3
3
  """
4
- from typing import List, Dict
4
+
5
5
  import requests
6
6
 
7
+
7
8
  def fetch_from_ols(term: str) -> str:
8
9
  """
9
10
  Fetch the label for a single term from OLS.
@@ -19,23 +20,24 @@ def fetch_from_ols(term: str) -> str:
19
20
  base_url = f"https://www.ebi.ac.uk/ols4/api/ontologies/{ontology.lower()}/terms"
20
21
  params = {"obo_id": term}
21
22
  response = requests.get(
22
- base_url,
23
- params=params,
24
- headers={"Accept": "application/json"},
25
- timeout=10
23
+ base_url, params=params, headers={"Accept": "application/json"}, timeout=10
26
24
  )
27
25
  response.raise_for_status()
28
26
  data = response.json()
29
- label = '-'
27
+ label = "-"
30
28
  # Extract and return the label
31
- if "_embedded" in data and "terms" in data["_embedded"] \
32
- and len(data["_embedded"]["terms"]) > 0:
29
+ if (
30
+ "_embedded" in data
31
+ and "terms" in data["_embedded"]
32
+ and len(data["_embedded"]["terms"]) > 0
33
+ ):
33
34
  label = data["_embedded"]["terms"][0].get("label", "Label not found")
34
35
  return label
35
36
  except (requests.exceptions.RequestException, KeyError, IndexError) as e:
36
37
  return f"Error: {str(e)}"
37
38
 
38
- def fetch_ols_labels(terms: List[str]) -> Dict[str, str]:
39
+
40
+ def fetch_ols_labels(terms: list[str]) -> dict[str, str]:
39
41
  """
40
42
  Fetch labels for multiple terms from OLS.
41
43
 
@@ -50,7 +52,8 @@ def fetch_ols_labels(terms: List[str]) -> Dict[str, str]:
50
52
  results[term] = fetch_from_ols(term)
51
53
  return results
52
54
 
53
- def search_ols_labels(data: List[Dict[str, str]]) -> Dict[str, Dict[str, str]]:
55
+
56
+ def search_ols_labels(data: list[dict[str, str]]) -> dict[str, dict[str, str]]:
54
57
  """
55
58
  Fetch OLS annotations grouped by ontology type.
56
59