aiagents4pharma 0.0.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 (336) hide show
  1. aiagents4pharma/__init__.py +11 -0
  2. aiagents4pharma/talk2aiagents4pharma/.dockerignore +13 -0
  3. aiagents4pharma/talk2aiagents4pharma/Dockerfile +133 -0
  4. aiagents4pharma/talk2aiagents4pharma/README.md +1 -0
  5. aiagents4pharma/talk2aiagents4pharma/__init__.py +5 -0
  6. aiagents4pharma/talk2aiagents4pharma/agents/__init__.py +6 -0
  7. aiagents4pharma/talk2aiagents4pharma/agents/main_agent.py +70 -0
  8. aiagents4pharma/talk2aiagents4pharma/configs/__init__.py +5 -0
  9. aiagents4pharma/talk2aiagents4pharma/configs/agents/__init__.py +5 -0
  10. aiagents4pharma/talk2aiagents4pharma/configs/agents/main_agent/default.yaml +29 -0
  11. aiagents4pharma/talk2aiagents4pharma/configs/app/__init__.py +0 -0
  12. aiagents4pharma/talk2aiagents4pharma/configs/app/frontend/__init__.py +0 -0
  13. aiagents4pharma/talk2aiagents4pharma/configs/app/frontend/default.yaml +102 -0
  14. aiagents4pharma/talk2aiagents4pharma/configs/config.yaml +4 -0
  15. aiagents4pharma/talk2aiagents4pharma/docker-compose/cpu/.env.example +23 -0
  16. aiagents4pharma/talk2aiagents4pharma/docker-compose/cpu/docker-compose.yml +93 -0
  17. aiagents4pharma/talk2aiagents4pharma/docker-compose/gpu/.env.example +23 -0
  18. aiagents4pharma/talk2aiagents4pharma/docker-compose/gpu/docker-compose.yml +108 -0
  19. aiagents4pharma/talk2aiagents4pharma/install.md +154 -0
  20. aiagents4pharma/talk2aiagents4pharma/states/__init__.py +5 -0
  21. aiagents4pharma/talk2aiagents4pharma/states/state_talk2aiagents4pharma.py +18 -0
  22. aiagents4pharma/talk2aiagents4pharma/tests/__init__.py +3 -0
  23. aiagents4pharma/talk2aiagents4pharma/tests/test_main_agent.py +312 -0
  24. aiagents4pharma/talk2biomodels/.dockerignore +13 -0
  25. aiagents4pharma/talk2biomodels/Dockerfile +104 -0
  26. aiagents4pharma/talk2biomodels/README.md +1 -0
  27. aiagents4pharma/talk2biomodels/__init__.py +5 -0
  28. aiagents4pharma/talk2biomodels/agents/__init__.py +6 -0
  29. aiagents4pharma/talk2biomodels/agents/t2b_agent.py +104 -0
  30. aiagents4pharma/talk2biomodels/api/__init__.py +5 -0
  31. aiagents4pharma/talk2biomodels/api/ols.py +75 -0
  32. aiagents4pharma/talk2biomodels/api/uniprot.py +36 -0
  33. aiagents4pharma/talk2biomodels/configs/__init__.py +5 -0
  34. aiagents4pharma/talk2biomodels/configs/agents/__init__.py +5 -0
  35. aiagents4pharma/talk2biomodels/configs/agents/t2b_agent/__init__.py +3 -0
  36. aiagents4pharma/talk2biomodels/configs/agents/t2b_agent/default.yaml +14 -0
  37. aiagents4pharma/talk2biomodels/configs/app/__init__.py +0 -0
  38. aiagents4pharma/talk2biomodels/configs/app/frontend/__init__.py +0 -0
  39. aiagents4pharma/talk2biomodels/configs/app/frontend/default.yaml +72 -0
  40. aiagents4pharma/talk2biomodels/configs/config.yaml +7 -0
  41. aiagents4pharma/talk2biomodels/configs/tools/__init__.py +5 -0
  42. aiagents4pharma/talk2biomodels/configs/tools/ask_question/__init__.py +3 -0
  43. aiagents4pharma/talk2biomodels/configs/tools/ask_question/default.yaml +30 -0
  44. aiagents4pharma/talk2biomodels/configs/tools/custom_plotter/__init__.py +3 -0
  45. aiagents4pharma/talk2biomodels/configs/tools/custom_plotter/default.yaml +8 -0
  46. aiagents4pharma/talk2biomodels/configs/tools/get_annotation/__init__.py +3 -0
  47. aiagents4pharma/talk2biomodels/configs/tools/get_annotation/default.yaml +8 -0
  48. aiagents4pharma/talk2biomodels/install.md +63 -0
  49. aiagents4pharma/talk2biomodels/models/__init__.py +5 -0
  50. aiagents4pharma/talk2biomodels/models/basico_model.py +125 -0
  51. aiagents4pharma/talk2biomodels/models/sys_bio_model.py +60 -0
  52. aiagents4pharma/talk2biomodels/states/__init__.py +6 -0
  53. aiagents4pharma/talk2biomodels/states/state_talk2biomodels.py +49 -0
  54. aiagents4pharma/talk2biomodels/tests/BIOMD0000000449_url.xml +1585 -0
  55. aiagents4pharma/talk2biomodels/tests/__init__.py +3 -0
  56. aiagents4pharma/talk2biomodels/tests/article_on_model_537.pdf +0 -0
  57. aiagents4pharma/talk2biomodels/tests/test_api.py +31 -0
  58. aiagents4pharma/talk2biomodels/tests/test_ask_question.py +42 -0
  59. aiagents4pharma/talk2biomodels/tests/test_basico_model.py +67 -0
  60. aiagents4pharma/talk2biomodels/tests/test_get_annotation.py +190 -0
  61. aiagents4pharma/talk2biomodels/tests/test_getmodelinfo.py +92 -0
  62. aiagents4pharma/talk2biomodels/tests/test_integration.py +116 -0
  63. aiagents4pharma/talk2biomodels/tests/test_load_biomodel.py +35 -0
  64. aiagents4pharma/talk2biomodels/tests/test_param_scan.py +71 -0
  65. aiagents4pharma/talk2biomodels/tests/test_query_article.py +184 -0
  66. aiagents4pharma/talk2biomodels/tests/test_save_model.py +47 -0
  67. aiagents4pharma/talk2biomodels/tests/test_search_models.py +35 -0
  68. aiagents4pharma/talk2biomodels/tests/test_simulate_model.py +44 -0
  69. aiagents4pharma/talk2biomodels/tests/test_steady_state.py +86 -0
  70. aiagents4pharma/talk2biomodels/tests/test_sys_bio_model.py +67 -0
  71. aiagents4pharma/talk2biomodels/tools/__init__.py +17 -0
  72. aiagents4pharma/talk2biomodels/tools/ask_question.py +125 -0
  73. aiagents4pharma/talk2biomodels/tools/custom_plotter.py +165 -0
  74. aiagents4pharma/talk2biomodels/tools/get_annotation.py +342 -0
  75. aiagents4pharma/talk2biomodels/tools/get_modelinfo.py +159 -0
  76. aiagents4pharma/talk2biomodels/tools/load_arguments.py +134 -0
  77. aiagents4pharma/talk2biomodels/tools/load_biomodel.py +44 -0
  78. aiagents4pharma/talk2biomodels/tools/parameter_scan.py +310 -0
  79. aiagents4pharma/talk2biomodels/tools/query_article.py +64 -0
  80. aiagents4pharma/talk2biomodels/tools/save_model.py +98 -0
  81. aiagents4pharma/talk2biomodels/tools/search_models.py +96 -0
  82. aiagents4pharma/talk2biomodels/tools/simulate_model.py +137 -0
  83. aiagents4pharma/talk2biomodels/tools/steady_state.py +187 -0
  84. aiagents4pharma/talk2biomodels/tools/utils.py +23 -0
  85. aiagents4pharma/talk2cells/README.md +1 -0
  86. aiagents4pharma/talk2cells/__init__.py +5 -0
  87. aiagents4pharma/talk2cells/agents/__init__.py +6 -0
  88. aiagents4pharma/talk2cells/agents/scp_agent.py +87 -0
  89. aiagents4pharma/talk2cells/states/__init__.py +6 -0
  90. aiagents4pharma/talk2cells/states/state_talk2cells.py +15 -0
  91. aiagents4pharma/talk2cells/tests/scp_agent/test_scp_agent.py +22 -0
  92. aiagents4pharma/talk2cells/tools/__init__.py +6 -0
  93. aiagents4pharma/talk2cells/tools/scp_agent/__init__.py +6 -0
  94. aiagents4pharma/talk2cells/tools/scp_agent/display_studies.py +27 -0
  95. aiagents4pharma/talk2cells/tools/scp_agent/search_studies.py +78 -0
  96. aiagents4pharma/talk2knowledgegraphs/.dockerignore +13 -0
  97. aiagents4pharma/talk2knowledgegraphs/Dockerfile +131 -0
  98. aiagents4pharma/talk2knowledgegraphs/README.md +1 -0
  99. aiagents4pharma/talk2knowledgegraphs/__init__.py +5 -0
  100. aiagents4pharma/talk2knowledgegraphs/agents/__init__.py +5 -0
  101. aiagents4pharma/talk2knowledgegraphs/agents/t2kg_agent.py +99 -0
  102. aiagents4pharma/talk2knowledgegraphs/configs/__init__.py +5 -0
  103. aiagents4pharma/talk2knowledgegraphs/configs/agents/t2kg_agent/__init__.py +3 -0
  104. aiagents4pharma/talk2knowledgegraphs/configs/agents/t2kg_agent/default.yaml +62 -0
  105. aiagents4pharma/talk2knowledgegraphs/configs/app/__init__.py +5 -0
  106. aiagents4pharma/talk2knowledgegraphs/configs/app/frontend/__init__.py +3 -0
  107. aiagents4pharma/talk2knowledgegraphs/configs/app/frontend/default.yaml +79 -0
  108. aiagents4pharma/talk2knowledgegraphs/configs/config.yaml +13 -0
  109. aiagents4pharma/talk2knowledgegraphs/configs/tools/__init__.py +5 -0
  110. aiagents4pharma/talk2knowledgegraphs/configs/tools/graphrag_reasoning/__init__.py +3 -0
  111. aiagents4pharma/talk2knowledgegraphs/configs/tools/graphrag_reasoning/default.yaml +24 -0
  112. aiagents4pharma/talk2knowledgegraphs/configs/tools/multimodal_subgraph_extraction/__init__.py +0 -0
  113. aiagents4pharma/talk2knowledgegraphs/configs/tools/multimodal_subgraph_extraction/default.yaml +33 -0
  114. aiagents4pharma/talk2knowledgegraphs/configs/tools/subgraph_extraction/__init__.py +3 -0
  115. aiagents4pharma/talk2knowledgegraphs/configs/tools/subgraph_extraction/default.yaml +43 -0
  116. aiagents4pharma/talk2knowledgegraphs/configs/tools/subgraph_summarization/__init__.py +3 -0
  117. aiagents4pharma/talk2knowledgegraphs/configs/tools/subgraph_summarization/default.yaml +9 -0
  118. aiagents4pharma/talk2knowledgegraphs/configs/utils/database/milvus/__init__.py +3 -0
  119. aiagents4pharma/talk2knowledgegraphs/configs/utils/database/milvus/default.yaml +61 -0
  120. aiagents4pharma/talk2knowledgegraphs/configs/utils/enrichments/ols_terms/default.yaml +3 -0
  121. aiagents4pharma/talk2knowledgegraphs/configs/utils/enrichments/reactome_pathways/default.yaml +3 -0
  122. aiagents4pharma/talk2knowledgegraphs/configs/utils/enrichments/uniprot_proteins/default.yaml +6 -0
  123. aiagents4pharma/talk2knowledgegraphs/configs/utils/pubchem_utils/default.yaml +5 -0
  124. aiagents4pharma/talk2knowledgegraphs/datasets/__init__.py +5 -0
  125. aiagents4pharma/talk2knowledgegraphs/datasets/biobridge_primekg.py +607 -0
  126. aiagents4pharma/talk2knowledgegraphs/datasets/dataset.py +25 -0
  127. aiagents4pharma/talk2knowledgegraphs/datasets/primekg.py +212 -0
  128. aiagents4pharma/talk2knowledgegraphs/datasets/starkqa_primekg.py +210 -0
  129. aiagents4pharma/talk2knowledgegraphs/docker-compose/cpu/.env.example +23 -0
  130. aiagents4pharma/talk2knowledgegraphs/docker-compose/cpu/docker-compose.yml +93 -0
  131. aiagents4pharma/talk2knowledgegraphs/docker-compose/gpu/.env.example +23 -0
  132. aiagents4pharma/talk2knowledgegraphs/docker-compose/gpu/docker-compose.yml +108 -0
  133. aiagents4pharma/talk2knowledgegraphs/entrypoint.sh +180 -0
  134. aiagents4pharma/talk2knowledgegraphs/install.md +165 -0
  135. aiagents4pharma/talk2knowledgegraphs/milvus_data_dump.py +886 -0
  136. aiagents4pharma/talk2knowledgegraphs/states/__init__.py +5 -0
  137. aiagents4pharma/talk2knowledgegraphs/states/state_talk2knowledgegraphs.py +40 -0
  138. aiagents4pharma/talk2knowledgegraphs/tests/__init__.py +0 -0
  139. aiagents4pharma/talk2knowledgegraphs/tests/test_agents_t2kg_agent.py +318 -0
  140. aiagents4pharma/talk2knowledgegraphs/tests/test_datasets_biobridge_primekg.py +248 -0
  141. aiagents4pharma/talk2knowledgegraphs/tests/test_datasets_dataset.py +33 -0
  142. aiagents4pharma/talk2knowledgegraphs/tests/test_datasets_primekg.py +86 -0
  143. aiagents4pharma/talk2knowledgegraphs/tests/test_datasets_starkqa_primekg.py +125 -0
  144. aiagents4pharma/talk2knowledgegraphs/tests/test_tools_graphrag_reasoning.py +257 -0
  145. aiagents4pharma/talk2knowledgegraphs/tests/test_tools_milvus_multimodal_subgraph_extraction.py +1444 -0
  146. aiagents4pharma/talk2knowledgegraphs/tests/test_tools_multimodal_subgraph_extraction.py +159 -0
  147. aiagents4pharma/talk2knowledgegraphs/tests/test_tools_subgraph_extraction.py +152 -0
  148. aiagents4pharma/talk2knowledgegraphs/tests/test_tools_subgraph_summarization.py +201 -0
  149. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_database_milvus_connection_manager.py +812 -0
  150. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_embeddings_embeddings.py +51 -0
  151. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_embeddings_huggingface.py +49 -0
  152. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_embeddings_nim_molmim.py +59 -0
  153. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_embeddings_ollama.py +63 -0
  154. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_embeddings_sentencetransformer.py +47 -0
  155. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_enrichments.py +40 -0
  156. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_ollama.py +94 -0
  157. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_ols.py +70 -0
  158. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_pubchem.py +45 -0
  159. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_reactome.py +44 -0
  160. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_uniprot.py +48 -0
  161. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_extractions_milvus_multimodal_pcst.py +759 -0
  162. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_kg_utils.py +78 -0
  163. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_pubchem_utils.py +123 -0
  164. aiagents4pharma/talk2knowledgegraphs/tools/__init__.py +11 -0
  165. aiagents4pharma/talk2knowledgegraphs/tools/graphrag_reasoning.py +138 -0
  166. aiagents4pharma/talk2knowledgegraphs/tools/load_arguments.py +22 -0
  167. aiagents4pharma/talk2knowledgegraphs/tools/milvus_multimodal_subgraph_extraction.py +965 -0
  168. aiagents4pharma/talk2knowledgegraphs/tools/multimodal_subgraph_extraction.py +374 -0
  169. aiagents4pharma/talk2knowledgegraphs/tools/subgraph_extraction.py +291 -0
  170. aiagents4pharma/talk2knowledgegraphs/tools/subgraph_summarization.py +123 -0
  171. aiagents4pharma/talk2knowledgegraphs/utils/__init__.py +5 -0
  172. aiagents4pharma/talk2knowledgegraphs/utils/database/__init__.py +5 -0
  173. aiagents4pharma/talk2knowledgegraphs/utils/database/milvus_connection_manager.py +586 -0
  174. aiagents4pharma/talk2knowledgegraphs/utils/embeddings/__init__.py +5 -0
  175. aiagents4pharma/talk2knowledgegraphs/utils/embeddings/embeddings.py +81 -0
  176. aiagents4pharma/talk2knowledgegraphs/utils/embeddings/huggingface.py +111 -0
  177. aiagents4pharma/talk2knowledgegraphs/utils/embeddings/nim_molmim.py +54 -0
  178. aiagents4pharma/talk2knowledgegraphs/utils/embeddings/ollama.py +87 -0
  179. aiagents4pharma/talk2knowledgegraphs/utils/embeddings/sentence_transformer.py +73 -0
  180. aiagents4pharma/talk2knowledgegraphs/utils/enrichments/__init__.py +12 -0
  181. aiagents4pharma/talk2knowledgegraphs/utils/enrichments/enrichments.py +37 -0
  182. aiagents4pharma/talk2knowledgegraphs/utils/enrichments/ollama.py +129 -0
  183. aiagents4pharma/talk2knowledgegraphs/utils/enrichments/ols_terms.py +89 -0
  184. aiagents4pharma/talk2knowledgegraphs/utils/enrichments/pubchem_strings.py +78 -0
  185. aiagents4pharma/talk2knowledgegraphs/utils/enrichments/reactome_pathways.py +71 -0
  186. aiagents4pharma/talk2knowledgegraphs/utils/enrichments/uniprot_proteins.py +98 -0
  187. aiagents4pharma/talk2knowledgegraphs/utils/extractions/__init__.py +5 -0
  188. aiagents4pharma/talk2knowledgegraphs/utils/extractions/milvus_multimodal_pcst.py +762 -0
  189. aiagents4pharma/talk2knowledgegraphs/utils/extractions/multimodal_pcst.py +298 -0
  190. aiagents4pharma/talk2knowledgegraphs/utils/extractions/pcst.py +229 -0
  191. aiagents4pharma/talk2knowledgegraphs/utils/kg_utils.py +67 -0
  192. aiagents4pharma/talk2knowledgegraphs/utils/pubchem_utils.py +104 -0
  193. aiagents4pharma/talk2scholars/.dockerignore +13 -0
  194. aiagents4pharma/talk2scholars/Dockerfile +104 -0
  195. aiagents4pharma/talk2scholars/README.md +1 -0
  196. aiagents4pharma/talk2scholars/__init__.py +7 -0
  197. aiagents4pharma/talk2scholars/agents/__init__.py +13 -0
  198. aiagents4pharma/talk2scholars/agents/main_agent.py +89 -0
  199. aiagents4pharma/talk2scholars/agents/paper_download_agent.py +96 -0
  200. aiagents4pharma/talk2scholars/agents/pdf_agent.py +101 -0
  201. aiagents4pharma/talk2scholars/agents/s2_agent.py +135 -0
  202. aiagents4pharma/talk2scholars/agents/zotero_agent.py +127 -0
  203. aiagents4pharma/talk2scholars/configs/__init__.py +7 -0
  204. aiagents4pharma/talk2scholars/configs/agents/__init__.py +7 -0
  205. aiagents4pharma/talk2scholars/configs/agents/talk2scholars/__init__.py +7 -0
  206. aiagents4pharma/talk2scholars/configs/agents/talk2scholars/main_agent/__init__.py +3 -0
  207. aiagents4pharma/talk2scholars/configs/agents/talk2scholars/main_agent/default.yaml +52 -0
  208. aiagents4pharma/talk2scholars/configs/agents/talk2scholars/paper_download_agent/__init__.py +3 -0
  209. aiagents4pharma/talk2scholars/configs/agents/talk2scholars/paper_download_agent/default.yaml +19 -0
  210. aiagents4pharma/talk2scholars/configs/agents/talk2scholars/pdf_agent/__init__.py +3 -0
  211. aiagents4pharma/talk2scholars/configs/agents/talk2scholars/pdf_agent/default.yaml +19 -0
  212. aiagents4pharma/talk2scholars/configs/agents/talk2scholars/s2_agent/__init__.py +3 -0
  213. aiagents4pharma/talk2scholars/configs/agents/talk2scholars/s2_agent/default.yaml +44 -0
  214. aiagents4pharma/talk2scholars/configs/agents/talk2scholars/zotero_agent/__init__.py +3 -0
  215. aiagents4pharma/talk2scholars/configs/agents/talk2scholars/zotero_agent/default.yaml +19 -0
  216. aiagents4pharma/talk2scholars/configs/app/__init__.py +7 -0
  217. aiagents4pharma/talk2scholars/configs/app/frontend/__init__.py +3 -0
  218. aiagents4pharma/talk2scholars/configs/app/frontend/default.yaml +72 -0
  219. aiagents4pharma/talk2scholars/configs/config.yaml +16 -0
  220. aiagents4pharma/talk2scholars/configs/tools/__init__.py +21 -0
  221. aiagents4pharma/talk2scholars/configs/tools/multi_paper_recommendation/__init__.py +3 -0
  222. aiagents4pharma/talk2scholars/configs/tools/multi_paper_recommendation/default.yaml +26 -0
  223. aiagents4pharma/talk2scholars/configs/tools/paper_download/__init__.py +3 -0
  224. aiagents4pharma/talk2scholars/configs/tools/paper_download/default.yaml +124 -0
  225. aiagents4pharma/talk2scholars/configs/tools/question_and_answer/__init__.py +3 -0
  226. aiagents4pharma/talk2scholars/configs/tools/question_and_answer/default.yaml +62 -0
  227. aiagents4pharma/talk2scholars/configs/tools/retrieve_semantic_scholar_paper_id/__init__.py +3 -0
  228. aiagents4pharma/talk2scholars/configs/tools/retrieve_semantic_scholar_paper_id/default.yaml +12 -0
  229. aiagents4pharma/talk2scholars/configs/tools/search/__init__.py +3 -0
  230. aiagents4pharma/talk2scholars/configs/tools/search/default.yaml +26 -0
  231. aiagents4pharma/talk2scholars/configs/tools/single_paper_recommendation/__init__.py +3 -0
  232. aiagents4pharma/talk2scholars/configs/tools/single_paper_recommendation/default.yaml +26 -0
  233. aiagents4pharma/talk2scholars/configs/tools/zotero_read/__init__.py +3 -0
  234. aiagents4pharma/talk2scholars/configs/tools/zotero_read/default.yaml +57 -0
  235. aiagents4pharma/talk2scholars/configs/tools/zotero_write/__inti__.py +3 -0
  236. aiagents4pharma/talk2scholars/configs/tools/zotero_write/default.yaml +55 -0
  237. aiagents4pharma/talk2scholars/docker-compose/cpu/.env.example +21 -0
  238. aiagents4pharma/talk2scholars/docker-compose/cpu/docker-compose.yml +90 -0
  239. aiagents4pharma/talk2scholars/docker-compose/gpu/.env.example +21 -0
  240. aiagents4pharma/talk2scholars/docker-compose/gpu/docker-compose.yml +105 -0
  241. aiagents4pharma/talk2scholars/install.md +122 -0
  242. aiagents4pharma/talk2scholars/state/__init__.py +7 -0
  243. aiagents4pharma/talk2scholars/state/state_talk2scholars.py +98 -0
  244. aiagents4pharma/talk2scholars/tests/__init__.py +3 -0
  245. aiagents4pharma/talk2scholars/tests/test_agents_main_agent.py +256 -0
  246. aiagents4pharma/talk2scholars/tests/test_agents_paper_agents_download_agent.py +139 -0
  247. aiagents4pharma/talk2scholars/tests/test_agents_pdf_agent.py +114 -0
  248. aiagents4pharma/talk2scholars/tests/test_agents_s2_agent.py +198 -0
  249. aiagents4pharma/talk2scholars/tests/test_agents_zotero_agent.py +160 -0
  250. aiagents4pharma/talk2scholars/tests/test_s2_tools_display_dataframe.py +91 -0
  251. aiagents4pharma/talk2scholars/tests/test_s2_tools_query_dataframe.py +191 -0
  252. aiagents4pharma/talk2scholars/tests/test_states_state.py +38 -0
  253. aiagents4pharma/talk2scholars/tests/test_tools_paper_downloader.py +507 -0
  254. aiagents4pharma/talk2scholars/tests/test_tools_question_and_answer_tool.py +105 -0
  255. aiagents4pharma/talk2scholars/tests/test_tools_s2_multi.py +307 -0
  256. aiagents4pharma/talk2scholars/tests/test_tools_s2_retrieve.py +67 -0
  257. aiagents4pharma/talk2scholars/tests/test_tools_s2_search.py +286 -0
  258. aiagents4pharma/talk2scholars/tests/test_tools_s2_single.py +298 -0
  259. aiagents4pharma/talk2scholars/tests/test_utils_arxiv_downloader.py +469 -0
  260. aiagents4pharma/talk2scholars/tests/test_utils_base_paper_downloader.py +598 -0
  261. aiagents4pharma/talk2scholars/tests/test_utils_biorxiv_downloader.py +669 -0
  262. aiagents4pharma/talk2scholars/tests/test_utils_medrxiv_downloader.py +500 -0
  263. aiagents4pharma/talk2scholars/tests/test_utils_nvidia_nim_reranker.py +117 -0
  264. aiagents4pharma/talk2scholars/tests/test_utils_pdf_answer_formatter.py +67 -0
  265. aiagents4pharma/talk2scholars/tests/test_utils_pdf_batch_processor.py +92 -0
  266. aiagents4pharma/talk2scholars/tests/test_utils_pdf_collection_manager.py +173 -0
  267. aiagents4pharma/talk2scholars/tests/test_utils_pdf_document_processor.py +68 -0
  268. aiagents4pharma/talk2scholars/tests/test_utils_pdf_generate_answer.py +72 -0
  269. aiagents4pharma/talk2scholars/tests/test_utils_pdf_gpu_detection.py +129 -0
  270. aiagents4pharma/talk2scholars/tests/test_utils_pdf_paper_loader.py +116 -0
  271. aiagents4pharma/talk2scholars/tests/test_utils_pdf_rag_pipeline.py +88 -0
  272. aiagents4pharma/talk2scholars/tests/test_utils_pdf_retrieve_chunks.py +190 -0
  273. aiagents4pharma/talk2scholars/tests/test_utils_pdf_singleton_manager.py +159 -0
  274. aiagents4pharma/talk2scholars/tests/test_utils_pdf_vector_normalization.py +121 -0
  275. aiagents4pharma/talk2scholars/tests/test_utils_pdf_vector_store.py +406 -0
  276. aiagents4pharma/talk2scholars/tests/test_utils_pubmed_downloader.py +1007 -0
  277. aiagents4pharma/talk2scholars/tests/test_utils_read_helper_utils.py +106 -0
  278. aiagents4pharma/talk2scholars/tests/test_utils_s2_utils_ext_ids.py +403 -0
  279. aiagents4pharma/talk2scholars/tests/test_utils_tool_helper_utils.py +85 -0
  280. aiagents4pharma/talk2scholars/tests/test_utils_zotero_human_in_the_loop.py +266 -0
  281. aiagents4pharma/talk2scholars/tests/test_utils_zotero_path.py +496 -0
  282. aiagents4pharma/talk2scholars/tests/test_utils_zotero_pdf_downloader_utils.py +46 -0
  283. aiagents4pharma/talk2scholars/tests/test_utils_zotero_read.py +743 -0
  284. aiagents4pharma/talk2scholars/tests/test_utils_zotero_write.py +151 -0
  285. aiagents4pharma/talk2scholars/tools/__init__.py +9 -0
  286. aiagents4pharma/talk2scholars/tools/paper_download/__init__.py +12 -0
  287. aiagents4pharma/talk2scholars/tools/paper_download/paper_downloader.py +442 -0
  288. aiagents4pharma/talk2scholars/tools/paper_download/utils/__init__.py +22 -0
  289. aiagents4pharma/talk2scholars/tools/paper_download/utils/arxiv_downloader.py +207 -0
  290. aiagents4pharma/talk2scholars/tools/paper_download/utils/base_paper_downloader.py +336 -0
  291. aiagents4pharma/talk2scholars/tools/paper_download/utils/biorxiv_downloader.py +313 -0
  292. aiagents4pharma/talk2scholars/tools/paper_download/utils/medrxiv_downloader.py +196 -0
  293. aiagents4pharma/talk2scholars/tools/paper_download/utils/pubmed_downloader.py +323 -0
  294. aiagents4pharma/talk2scholars/tools/pdf/__init__.py +7 -0
  295. aiagents4pharma/talk2scholars/tools/pdf/question_and_answer.py +170 -0
  296. aiagents4pharma/talk2scholars/tools/pdf/utils/__init__.py +37 -0
  297. aiagents4pharma/talk2scholars/tools/pdf/utils/answer_formatter.py +62 -0
  298. aiagents4pharma/talk2scholars/tools/pdf/utils/batch_processor.py +198 -0
  299. aiagents4pharma/talk2scholars/tools/pdf/utils/collection_manager.py +172 -0
  300. aiagents4pharma/talk2scholars/tools/pdf/utils/document_processor.py +76 -0
  301. aiagents4pharma/talk2scholars/tools/pdf/utils/generate_answer.py +97 -0
  302. aiagents4pharma/talk2scholars/tools/pdf/utils/get_vectorstore.py +59 -0
  303. aiagents4pharma/talk2scholars/tools/pdf/utils/gpu_detection.py +150 -0
  304. aiagents4pharma/talk2scholars/tools/pdf/utils/nvidia_nim_reranker.py +97 -0
  305. aiagents4pharma/talk2scholars/tools/pdf/utils/paper_loader.py +123 -0
  306. aiagents4pharma/talk2scholars/tools/pdf/utils/rag_pipeline.py +113 -0
  307. aiagents4pharma/talk2scholars/tools/pdf/utils/retrieve_chunks.py +197 -0
  308. aiagents4pharma/talk2scholars/tools/pdf/utils/singleton_manager.py +140 -0
  309. aiagents4pharma/talk2scholars/tools/pdf/utils/tool_helper.py +86 -0
  310. aiagents4pharma/talk2scholars/tools/pdf/utils/vector_normalization.py +150 -0
  311. aiagents4pharma/talk2scholars/tools/pdf/utils/vector_store.py +327 -0
  312. aiagents4pharma/talk2scholars/tools/s2/__init__.py +21 -0
  313. aiagents4pharma/talk2scholars/tools/s2/display_dataframe.py +110 -0
  314. aiagents4pharma/talk2scholars/tools/s2/multi_paper_rec.py +111 -0
  315. aiagents4pharma/talk2scholars/tools/s2/query_dataframe.py +233 -0
  316. aiagents4pharma/talk2scholars/tools/s2/retrieve_semantic_scholar_paper_id.py +128 -0
  317. aiagents4pharma/talk2scholars/tools/s2/search.py +101 -0
  318. aiagents4pharma/talk2scholars/tools/s2/single_paper_rec.py +102 -0
  319. aiagents4pharma/talk2scholars/tools/s2/utils/__init__.py +5 -0
  320. aiagents4pharma/talk2scholars/tools/s2/utils/multi_helper.py +223 -0
  321. aiagents4pharma/talk2scholars/tools/s2/utils/search_helper.py +205 -0
  322. aiagents4pharma/talk2scholars/tools/s2/utils/single_helper.py +216 -0
  323. aiagents4pharma/talk2scholars/tools/zotero/__init__.py +7 -0
  324. aiagents4pharma/talk2scholars/tools/zotero/utils/__init__.py +7 -0
  325. aiagents4pharma/talk2scholars/tools/zotero/utils/read_helper.py +270 -0
  326. aiagents4pharma/talk2scholars/tools/zotero/utils/review_helper.py +74 -0
  327. aiagents4pharma/talk2scholars/tools/zotero/utils/write_helper.py +194 -0
  328. aiagents4pharma/talk2scholars/tools/zotero/utils/zotero_path.py +180 -0
  329. aiagents4pharma/talk2scholars/tools/zotero/utils/zotero_pdf_downloader.py +133 -0
  330. aiagents4pharma/talk2scholars/tools/zotero/zotero_read.py +105 -0
  331. aiagents4pharma/talk2scholars/tools/zotero/zotero_review.py +162 -0
  332. aiagents4pharma/talk2scholars/tools/zotero/zotero_write.py +91 -0
  333. aiagents4pharma-0.0.0.dist-info/METADATA +335 -0
  334. aiagents4pharma-0.0.0.dist-info/RECORD +336 -0
  335. aiagents4pharma-0.0.0.dist-info/WHEEL +4 -0
  336. aiagents4pharma-0.0.0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,96 @@
