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
@@ -5,22 +5,23 @@ Agent for interacting with Zotero with human-in-the-loop features
5
5
  """
6
6
 
7
7
  import logging
8
- from typing import Any, Dict
9
- import hydra
8
+ from typing import Any
10
9
 
10
+ import hydra
11
11
  from langchain_core.language_models.chat_models import BaseChatModel
12
- from langgraph.graph import START, StateGraph
13
- from langgraph.prebuilt import create_react_agent, ToolNode
14
12
  from langgraph.checkpoint.memory import MemorySaver
13
+ from langgraph.graph import START, StateGraph
14
+ from langgraph.prebuilt import ToolNode, create_react_agent
15
+
15
16
  from ..state.state_talk2scholars import Talk2Scholars
16
- from ..tools.zotero.zotero_read import zotero_read
17
- from ..tools.zotero.zotero_review import zotero_review
18
- from ..tools.zotero.zotero_write import zotero_write
19
17
  from ..tools.s2.display_dataframe import display_dataframe
20
18
  from ..tools.s2.query_dataframe import query_dataframe
21
19
  from ..tools.s2.retrieve_semantic_scholar_paper_id import (
22
20
  retrieve_semantic_scholar_paper_id,
23
21
  )
22
+ from ..tools.zotero.zotero_read import zotero_read
23
+ from ..tools.zotero.zotero_review import zotero_review
24
+ from ..tools.zotero.zotero_write import zotero_write
24
25
 
25
26
  # Initialize logger
26
27
  logging.basicConfig(level=logging.INFO)
@@ -49,7 +50,7 @@ def get_app(uniq_id, llm_model: BaseChatModel):
49
50
  >>> result = app.invoke(initial_state)
50
51
  """
51
52
 
52
- def zotero_agent_node(state: Talk2Scholars) -> Dict[str, Any]:
53
+ def zotero_agent_node(state: Talk2Scholars) -> dict[str, Any]:
53
54
  """
54
55
  Processes the user query and retrieves relevant research papers from Zotero.
55
56
 
@@ -68,9 +69,7 @@ def get_app(uniq_id, llm_model: BaseChatModel):
68
69
  >>> result = zotero_agent_node(current_state)
69
70
  >>> papers = result.get("papers", [])
70
71
  """
71
- logger.log(
72
- logging.INFO, "Creating Agent_Zotero node with thread_id %s", uniq_id
73
- )
72
+ logger.log(logging.INFO, "Creating Agent_Zotero node with thread_id %s", uniq_id)
74
73
  result = model.invoke(state, {"configurable": {"thread_id": uniq_id}})
75
74
 
76
75
  return result
@@ -2,8 +2,6 @@
2
2
  This package contains configuration settings and prompts used by various AI agents
3
3
  """
4
4
 
5
- from . import agents
6
- from . import tools
7
- from . import app
5
+ from . import agents, app, tools
8
6
 
9
7
  __all__ = ["agents", "tools", "app"]
@@ -2,9 +2,6 @@
2
2
  Import all the modules in the package
3
3
  """
4
4
 
5
- from . import s2_agent
6
- from . import main_agent
7
- from . import pdf_agent
8
- from . import zotero_agent
5
+ from . import main_agent, pdf_agent, s2_agent, zotero_agent
9
6
 
10
7
  __all__ = ["s2_agent", "main_agent", "pdf_agent", "zotero_agent"]
@@ -26,7 +26,7 @@ system_prompt: |
26
26
 
27
27
  **IMPORTANT – Q&A Disambiguation (Pause Before Acting):**
28
28
  - When the user asks a question like “Tell me more about X”, “What does the first article say?”, or similar:
29
- 1) **Pause and ask**:
29
+ 1) **Pause and ask**:
30
30
  “Do you want me to answer using the **PDF content** (full text), or using the **last displayed table** (metadata only)?”
31
31
  - Accept synonyms: *PDF, full text, paper text* → **PDF content**.
32
32
  - Accept synonyms: *last displayed table, table above, results table, search results* → **metadata/table**.
@@ -2,7 +2,7 @@ _target_: agents.pdf_agent.get_app
2
2
  pdf_agent: |
3
3
  You are the **PDF Agent**.
4
4
 
5
- **Primary Role:**
5
+ **Primary Role:**
6
6
  Perform question-and-answer tasks on the **full text** of papers, articles, or PDFs that are already available
7
7
  (downloaded locally, uploaded by the user, or stored in the user's Zotero library).
8
8
 
@@ -2,12 +2,12 @@ _target_: agents.s2_agent.get_app
2
2
  s2_agent: |
3
3
  You are the **S2 Agent**.
4
4
 
5
- **Primary Role:**
6
- - Search for academic papers.
7
- - Provide recommendations **only when explicitly requested** by the user.
5
+ **Primary Role:**
6
+ - Search for academic papers.
7
+ - Provide recommendations **only when explicitly requested** by the user.
8
8
  - Display results using the `display_dataframe` tool.
9
9
 
10
- **Additional Capability – Metadata Queries:**
10
+ **Additional Capability – Metadata Queries:**
11
11
  - You can query the last displayed results table using the `query_dataframe` tool to filter, sort, or extract metadata (including paper IDs).
12
12
  - Use this tool only for **metadata-level** questions (not full PDF content).
13
13
 
@@ -22,10 +22,10 @@ s2_agent: |
22
22
  END
23
23
  ---
24
24
  3) Do **not** call any other S2 tools (e.g., `retrieve_semantic_scholar_paper_id`, `get_single_paper_recommendations`, `get_multi_paper_recommendations`) in this mode.
25
- 4) If no last displayed table exists, reply:
26
- `IDS: NONE`
27
- `SOURCE: none (no results table available)`
28
- `END`
25
+ 4) If no last displayed table exists, reply:
26
+ `IDS: NONE`
27
+ `SOURCE: none (no results table available)`
28
+ `END`
29
29
  and stop.
30
30
 
31
31
  **Tool-Selection Policy (default mode):**
@@ -2,18 +2,18 @@ _target_: agents.zotero_agent.get_app
2
2
  zotero_agent: |
3
3
  You are the **Zotero Agent**.
4
4
 
5
- **Primary Role:**
6
- - Read from the user's Zotero library (list items, retrieve metadata, check existing entries).
7
- - Write to the user's Zotero library (save new papers, update existing records) — only with explicit user approval.
5
+ **Primary Role:**
6
+ - Read from the user's Zotero library (list items, retrieve metadata, check existing entries).
7
+ - Write to the user's Zotero library (save new papers, update existing records) — only with explicit user approval.
8
8
  - Display Zotero query results using "display_dataframe" tool.
9
9
 
10
- **Rules & Boundaries:**
10
+ **Rules & Boundaries:**
11
11
  - Never save papers to Zotero without **explicit human approval**. If approval is denied, do not retry unless the user changes their decision.
12
12
  - Do not search for papers on the web — that is the `s2_agent`’s role.
13
13
  - Do not perform PDF content analysis — that is the `pdf_agent`’s role.
14
14
  - Do not download PDFs directly — that is the `paper_download_agent`’s role.
15
15
 
16
- **Examples:**
17
- - “Show me all papers I saved last month.”
18
- - “Check if I already have this paper in Zotero.”
16
+ **Examples:**
17
+ - “Show me all papers I saved last month.”
18
+ - “Check if I already have this paper in Zotero.”
19
19
  - “Save this paper to Zotero” → Ask for explicit approval before saving.
@@ -2,12 +2,14 @@
2
2
  Import all the modules in the package