1
+ #!/usr/bin/env python3
2
+
3
+ """
4
+ Tool for searching models based on search query.
5
+ """
6
+
7
+ import logging
8
+ from typing import Annotated
9
+
10
+ import pandas as pd
11
+ from basico import biomodels
12
+ from langchain_core.messages import ToolMessage
13
+ from langchain_core.tools import BaseTool
14
+ from langchain_core.tools.base import InjectedToolCallId
15
+ from langgraph.types import Command
16
+ from pydantic import BaseModel, Field
17
+
18
+ # Initialize logger
19
+ logging.basicConfig(level=logging.INFO)
20
+ logger = logging.getLogger(__name__)
21
+
22
+
23
+ class SearchModelsInput(BaseModel):
24
+ """
25
+ Input schema for the search models tool.
26
+ """
27
+
28
+ query: str = Field(description="Search models query", default=None)
29
+ num_query: int = Field(description="Top number of models to search", default=10, le=100)
30
+ tool_call_id: Annotated[str, InjectedToolCallId]
31
+
32
+
33
+ # Note: It's important that every field has type hints. BaseTool is a
34
+ # Pydantic class and not having type hints can lead to unexpected behavior.
35
+ class SearchModelsTool(BaseTool):
36
+ """
37
+ Tool for returning the search results based on the search query.
38
+ """
39
+
40
+ name: str = "search_models"
41
+ description: str = "Search for only manually curated models in "
42
+ "the BioMmodels database based on keywords."
43
+ args_schema: type[BaseModel] = SearchModelsInput
44
+ return_direct: bool = False
45
+
46
+ def _run(
47
+ self,
48
+ tool_call_id: Annotated[str, InjectedToolCallId],
49
+ query: str = None,
50
+ num_query: int = 10,
51
+ ) -> dict:
52
+ """
53
+ Run the tool.
54
+
55
+ Args:
56
+ query (str): The search query.
57
+ num_query (int): The number of models to search.
58
+ tool_call_id (str): The tool call ID.
59
+
60
+ Returns:
61
+ dict: The answer to the question in the form of a dictionary.
62
+ """
63
+ logger.log(
64
+ logging.INFO,
65
+ "Searching models with the query and number %s, %s",
66
+ query,
67
+ num_query,
68
+ )
69
+ # Search for models based on the query
70
+ search_results = biomodels.search_for_model(query, num_results=num_query)
71
+ # Convert the search results to a pandas DataFrame
72
+ df = pd.DataFrame(search_results)
73
+ # Prepare a message to return
74
+ first_n = min(3, len(search_results))
75
+ content = f"Found {len(search_results)} manually curated models"
76
+ content += f" for the query: {query}."
77
+ # Pass the first 3 models to the LLM
78
+ # to avoid hallucinations
79
+ content += f" Here is the summary of the first {first_n} models:"
80
+ for i in range(first_n):
81
+ content += (
82
+ f"\nModel {i + 1}: {search_results[i]['name']} (ID: {search_results[i]['id']})"
83
+ )
84
+ # Return the updated state of the tool
85
+ return Command(
86
+ update={
87
+ # update the message history
88
+ "messages": [
89
+ ToolMessage(
90
+ content=content,
91
+ tool_call_id=tool_call_id,
92
+ artifact={"dic_data": df.to_dict(orient="records")},
93
+ )
94
+ ],
95
+ }
96
+ )
@@ -0,0 +1,137 @@
1
+ #!/usr/bin/env python3
2
+
3
+ """
4
+ Tool for simulating a model.
5
+ """
6
+
7
+ import logging
8
+ from typing import Annotated
9
+
10
+ import basico
11
+ from langchain_core.messages import ToolMessage
12
+ from langchain_core.tools import BaseTool
13
+ from langchain_core.tools.base import InjectedToolCallId
14
+ from langgraph.prebuilt import InjectedState
15
+ from langgraph.types import Command
16
+ from pydantic import BaseModel, Field
17
+
18
+ from .load_arguments import ArgumentData, add_rec_events
19
+ from .load_biomodel import ModelData, load_biomodel
20
+ from .utils import get_model_units
21
+
22
+ # Initialize logger
23
+ logging.basicConfig(level=logging.INFO)
24
+ logger = logging.getLogger(__name__)
25
+
26
+
27
+ class SimulateModelInput(BaseModel):
28
+ """
29
+ Input schema for the SimulateModel tool.
30
+ """
31
+
32
+ sys_bio_model: ModelData = Field(description="model data", default=None)
33
+ arg_data: ArgumentData = Field(
34
+ description="""time, species, and reocurring data
35
+ as well as the simulation name""",
36
+ default=None,
37
+ )
38
+ tool_call_id: Annotated[str, InjectedToolCallId]
39
+ state: Annotated[dict, InjectedState]
40
+
41
+
42
+ # Note: It's important that every field has type hints. BaseTool is a
43
+ # Pydantic class and not having type hints can lead to unexpected behavior.
44
+ class SimulateModelTool(BaseTool):
45
+ """
46
+ Tool for simulating a model.
47
+ """
48
+
49
+ name: str = "simulate_model"
50
+ description: str = "A tool to simulate a biomodel"
51
+ args_schema: type[BaseModel] = SimulateModelInput
52
+
53
+ def _run(
54
+ self,
55
+ tool_call_id: Annotated[str, InjectedToolCallId],
56
+ state: Annotated[dict, InjectedState],
57
+ sys_bio_model: ModelData = None,
58
+ arg_data: ArgumentData = None,
59
+ ) -> Command:
60
+ """
61
+ Run the tool.
62
+
63
+ Args:
64
+ tool_call_id (str): The tool call ID. This is injected by the system.
65
+ state (dict): The state of the tool.
66
+ sys_bio_model (ModelData): The model data.
67
+ arg_data (ArgumentData): The argument data.
68
+
69
+ Returns:
70
+ str: The result of the simulation.
71
+ """
72
+ logger.log(logging.INFO, "Calling simulate_model tool %s, %s", sys_bio_model, arg_data)
73
+ sbml_file_path = state["sbml_file_path"][-1] if len(state["sbml_file_path"]) > 0 else None
74
+ model_object = load_biomodel(sys_bio_model, sbml_file_path=sbml_file_path)
75
+ # Prepare the dictionary of species data
76
+ # that will be passed to the simulate method
77
+ # of the BasicoModel class
78
+ duration = 100.0
79
+ interval = 10
80
+ dic_species_to_be_analyzed_before_experiment = {}
81
+ if arg_data:
82
+ # Prepare the dictionary of species data
83
+ if arg_data.species_to_be_analyzed_before_experiment is not None:
84
+ dic_species_to_be_analyzed_before_experiment = dict(
85
+ zip(
86
+ arg_data.species_to_be_analyzed_before_experiment.species_name,
87
+ arg_data.species_to_be_analyzed_before_experiment.species_concentration,
88
+ strict=False,
89
+ )
90
+ )
91
+ # Add reocurring events (if any) to the model
92
+ if arg_data.reocurring_data is not None:
93
+ add_rec_events(model_object, arg_data.reocurring_data)
94
+ # Set the duration and interval
95
+ if arg_data.time_data is not None:
96
+ duration = arg_data.time_data.duration
97
+ interval = arg_data.time_data.interval
98
+ # Update the model parameters
99
+ model_object.update_parameters(dic_species_to_be_analyzed_before_experiment)
100
+ logger.log(
101
+ logging.INFO,
102
+ "Following species/parameters updated in the model %s",
103
+ dic_species_to_be_analyzed_before_experiment,
104
+ )
105
+ # Simulate the model
106
+ df = model_object.simulate(duration=duration, interval=interval)
107
+ logger.log(logging.INFO, "Simulation results ready with shape %s", df.shape)
108
+ dic_simulated_data = {
109
+ "name": arg_data.experiment_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.to_dict(),
113
+ }
114
+ # Prepare the dictionary of updated state
115
+ dic_updated_state_for_model = {}
116
+ for key, value in {
117
+ "model_id": [sys_bio_model.biomodel_id],
118
+ "sbml_file_path": [sbml_file_path],
119
+ "dic_simulated_data": [dic_simulated_data],
120
+ "model_as_string": [basico.model_io.save_model_to_string()],
121
+ }.items():
122
+ if value:
123
+ dic_updated_state_for_model[key] = value
124
+ # Return the updated state of the tool
125
+ return Command(
126
+ update=dic_updated_state_for_model
127
+ | {
128
+ # update the message history
129
+ "messages": [
130
+ ToolMessage(
131
+ content=f"Simulation results of {arg_data.experiment_name}",
132
+ tool_call_id=tool_call_id,
133
+ artifact=get_model_units(model_object),
134
+ )
135
+ ],
136
+ }
137
+ )
@@ -0,0 +1,187 @@
1
+ #!/usr/bin/env python3
2
+
3
+ """
4
+ Tool for parameter scan.
5
+ """
6
+
7
+ import logging
8
+ from typing import Annotated
9
+
10
+ import basico
11
+ from langchain_core.messages import ToolMessage
12
+ from langchain_core.tools import BaseTool
13
+ from langchain_core.tools.base import InjectedToolCallId
14
+ from langgraph.prebuilt import InjectedState
15
+ from langgraph.types import Command
16
+ from pydantic import BaseModel, Field
17
+
18
+ from .load_arguments import ArgumentData, add_rec_events
19
+ from .load_biomodel import ModelData, load_biomodel
20
+
21
+ # Initialize logger
22
+ logging.basicConfig(level=logging.INFO)
23
+ logger = logging.getLogger(__name__)
24
+
25
+
26
+ def run_steady_state(model_object, dic_species_to_be_analyzed_before_experiment):
27
+ """
28
+ Run the steady state analysis.
29
+
30
+ Args:
31
+ model_object: The model object.
32
+ dic_species_to_be_analyzed_before_experiment: Dictionary of species data.
33
+
34
+ Returns:
35
+ DataFrame: The results of the steady state analysis.
36
+ """
37
+ # Update the fixed model species and parameters
38
+ # These are the initial conditions of the model
39
+ # set by the user
40
+ model_object.update_parameters(dic_species_to_be_analyzed_before_experiment)
41
+ logger.log(logging.INFO, "Running steady state analysis")
42
+ # Run the steady state analysis
43
+ output = basico.task_steadystate.run_steadystate(model=model_object.copasi_model)
44
+ if output == 0:
45
+ logger.error("Steady state analysis failed")
46
+ raise ValueError("A steady state was not found")
47
+ logger.log(logging.INFO, "Steady state analysis successful")
48
+ # Store the steady state results in a DataFrame
49
+ df_steady_state = basico.model_info.get_species(model=model_object.copasi_model).reset_index()
50
+ # print (df_steady_state)
51
+ # Rename the column name to species_name
52
+ df_steady_state.rename(columns={"name": "species_name"}, inplace=True)
53
+ # Rename the column concentration to steady_state_concentration
54
+ df_steady_state.rename(columns={"concentration": "steady_state_concentration"}, inplace=True)
55
+ # Rename the column transition_time to steady_state_transition_time
56
+ df_steady_state.rename(
57
+ columns={"transition_time": "steady_state_transition_time"}, inplace=True
58
+ )
59
+ # Drop some columns
60
+ df_steady_state.drop(
61
+ columns=[
62
+ "initial_particle_number",
63
+ "initial_expression",
64
+ "expression",
65
+ "particle_number",
66
+ "type",
67
+ "particle_number_rate",
68
+ "key",
69
+ "sbml_id",
70
+ "display_name",
71
+ ],
72
+ inplace=True,
73
+ )
74
+ logger.log(logging.INFO, "Steady state results with shape %s", df_steady_state.shape)
75
+ return df_steady_state
76
+
77
+
78
+ class SteadyStateInput(BaseModel):
79
+ """
80
+ Input schema for the steady state tool.
81
+ """
82
+
83
+ sys_bio_model: ModelData = Field(description="model data", default=None)
84
+ arg_data: ArgumentData = Field(
85
+ description="time, species, and reocurring data"
86
+ " that must be set before the steady state analysis"
87
+ " as well as the experiment name",
88
+ default=None,
89
+ )
90
+ tool_call_id: Annotated[str, InjectedToolCallId]
91
+ state: Annotated[dict, InjectedState]
92
+
93
+
94
+ # Note: It's important that every field has type hints. BaseTool is a
95
+ # Pydantic class and not having type hints can lead to unexpected behavior.
96
+ class SteadyStateTool(BaseTool):
97
+ """
98
+ Tool to bring a model to steady state.
99
+ """
100
+
101
+ name: str = "steady_state"
102
+ description: str = "A tool to bring a model to steady state."
103
+ args_schema: type[BaseModel] = SteadyStateInput
104
+
105
+ def _run(
106
+ self,
107
+ tool_call_id: Annotated[str, InjectedToolCallId],
108
+ state: Annotated[dict, InjectedState],
109
+ sys_bio_model: ModelData = None,
110
+ arg_data: ArgumentData = None,
111
+ ) -> Command:
112
+ """
113
+ Run the tool.
114
+
115
+ Args:
116
+ tool_call_id (str): The tool call ID. This is injected by the system.
117
+ state (dict): The state of the tool.
118
+ sys_bio_model (ModelData): The model data.
119
+ arg_data (ArgumentData): The argument data.
120
+
121
+ Returns:
122
+ Command: The updated state of the tool.
123
+ """
124
+ logger.log(
125
+ logging.INFO,
126
+ "Calling the steady_state tool %s, %s",
127
+ sys_bio_model,
128
+ arg_data,
129
+ )
130
+ # print (f'Calling steady_state tool {sys_bio_model}, {arg_data}, {tool_call_id}')
131
+ sbml_file_path = state["sbml_file_path"][-1] if len(state["sbml_file_path"]) > 0 else None
132
+ model_object = load_biomodel(sys_bio_model, sbml_file_path=sbml_file_path)
133
+ # Prepare the dictionary of species data
134
+ # that will be passed to the simulate method
135
+ # of the BasicoModel class
136
+ dic_species_to_be_analyzed_before_experiment = {}
137
+ if arg_data:
138
+ # Prepare the dictionary of species data
139
+ if arg_data.species_to_be_analyzed_before_experiment is not None:
140
+ dic_species_to_be_analyzed_before_experiment = dict(
141
+ zip(
142
+ arg_data.species_to_be_analyzed_before_experiment.species_name,
143
+ arg_data.species_to_be_analyzed_before_experiment.species_concentration,
144
+ strict=False,
145
+ )
146
+ )
147
+ # Add reocurring events (if any) to the model
148
+ if arg_data.reocurring_data is not None:
149
+ add_rec_events(model_object, arg_data.reocurring_data)
150
+ # Run the parameter scan
151
+ df_steady_state = run_steady_state(
152
+ model_object, dic_species_to_be_analyzed_before_experiment
153
+ )
154
+ print(df_steady_state)
155
+ # Prepare the dictionary of scanned data
156
+ # that will be passed to the state of the graph
157
+ dic_steady_state_data = {
158
+ "name": arg_data.experiment_name,
159
+ "source": (sys_bio_model.biomodel_id if sys_bio_model.biomodel_id else "upload"),
160
+ "tool_call_id": tool_call_id,
161
+ "data": df_steady_state.to_dict(orient="records"),
162
+ }
163
+ # Prepare the dictionary of updated state for the model
164
+ dic_updated_state_for_model = {}
165
+ for key, value in {
166
+ "model_id": [sys_bio_model.biomodel_id],
167
+ "sbml_file_path": [sbml_file_path],
168
+ "dic_steady_state_data": [dic_steady_state_data],
169
+ }.items():
170
+ if value:
171
+ dic_updated_state_for_model[key] = value
172
+ # Return the updated state
173
+ return Command(
174
+ update=dic_updated_state_for_model
175
+ | {
176
+ # Update the message history
177
+ "messages": [
178
+ ToolMessage(
179
+ content=f"Steady state analysis of"
180
+ f" {arg_data.experiment_name}"
181
+ " was successful.",
182
+ tool_call_id=tool_call_id,
183
+ artifact={"dic_data": df_steady_state.to_dict(orient="records")},
184
+ )
185
+ ],
186
+ }
187
+ )
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env python3
2
+
3
+ """
4
+ Utility functions for T2B tools.
5
+ """
6
+
7
+ import basico
8
+
9
+
10
+ def get_model_units(model_object):
11
+ """
12
+ Get the units of the model.
13
+
14
+ Args:
15
+ model_object: The model object.
16
+
17
+ Returns:
18
+ dict: The units of the model.
19
+ """
20
+ model_units = basico.model_info.get_model_units(model=model_object.copasi_model)
21
+ model_units_y = model_units["quantity_unit"]
22
+ model_units_x = model_units["time_unit"]
23
+ return {"y_axis_label": model_units_y, "x_axis_label": model_units_x}
@@ -0,0 +1 @@
1
+ Please check out the README file in the root folder for more information.
@@ -0,0 +1,5 @@
1
+ """
2
+ This file is used to import the models and tools.
3
+ """
4
+
5
+ from . import agents, states, tools
@@ -0,0 +1,6 @@
1
+ """
2
+ This file is used to import all the modules in the package.
3
+ """
4
+
5
+ # import everything from the module
6
+ from . import scp_agent
@@ -0,0 +1,87 @@
1
+ # /usr/bin/env python3
2
+
3
+ """
4
+ This is the agent file for the Talk2Cells graph.
5
+ """
6
+
7
+ import logging
8
+ import os
9
+
10
+ from langchain_openai import ChatOpenAI
11
+ from langgraph.checkpoint.memory import MemorySaver
12
+ from langgraph.graph import START, StateGraph
13
+ from langgraph.prebuilt import ToolNode, create_react_agent
14
+
15
+ from ..states.state_talk2cells import Talk2Cells
16
+ from ..tools.scp_agent.display_studies import display_studies
17
+ from ..tools.scp_agent.search_studies import search_studies
18
+
19
+ # Initialize logger
20
+ logging.basicConfig(level=logging.INFO)
21
+ logger = logging.getLogger(__name__)
22
+
23
+
24
+ def get_app(uniq_id):
25
+ """
26
+ This function returns the langraph app.
27
+ """
28
+
29
+ def agent_scp_node(state: Talk2Cells):
30
+ """
31
+ This function calls the model.
32
+ """
33
+ logger.log(logging.INFO, "Creating SCP_Agent node with thread_id %s", uniq_id)
34
+ # Get the messages from the state
35
+ # messages = state['messages']
36
+ # Call the model
37
+ # inputs = {'messages': messages}
38
+ response = model.invoke(state, {"configurable": {"thread_id": uniq_id}})
39
+ # The response is a list of messages and may contain `tool calls`
40
+ # We return a list, because this will get added to the existing list
41
+ # return {"messages": [response]}
42
+ return response
43
+
44
+ # Define the tools
45
+ # tools = [search_studies, display_studies]
46
+ tools = ToolNode([search_studies, display_studies])
47
+
48
+ # Create the LLM
49
+ # And bind the tools to it
50
+ # model = ChatOpenAI(model="gpt-4o-mini", temperature=0).bind_tools(tools)
51
+
52
+ # Create an environment variable to store the LLM model
53
+ # Check if the environment variable AIAGENTS4PHARMA_LLM_MODEL is set
54
+ # If not, set it to 'gpt-4o-mini'
55
+ llm_model = os.getenv("AIAGENTS4PHARMA_LLM_MODEL", "gpt-4o-mini")
56
+ # print (f'LLM model: {llm_model}')
57
+ # llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
58
+ llm = ChatOpenAI(model=llm_model, temperature=0)
59
+ model = create_react_agent(
60
+ llm,
61
+ tools=tools,
62
+ state_schema=Talk2Cells,
63
+ state_modifier=("You are Talk2Cells agent."),
64
+ checkpointer=MemorySaver(),
65
+ )
66
+
67
+ # Define a new graph
68
+ workflow = StateGraph(Talk2Cells)
69
+
70
+ # Define the two nodes we will cycle between
71
+ workflow.add_node("agent_scp", agent_scp_node)
72
+
73
+ # Set the entrypoint as `agent`
74
+ # This means that this node is the first one called
75
+ workflow.add_edge(START, "agent_scp")
76
+
77
+ # Initialize memory to persist state between graph runs
78
+ checkpointer = MemorySaver()
79
+
80
+ # Finally, we compile it!
81
+ # This compiles it into a LangChain Runnable,
82
+ # meaning you can use it as you would any other runnable.
83
+ # Note that we're (optionally) passing the memory when compiling the graph
84
+ app = workflow.compile(checkpointer=checkpointer)
85
+ logger.log(logging.INFO, "Compiled the graph")
86
+
87
+ return app
@@ -0,0 +1,6 @@
1
+ """
2
+ This file is used to import all the modules in the package.
3
+ """
4
+
5
+ # import everything from the module
6
+ from . import state_talk2cells
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env python3
2
+
3
+ """
4
+ This is the state file for the Talk2Cells agent.
5
+ """
6
+
7
+ from langgraph.prebuilt.chat_agent_executor import AgentState
8
+
9
+
10
+ class Talk2Cells(AgentState):
11
+ """
12
+ The state for the Talk2Cells agent.
13
+ """
14
+
15
+ search_table: str
@@ -0,0 +1,22 @@
1
+ """
2
+ Test cases for the search_studies
3
+ """
4
+
5
+ # from ..tools.search_studies import search_studies
6
+ from langchain_core.messages import HumanMessage
7
+
8
+ from aiagents4pharma.talk2cells.agents.scp_agent import get_app
9
+
10
+
11
+ def test_agent_scp():
12
+ """
13
+ Test the agent_scp.
14
+ """
15
+ unique_id = 12345
16
+ app = get_app(unique_id)
17
+ config = {"configurable": {"thread_id": unique_id}}
18
+ prompt = "Search for studies on Crohns Disease."
19
+ response = app.invoke({"messages": [HumanMessage(content=prompt)]}, config=config)
20
+ assistant_msg = response["messages"][-1].content
21
+ # Check if the assistant message is a string
22
+ assert isinstance(assistant_msg, str)
@@ -0,0 +1,6 @@
1
+ """
2
+ This file is used to import all the modules in the package.
3
+ """
4
+
5
+ # import everything from the module
6
+ from . import scp_agent
@@ -0,0 +1,6 @@
1
+ """
2
+ This file is used to import all the modules in the package.
3
+ """
4
+
5
+ # import everything from the module
6
+ from . import display_studies, search_studies
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env python3
2
+
3
+ """
4
+ This tool is used to display the table of studies.
5
+ """
6
+
7
+ import logging
8
+ from typing import Annotated
9
+
10
+ from langchain_core.tools import tool
11
+ from langgraph.prebuilt import InjectedState
12
+
13
+ # Initialize logger
14
+ logging.basicConfig(level=logging.INFO)
15
+ logger = logging.getLogger(__name__)
16
+
17
+
18
+ @tool("display_studies")
19
+ def display_studies(state: Annotated[dict, InjectedState]):
20
+ """
21
+ Display the table of studies.
22
+
23
+ Args:
24
+ state (dict): The state of the agent.
25
+ """
26
+ logger.log(logging.INFO, "Calling the tool display_studies")
27
+ return state["search_table"]