3
3
  """
4
4
 
5
- from . import search
6
- from . import single_paper_recommendation
7
- from . import multi_paper_recommendation
8
- from . import question_and_answer
9
- from . import zotero_read
10
- from . import zotero_write
5
+ from . import (
6
+ multi_paper_recommendation,
7
+ question_and_answer,
8
+ search,
9
+ single_paper_recommendation,
10
+ zotero_read,
11
+ zotero_write,
12
+ )
11
13
 
12
14
  __all__ = [
13
15
  "search",
@@ -0,0 +1,21 @@
1
+ # .env.example (DO NOT put actual API keys here, read the README.md)
2
+
3
+ # OPENAI API KEY
4
+ OPENAI_API_KEY=your_openai_api_key_here
5
+
6
+ # LangSmith API KEY
7
+ LANGCHAIN_TRACING_V2=true
8
+ LANGCHAIN_API_KEY=your_langchain_api_key_heres
9
+
10
+ # NVIDIA API KEY
11
+ NVIDIA_API_KEY=your_nvidia_api_key_here
12
+
13
+ # ZOTERO API KEY
14
+ ZOTERO_API_KEY=your_zotero_api_key_here
15
+ ZOTERO_USER_ID=your_zotero_user_id_here
16
+
17
+ # Set environment variables for data loader
18
+ MILVUS_HOST=milvus-standalone
19
+ MILVUS_PORT=19530
20
+ MILVUS_DB_NAME=pdf_rag_db
21
+ MILVUS_COLLECTION_NAME=pdf_rag_documents
@@ -0,0 +1,90 @@
1
+ version: "1.0.0"
2
+
3
+ services:
4
+ # talk2scholars
5
+ talk2scholars:
6
+ container_name: talk2scholars
7
+ image: vpatientengine/talk2scholars:latest
8
+ platform: linux/amd64
9
+ ports:
10
+ - "8501:8501"
11
+ environment:
12
+ - MILVUS_HOST=milvus-standalone
13
+ - MILVUS_PORT=19530
14
+ env_file:
15
+ - .env
16
+ healthcheck:
17
+ test: ["CMD", "curl", "-f", "http://localhost:8501/health"]
18
+ interval: 30s
19
+ timeout: 10s
20
+ retries: 3
21
+ start_period: 30s
22
+ depends_on:
23
+ milvus-standalone:
24
+ condition: service_healthy
25
+
26
+ # Milvus Dependencies
27
+ etcd:
28
+ container_name: milvus-etcd
29
+ image: quay.io/coreos/etcd:v3.5.18
30
+ environment:
31
+ - ETCD_AUTO_COMPACTION_MODE=revision
32
+ - ETCD_AUTO_COMPACTION_RETENTION=1000
33
+ - ETCD_QUOTA_BACKEND_BYTES=4294967296
34
+ - ETCD_SNAPSHOT_COUNT=50000
35
+ volumes:
36
+ - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/etcd:/etcd
37
+ command: etcd -advertise-client-urls=http://etcd:2379 -listen-client-urls http://0.0.0.0:2379 --data-dir /etcd
38
+ healthcheck:
39
+ test: ["CMD", "etcdctl", "endpoint", "health"]
40
+ interval: 30s
41
+ timeout: 20s
42
+ retries: 3
43
+
44
+ minio:
45
+ container_name: milvus-minio
46
+ image: minio/minio:RELEASE.2024-05-28T17-19-04Z
47
+ environment:
48
+ MINIO_ACCESS_KEY: minioadmin
49
+ MINIO_SECRET_KEY: minioadmin
50
+ ports:
51
+ - "9001:9001"
52
+ - "9000:9000"
53
+ volumes:
54
+ - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/minio:/minio_data
55
+ command: minio server /minio_data --console-address ":9001"
56
+ healthcheck:
57
+ test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
58
+ interval: 30s
59
+ timeout: 20s
60
+ retries: 3
61
+
62
+ # Milvus Vector Database (CPU-only)
63
+ milvus-standalone:
64
+ container_name: milvus-standalone
65
+ image: milvusdb/milvus:v2.5.14
66
+ command: ["milvus", "run", "standalone"]
67
+ security_opt:
68
+ - seccomp:unconfined
69
+ environment:
70
+ MINIO_REGION: us-east-1
71
+ ETCD_ENDPOINTS: etcd:2379
72
+ MINIO_ADDRESS: minio:9000
73
+ volumes:
74
+ - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus
75
+ ports:
76
+ - "19530:19530"
77
+ - "9091:9091"
78
+ healthcheck:
79
+ test: ["CMD", "curl", "-f", "http://localhost:9091/healthz"]
80
+ interval: 30s
81
+ start_period: 90s
82
+ timeout: 20s
83
+ retries: 3
84
+ depends_on:
85
+ - "etcd"
86
+ - "minio"
87
+
88
+ networks:
89
+ milvus:
90
+ name: milvus
@@ -0,0 +1,21 @@
1
+ # .env.example (DO NOT put actual API keys here, read the README.md)
2
+
3
+ # OPENAI API KEY
4
+ OPENAI_API_KEY=your_openai_api_key_here
5
+
6
+ # LangSmith API KEY
7
+ LANGCHAIN_TRACING_V2=true
8
+ LANGCHAIN_API_KEY=your_langchain_api_key_heres
9
+
10
+ # NVIDIA API KEY
11
+ NVIDIA_API_KEY=your_nvidia_api_key_here
12
+
13
+ # ZOTERO API KEY
14
+ ZOTERO_API_KEY=your_zotero_api_key_here
15
+ ZOTERO_USER_ID=your_zotero_user_id_here
16
+
17
+ # Set environment variables for data loader
18
+ MILVUS_HOST=milvus-standalone
19
+ MILVUS_PORT=19530
20
+ MILVUS_DB_NAME=pdf_rag_db
21
+ MILVUS_COLLECTION_NAME=pdf_rag_documents
@@ -0,0 +1,105 @@
1
+ version: "1.0.0"
2
+
3
+ services:
4
+ # talk2scholars
5
+ talk2scholars:
6
+ container_name: talk2scholars
7
+ image: vpatientengine/talk2scholars:latest
8
+ platform: linux/amd64
9
+ ports:
10
+ - "8501:8501"
11
+ deploy:
12
+ resources:
13
+ reservations:
14
+ devices:
15
+ - driver: nvidia
16
+ capabilities: ["gpu"]
17
+ device_ids: ["0"]
18
+ environment:
19
+ - MILVUS_HOST=milvus-standalone
20
+ - MILVUS_PORT=19530
21
+ env_file:
22
+ - .env
23
+ healthcheck:
24
+ test: ["CMD", "curl", "-f", "http://localhost:8501/health"]
25
+ interval: 30s
26
+ timeout: 10s
27
+ retries: 3
28
+ start_period: 30s
29
+ depends_on:
30
+ milvus-standalone:
31
+ condition: service_healthy
32
+
33
+ # Milvus Dependencies
34
+ etcd:
35
+ container_name: milvus-etcd
36
+ image: quay.io/coreos/etcd:v3.5.18
37
+ environment:
38
+ - ETCD_AUTO_COMPACTION_MODE=revision
39
+ - ETCD_AUTO_COMPACTION_RETENTION=1000
40
+ - ETCD_QUOTA_BACKEND_BYTES=4294967296
41
+ - ETCD_SNAPSHOT_COUNT=50000
42
+ volumes:
43
+ - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/etcd:/etcd
44
+ command: etcd -advertise-client-urls=http://etcd:2379 -listen-client-urls http://0.0.0.0:2379 --data-dir /etcd
45
+ healthcheck:
46
+ test: ["CMD", "etcdctl", "endpoint", "health"]
47
+ interval: 30s
48
+ timeout: 20s
49
+ retries: 3
50
+
51
+ minio:
52
+ container_name: milvus-minio
53
+ image: minio/minio:RELEASE.2023-03-20T20-16-18Z
54
+ environment:
55
+ MINIO_ACCESS_KEY: minioadmin
56
+ MINIO_SECRET_KEY: minioadmin
57
+ ports:
58
+ - "9001:9001"
59
+ - "9000:9000"
60
+ volumes:
61
+ - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/minio:/minio_data
62
+ command: minio server /minio_data --console-address ":9001"
63
+ healthcheck:
64
+ test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
65
+ interval: 30s
66
+ timeout: 20s
67
+ retries: 3
68
+
69
+ # Milvus Vector Database (GPU-enabled)
70
+ milvus-standalone:
71
+ container_name: milvus-standalone
72
+ image: milvusdb/milvus:v2.6.0-rc1-gpu
73
+ command: ["milvus", "run", "standalone"]
74
+ security_opt:
75
+ - seccomp:unconfined
76
+ environment:
77
+ MINIO_REGION: us-east-1
78
+ ETCD_ENDPOINTS: etcd:2379
79
+ MINIO_ADDRESS: minio:9000
80
+ MQ_TYPE: woodpecker
81
+ volumes:
82
+ - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus
83
+ ports:
84
+ - "19530:19530"
85
+ - "9091:9091"
86
+ deploy:
87
+ resources:
88
+ reservations:
89
+ devices:
90
+ - driver: nvidia
91
+ capabilities: ["gpu"]
92
+ device_ids: ["0"]
93
+ healthcheck:
94
+ test: ["CMD", "curl", "-f", "http://localhost:9091/healthz"]
95
+ interval: 30s
96
+ start_period: 90s
97
+ timeout: 20s
98
+ retries: 3
99
+ depends_on:
100
+ - "etcd"
101
+ - "minio"
102
+
103
+ networks:
104
+ milvus:
105
+ name: milvus
@@ -0,0 +1,122 @@
1
+ # Talk2Scholars
2
+
3
+ ## Installation
4
+
5
+ - [nvidia-cuda-toolkit](https://developer.nvidia.com/cuda-toolkit)
6
+ - [nvidia-container-toolkit](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/1.17.8/install-guide.html) (required for GPU support with Docker; enables containers to access NVIDIA GPUs for accelerated computing). After installing `nvidia-container-toolkit`, please restart Docker to ensure GPU support is enabled.
7
+
8
+ ### Docker (stable-release)
9
+
10
+ **Prerequisites**
11
+
12
+ - [Milvus](https://milvus.io) (for a vector database)
13
+
14
+ ---
15
+
16
+ #### 1. Download files
17
+
18
+ Choose the appropriate version of the `docker-compose.yml` file based on your system:
19
+
20
+ **For GPU:**
21
+
22
+ ```sh
23
+ wget https://raw.githubusercontent.com/VirtualPatientEngine/AIAgents4Pharma/main/aiagents4pharma/talk2scholars/docker-compose/gpu/docker-compose.yml \
24
+ https://raw.githubusercontent.com/VirtualPatientEngine/AIAgents4Pharma/main/aiagents4pharma/talk2scholars/docker-compose/gpu/.env.example
25
+ ```
26
+
27
+ **For CPU:**
28
+
29
+ ```sh
30
+ wget https://raw.githubusercontent.com/VirtualPatientEngine/AIAgents4Pharma/main/aiagents4pharma/talk2scholars/docker-compose/cpu/docker-compose.yml \
31
+ https://raw.githubusercontent.com/VirtualPatientEngine/AIAgents4Pharma/main/aiagents4pharma/talk2scholars/docker-compose/cpu/.env.example
32
+ ```
33
+
34
+ #### 2. Setup environment variables
35
+
36
+ ```sh
37
+ cp .env.example .env
38
+ ```
39
+
40
+ Edit `.env` with your API keys:
41
+
42
+ ```env
43
+ # .env.example (DO NOT put actual API keys here, read the README.md)
44
+
45
+ # OPENAI API KEY
46
+ OPENAI_API_KEY=your_openai_api_key_here
47
+
48
+ # LangSmith API KEY
49
+ LANGCHAIN_TRACING_V2=true
50
+ LANGCHAIN_API_KEY=your_langchain_api_key_heres
51
+
52
+ # NVIDIA API KEY
53
+ NVIDIA_API_KEY=your_nvidia_api_key_here
54
+
55
+ # ZOTERO API KEY
56
+ ZOTERO_API_KEY=your_zotero_api_key_here
57
+ ZOTERO_USER_ID=your_zotero_user_id_here
58
+
59
+ # Set environment variables for data loader
60
+ MILVUS_HOST=milvus-standalone
61
+ MILVUS_PORT=19530
62
+ MILVUS_DB_NAME=pdf_rag_db
63
+ MILVUS_COLLECTION_NAME=pdf_rag_documents
64
+ ```
65
+
66
+ ---
67
+
68
+ #### 3. Start the agent
69
+
70
+ ```sh
71
+ docker compose up -d
72
+ ```
73
+
74
+ ---
75
+
76
+ ### Access the Web UI
77
+
78
+ Once started, open:
79
+
80
+ ```
81
+ http://localhost:8501
82
+ ```
83
+
84
+ > In the background, the BioBridge multimodal embeddings will be inserted into the Milvus database, and the `talk2scholars` service will start. Once the data is fully inserted, the application will be in a healthy state and accessible at the above address.
85
+ >
86
+ > You can monitor the process using:
87
+ >
88
+ > ```sh
89
+ > docker logs -f talk2scholars
90
+ > ```
91
+
92
+ ---
93
+
94
+ ## Get Key
95
+
96
+ - `NVIDIA_API_KEY` – required (obtain a free key at [https://build.nvidia.com/explore/discover](https://build.nvidia.com/explore/discover))
97
+ - `ZOTERO_API_KEY` – required (generate at [https://www.zotero.org/user/login#applications](https://www.zotero.org/user/login#applications))
98
+
99
+ **LangSmith** support is optional. To enable it, create an API key [here](https://docs.smith.langchain.com/administration/how_to_guides/organization_management/create_account_api_key).
100
+
101
+ _Please note that this will create a new tracing project in your Langsmith
102
+ account with the name `T2X-xxxx`, where `X` can be `KG` (KnowledgeGraphs).
103
+ If you skip the previous step, it will default to the name `default`.
104
+ `xxxx` will be the 4-digit ID created for the session._
105
+
106
+ ---
107
+
108
+ ## Notes for Windows Users
109
+
110
+ If you are using Windows, it is recommended to install [**Git Bash**](https://git-scm.com/downloads) for a smoother experience when running the bash commands in this guide.
111
+
112
+ - For applications that use **Docker Compose**, Git Bash is **required**.
113
+ - For applications that use **docker run** manually, Git Bash is **optional**, but recommended for consistency.
114
+
115
+ You can download Git Bash here: [Git for Windows](https://git-scm.com/downloads).
116
+
117
+ When using Docker on Windows, make sure you **run Docker with administrative privileges** if you face permission issues.
118
+
119
+ To resolve permission issues, you can:
120
+
121
+ - Review the official Docker documentation on [Windows permission requirements](https://docs.docker.com/desktop/setup/install/windows-permission-requirements/).
122
+ - Alternatively, follow the community discussion and solutions on [Docker Community Forums](https://forums.docker.com/t/error-when-trying-to-run-windows-containers-docker-client-must-be-run-with-elevated-privileges/136619).
@@ -8,7 +8,7 @@ across agent interactions.
8
8
 
9
9
  import logging
10
10
  from collections.abc import Mapping
11
- from typing import Annotated, Any, Dict
11
+ from typing import Annotated, Any
12
12
 
13
13
  from langchain_core.embeddings import Embeddings
14
14
  from langchain_core.language_models import BaseChatModel
@@ -19,7 +19,7 @@ logging.basicConfig(level=logging.INFO)
19
19
  logger = logging.getLogger(__name__)
20
20
 
21
21
 
22
- def merge_dict(existing: Dict[str, Any], new: Dict[str, Any]) -> Dict[str, Any]:
22
+ def merge_dict(existing: dict[str, Any], new: dict[str, Any]) -> dict[str, Any]:
23
23
  """
24
24
  Merges the existing dictionary with a new dictionary.
25
25
 
@@ -36,7 +36,7 @@ def merge_dict(existing: Dict[str, Any], new: Dict[str, Any]) -> Dict[str, Any]:
36
36
  return merged
37
37
 
38
38
 
39
- def replace_dict(existing: Dict[str, Any], new: Any) -> Any:
39
+ def replace_dict(existing: dict[str, Any], new: Any) -> Any:
40
40
  """
41
41
  Replaces the existing dictionary with a new dictionary.
42
42
 
@@ -87,12 +87,12 @@ class Talk2Scholars(AgentState):
87
87
  # Agent state fields
88
88
  # Key controlling UI display: always replace to reference latest output
89
89
  # Stores the most recently displayed papers metadata
90
- last_displayed_papers: Annotated[Dict[str, Any], replace_dict]
90
+ last_displayed_papers: Annotated[dict[str, Any], replace_dict]
91
91
  # Accumulative keys: merge new entries into existing state
92
- papers: Annotated[Dict[str, Any], merge_dict]
93
- multi_papers: Annotated[Dict[str, Any], merge_dict]
94
- article_data: Annotated[Dict[str, Any], merge_dict]
92
+ papers: Annotated[dict[str, Any], merge_dict]
93
+ multi_papers: Annotated[dict[str, Any], merge_dict]
94
+ article_data: Annotated[dict[str, Any], merge_dict]
95
95
  # Approval status: always replace to reflect latest operation
96
- zotero_write_approval_status: Annotated[Dict[str, Any], replace_dict]
96
+ zotero_write_approval_status: Annotated[dict[str, Any], replace_dict]
97
97
  llm_model: BaseChatModel
98
98
  text_embedding_model: Embeddings