aiagents4pharma 1.43.0__py3-none-any.whl → 1.45.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (290) hide show
  1. aiagents4pharma/__init__.py +2 -2
  2. aiagents4pharma/talk2aiagents4pharma/.dockerignore +13 -0
  3. aiagents4pharma/talk2aiagents4pharma/Dockerfile +105 -0
  4. aiagents4pharma/talk2aiagents4pharma/README.md +1 -0
  5. aiagents4pharma/talk2aiagents4pharma/__init__.py +4 -5
  6. aiagents4pharma/talk2aiagents4pharma/agents/__init__.py +3 -2
  7. aiagents4pharma/talk2aiagents4pharma/agents/main_agent.py +24 -23
  8. aiagents4pharma/talk2aiagents4pharma/configs/__init__.py +2 -2
  9. aiagents4pharma/talk2aiagents4pharma/configs/agents/__init__.py +2 -2
  10. aiagents4pharma/talk2aiagents4pharma/configs/agents/main_agent/default.yaml +2 -2
  11. aiagents4pharma/talk2aiagents4pharma/configs/config.yaml +1 -1
  12. aiagents4pharma/talk2aiagents4pharma/docker-compose/cpu/.env.example +23 -0
  13. aiagents4pharma/talk2aiagents4pharma/docker-compose/cpu/docker-compose.yml +93 -0
  14. aiagents4pharma/talk2aiagents4pharma/docker-compose/gpu/.env.example +23 -0
  15. aiagents4pharma/talk2aiagents4pharma/docker-compose/gpu/docker-compose.yml +108 -0
  16. aiagents4pharma/talk2aiagents4pharma/install.md +127 -0
  17. aiagents4pharma/talk2aiagents4pharma/states/__init__.py +3 -2
  18. aiagents4pharma/talk2aiagents4pharma/states/state_talk2aiagents4pharma.py +5 -3
  19. aiagents4pharma/talk2aiagents4pharma/tests/__init__.py +2 -2
  20. aiagents4pharma/talk2aiagents4pharma/tests/test_main_agent.py +72 -50
  21. aiagents4pharma/talk2biomodels/.dockerignore +13 -0
  22. aiagents4pharma/talk2biomodels/Dockerfile +104 -0
  23. aiagents4pharma/talk2biomodels/README.md +1 -0
  24. aiagents4pharma/talk2biomodels/__init__.py +4 -8
  25. aiagents4pharma/talk2biomodels/agents/__init__.py +3 -2
  26. aiagents4pharma/talk2biomodels/agents/t2b_agent.py +47 -42
  27. aiagents4pharma/talk2biomodels/api/__init__.py +4 -5
  28. aiagents4pharma/talk2biomodels/api/kegg.py +14 -10
  29. aiagents4pharma/talk2biomodels/api/ols.py +13 -10
  30. aiagents4pharma/talk2biomodels/api/uniprot.py +7 -6
  31. aiagents4pharma/talk2biomodels/configs/__init__.py +3 -4
  32. aiagents4pharma/talk2biomodels/configs/agents/__init__.py +2 -2
  33. aiagents4pharma/talk2biomodels/configs/agents/t2b_agent/__init__.py +2 -2
  34. aiagents4pharma/talk2biomodels/configs/agents/t2b_agent/default.yaml +1 -1
  35. aiagents4pharma/talk2biomodels/configs/config.yaml +1 -1
  36. aiagents4pharma/talk2biomodels/configs/tools/__init__.py +4 -5
  37. aiagents4pharma/talk2biomodels/configs/tools/ask_question/__init__.py +2 -2
  38. aiagents4pharma/talk2biomodels/configs/tools/ask_question/default.yaml +1 -2
  39. aiagents4pharma/talk2biomodels/configs/tools/custom_plotter/__init__.py +2 -2
  40. aiagents4pharma/talk2biomodels/configs/tools/custom_plotter/default.yaml +1 -1
  41. aiagents4pharma/talk2biomodels/configs/tools/get_annotation/__init__.py +2 -2
  42. aiagents4pharma/talk2biomodels/configs/tools/get_annotation/default.yaml +1 -1
  43. aiagents4pharma/talk2biomodels/install.md +63 -0
  44. aiagents4pharma/talk2biomodels/models/__init__.py +4 -4
  45. aiagents4pharma/talk2biomodels/models/basico_model.py +36 -28
  46. aiagents4pharma/talk2biomodels/models/sys_bio_model.py +13 -10
  47. aiagents4pharma/talk2biomodels/states/__init__.py +3 -2
  48. aiagents4pharma/talk2biomodels/states/state_talk2biomodels.py +12 -8
  49. aiagents4pharma/talk2biomodels/tests/BIOMD0000000449_url.xml +1585 -0
  50. aiagents4pharma/talk2biomodels/tests/__init__.py +2 -2
  51. aiagents4pharma/talk2biomodels/tests/article_on_model_537.pdf +0 -0
  52. aiagents4pharma/talk2biomodels/tests/test_api.py +18 -14
  53. aiagents4pharma/talk2biomodels/tests/test_ask_question.py +8 -9
  54. aiagents4pharma/talk2biomodels/tests/test_basico_model.py +15 -9
  55. aiagents4pharma/talk2biomodels/tests/test_get_annotation.py +54 -55
  56. aiagents4pharma/talk2biomodels/tests/test_getmodelinfo.py +28 -27
  57. aiagents4pharma/talk2biomodels/tests/test_integration.py +21 -33
  58. aiagents4pharma/talk2biomodels/tests/test_load_biomodel.py +14 -11
  59. aiagents4pharma/talk2biomodels/tests/test_param_scan.py +21 -20
  60. aiagents4pharma/talk2biomodels/tests/test_query_article.py +129 -29
  61. aiagents4pharma/talk2biomodels/tests/test_search_models.py +9 -13
  62. aiagents4pharma/talk2biomodels/tests/test_simulate_model.py +16 -15
  63. aiagents4pharma/talk2biomodels/tests/test_steady_state.py +12 -22
  64. aiagents4pharma/talk2biomodels/tests/test_sys_bio_model.py +33 -29
  65. aiagents4pharma/talk2biomodels/tools/__init__.py +15 -12
  66. aiagents4pharma/talk2biomodels/tools/ask_question.py +42 -32
  67. aiagents4pharma/talk2biomodels/tools/custom_plotter.py +51 -43
  68. aiagents4pharma/talk2biomodels/tools/get_annotation.py +99 -75
  69. aiagents4pharma/talk2biomodels/tools/get_modelinfo.py +57 -51
  70. aiagents4pharma/talk2biomodels/tools/load_arguments.py +52 -32
  71. aiagents4pharma/talk2biomodels/tools/load_biomodel.py +8 -2
  72. aiagents4pharma/talk2biomodels/tools/parameter_scan.py +107 -90
  73. aiagents4pharma/talk2biomodels/tools/query_article.py +14 -13
  74. aiagents4pharma/talk2biomodels/tools/search_models.py +37 -26
  75. aiagents4pharma/talk2biomodels/tools/simulate_model.py +47 -37
  76. aiagents4pharma/talk2biomodels/tools/steady_state.py +76 -58
  77. aiagents4pharma/talk2biomodels/tools/utils.py +4 -3
  78. aiagents4pharma/talk2cells/README.md +1 -0
  79. aiagents4pharma/talk2cells/__init__.py +4 -5
  80. aiagents4pharma/talk2cells/agents/__init__.py +3 -2
  81. aiagents4pharma/talk2cells/agents/scp_agent.py +21 -19
  82. aiagents4pharma/talk2cells/states/__init__.py +3 -2
  83. aiagents4pharma/talk2cells/states/state_talk2cells.py +4 -2
  84. aiagents4pharma/talk2cells/tests/scp_agent/test_scp_agent.py +8 -9
  85. aiagents4pharma/talk2cells/tools/__init__.py +3 -2
  86. aiagents4pharma/talk2cells/tools/scp_agent/__init__.py +4 -4
  87. aiagents4pharma/talk2cells/tools/scp_agent/display_studies.py +5 -3
  88. aiagents4pharma/talk2cells/tools/scp_agent/search_studies.py +21 -22
  89. aiagents4pharma/talk2knowledgegraphs/.dockerignore +13 -0
  90. aiagents4pharma/talk2knowledgegraphs/Dockerfile +103 -0
  91. aiagents4pharma/talk2knowledgegraphs/README.md +1 -0
  92. aiagents4pharma/talk2knowledgegraphs/__init__.py +4 -7
  93. aiagents4pharma/talk2knowledgegraphs/agents/__init__.py +3 -2
  94. aiagents4pharma/talk2knowledgegraphs/agents/t2kg_agent.py +40 -30
  95. aiagents4pharma/talk2knowledgegraphs/configs/__init__.py +3 -6
  96. aiagents4pharma/talk2knowledgegraphs/configs/agents/t2kg_agent/__init__.py +2 -2
  97. aiagents4pharma/talk2knowledgegraphs/configs/agents/t2kg_agent/default.yaml +8 -8
  98. aiagents4pharma/talk2knowledgegraphs/configs/app/__init__.py +3 -2
  99. aiagents4pharma/talk2knowledgegraphs/configs/app/frontend/__init__.py +2 -2
  100. aiagents4pharma/talk2knowledgegraphs/configs/app/frontend/default.yaml +1 -1
  101. aiagents4pharma/talk2knowledgegraphs/configs/config.yaml +1 -1
  102. aiagents4pharma/talk2knowledgegraphs/configs/tools/__init__.py +4 -5
  103. aiagents4pharma/talk2knowledgegraphs/configs/tools/graphrag_reasoning/__init__.py +2 -2
  104. aiagents4pharma/talk2knowledgegraphs/configs/tools/graphrag_reasoning/default.yaml +1 -1
  105. aiagents4pharma/talk2knowledgegraphs/configs/tools/multimodal_subgraph_extraction/default.yaml +17 -2
  106. aiagents4pharma/talk2knowledgegraphs/configs/tools/subgraph_extraction/__init__.py +2 -2
  107. aiagents4pharma/talk2knowledgegraphs/configs/tools/subgraph_extraction/default.yaml +1 -1
  108. aiagents4pharma/talk2knowledgegraphs/configs/tools/subgraph_summarization/__init__.py +2 -2
  109. aiagents4pharma/talk2knowledgegraphs/configs/tools/subgraph_summarization/default.yaml +1 -1
  110. aiagents4pharma/talk2knowledgegraphs/configs/utils/enrichments/ols_terms/default.yaml +1 -1
  111. aiagents4pharma/talk2knowledgegraphs/configs/utils/enrichments/reactome_pathways/default.yaml +1 -1
  112. aiagents4pharma/talk2knowledgegraphs/configs/utils/enrichments/uniprot_proteins/default.yaml +1 -1
  113. aiagents4pharma/talk2knowledgegraphs/configs/utils/pubchem_utils/default.yaml +1 -1
  114. aiagents4pharma/talk2knowledgegraphs/datasets/__init__.py +4 -6
  115. aiagents4pharma/talk2knowledgegraphs/datasets/biobridge_primekg.py +115 -67
  116. aiagents4pharma/talk2knowledgegraphs/datasets/dataset.py +2 -0
  117. aiagents4pharma/talk2knowledgegraphs/datasets/primekg.py +35 -24
  118. aiagents4pharma/talk2knowledgegraphs/datasets/starkqa_primekg.py +29 -21
  119. aiagents4pharma/talk2knowledgegraphs/docker-compose/cpu/.env.example +23 -0
  120. aiagents4pharma/talk2knowledgegraphs/docker-compose/cpu/docker-compose.yml +93 -0
  121. aiagents4pharma/talk2knowledgegraphs/docker-compose/gpu/.env.example +23 -0
  122. aiagents4pharma/talk2knowledgegraphs/docker-compose/gpu/docker-compose.yml +108 -0
  123. aiagents4pharma/talk2knowledgegraphs/entrypoint.sh +190 -0
  124. aiagents4pharma/talk2knowledgegraphs/install.md +140 -0
  125. aiagents4pharma/talk2knowledgegraphs/milvus_data_dump.py +31 -65
  126. aiagents4pharma/talk2knowledgegraphs/states/__init__.py +3 -2
  127. aiagents4pharma/talk2knowledgegraphs/states/state_talk2knowledgegraphs.py +1 -0
  128. aiagents4pharma/talk2knowledgegraphs/tests/test_agents_t2kg_agent.py +65 -40
  129. aiagents4pharma/talk2knowledgegraphs/tests/test_datasets_biobridge_primekg.py +54 -48
  130. aiagents4pharma/talk2knowledgegraphs/tests/test_datasets_dataset.py +4 -0
  131. aiagents4pharma/talk2knowledgegraphs/tests/test_datasets_primekg.py +17 -4
  132. aiagents4pharma/talk2knowledgegraphs/tests/test_datasets_starkqa_primekg.py +33 -24
  133. aiagents4pharma/talk2knowledgegraphs/tests/test_tools_graphrag_reasoning.py +116 -69
  134. aiagents4pharma/talk2knowledgegraphs/tests/test_tools_milvus_multimodal_subgraph_extraction.py +736 -413
  135. aiagents4pharma/talk2knowledgegraphs/tests/test_tools_multimodal_subgraph_extraction.py +22 -15
  136. aiagents4pharma/talk2knowledgegraphs/tests/test_tools_subgraph_extraction.py +19 -12
  137. aiagents4pharma/talk2knowledgegraphs/tests/test_tools_subgraph_summarization.py +95 -48
  138. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_embeddings_embeddings.py +4 -0
  139. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_embeddings_huggingface.py +5 -0
  140. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_embeddings_nim_molmim.py +13 -18
  141. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_embeddings_ollama.py +10 -3
  142. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_enrichments.py +4 -3
  143. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_ollama.py +3 -2
  144. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_ols.py +1 -0
  145. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_pubchem.py +9 -4
  146. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_reactome.py +6 -6
  147. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_uniprot.py +4 -0
  148. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_extractions_milvus_multimodal_pcst.py +442 -42
  149. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_kg_utils.py +3 -4
  150. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_pubchem_utils.py +10 -6
  151. aiagents4pharma/talk2knowledgegraphs/tools/__init__.py +10 -7
  152. aiagents4pharma/talk2knowledgegraphs/tools/graphrag_reasoning.py +15 -20
  153. aiagents4pharma/talk2knowledgegraphs/tools/milvus_multimodal_subgraph_extraction.py +245 -205
  154. aiagents4pharma/talk2knowledgegraphs/tools/multimodal_subgraph_extraction.py +92 -90
  155. aiagents4pharma/talk2knowledgegraphs/tools/subgraph_extraction.py +25 -37
  156. aiagents4pharma/talk2knowledgegraphs/tools/subgraph_summarization.py +10 -13
  157. aiagents4pharma/talk2knowledgegraphs/utils/__init__.py +4 -7
  158. aiagents4pharma/talk2knowledgegraphs/utils/embeddings/__init__.py +4 -7
  159. aiagents4pharma/talk2knowledgegraphs/utils/embeddings/embeddings.py +4 -0
  160. aiagents4pharma/talk2knowledgegraphs/utils/embeddings/huggingface.py +11 -14
  161. aiagents4pharma/talk2knowledgegraphs/utils/embeddings/nim_molmim.py +7 -7
  162. aiagents4pharma/talk2knowledgegraphs/utils/embeddings/ollama.py +12 -6
  163. aiagents4pharma/talk2knowledgegraphs/utils/embeddings/sentence_transformer.py +8 -6
  164. aiagents4pharma/talk2knowledgegraphs/utils/enrichments/__init__.py +9 -6
  165. aiagents4pharma/talk2knowledgegraphs/utils/enrichments/enrichments.py +1 -0
  166. aiagents4pharma/talk2knowledgegraphs/utils/enrichments/ollama.py +15 -9
  167. aiagents4pharma/talk2knowledgegraphs/utils/enrichments/ols_terms.py +23 -20
  168. aiagents4pharma/talk2knowledgegraphs/utils/enrichments/pubchem_strings.py +12 -10
  169. aiagents4pharma/talk2knowledgegraphs/utils/enrichments/reactome_pathways.py +16 -10
  170. aiagents4pharma/talk2knowledgegraphs/utils/enrichments/uniprot_proteins.py +26 -18
  171. aiagents4pharma/talk2knowledgegraphs/utils/extractions/__init__.py +4 -5
  172. aiagents4pharma/talk2knowledgegraphs/utils/extractions/milvus_multimodal_pcst.py +218 -81
  173. aiagents4pharma/talk2knowledgegraphs/utils/extractions/multimodal_pcst.py +53 -47
  174. aiagents4pharma/talk2knowledgegraphs/utils/extractions/pcst.py +18 -14
  175. aiagents4pharma/talk2knowledgegraphs/utils/kg_utils.py +22 -23
  176. aiagents4pharma/talk2knowledgegraphs/utils/pubchem_utils.py +11 -10
  177. aiagents4pharma/talk2scholars/.dockerignore +13 -0
  178. aiagents4pharma/talk2scholars/Dockerfile +104 -0
  179. aiagents4pharma/talk2scholars/README.md +1 -0
  180. aiagents4pharma/talk2scholars/agents/__init__.py +1 -5
  181. aiagents4pharma/talk2scholars/agents/main_agent.py +6 -4
  182. aiagents4pharma/talk2scholars/agents/paper_download_agent.py +5 -4
  183. aiagents4pharma/talk2scholars/agents/pdf_agent.py +4 -2
  184. aiagents4pharma/talk2scholars/agents/s2_agent.py +2 -2
  185. aiagents4pharma/talk2scholars/agents/zotero_agent.py +10 -11
  186. aiagents4pharma/talk2scholars/configs/__init__.py +1 -3
  187. aiagents4pharma/talk2scholars/configs/agents/talk2scholars/__init__.py +1 -4
  188. aiagents4pharma/talk2scholars/configs/agents/talk2scholars/main_agent/default.yaml +1 -1
  189. aiagents4pharma/talk2scholars/configs/agents/talk2scholars/pdf_agent/default.yaml +1 -1
  190. aiagents4pharma/talk2scholars/configs/agents/talk2scholars/s2_agent/default.yaml +8 -8
  191. aiagents4pharma/talk2scholars/configs/agents/talk2scholars/zotero_agent/default.yaml +7 -7
  192. aiagents4pharma/talk2scholars/configs/tools/__init__.py +8 -6
  193. aiagents4pharma/talk2scholars/docker-compose/cpu/.env.example +21 -0
  194. aiagents4pharma/talk2scholars/docker-compose/cpu/docker-compose.yml +90 -0
  195. aiagents4pharma/talk2scholars/docker-compose/gpu/.env.example +21 -0
  196. aiagents4pharma/talk2scholars/docker-compose/gpu/docker-compose.yml +105 -0
  197. aiagents4pharma/talk2scholars/install.md +122 -0
  198. aiagents4pharma/talk2scholars/state/state_talk2scholars.py +8 -8
  199. aiagents4pharma/talk2scholars/tests/{test_main_agent.py → test_agents_main_agent.py} +41 -23
  200. aiagents4pharma/talk2scholars/tests/{test_paper_download_agent.py → test_agents_paper_agents_download_agent.py} +10 -16
  201. aiagents4pharma/talk2scholars/tests/{test_pdf_agent.py → test_agents_pdf_agent.py} +6 -10
  202. aiagents4pharma/talk2scholars/tests/{test_s2_agent.py → test_agents_s2_agent.py} +8 -16
  203. aiagents4pharma/talk2scholars/tests/{test_zotero_agent.py → test_agents_zotero_agent.py} +5 -7
  204. aiagents4pharma/talk2scholars/tests/{test_s2_display_dataframe.py → test_s2_tools_display_dataframe.py} +6 -7
  205. aiagents4pharma/talk2scholars/tests/{test_s2_query_dataframe.py → test_s2_tools_query_dataframe.py} +5 -15
  206. aiagents4pharma/talk2scholars/tests/{test_paper_downloader.py → test_tools_paper_downloader.py} +25 -63
  207. aiagents4pharma/talk2scholars/tests/{test_question_and_answer_tool.py → test_tools_question_and_answer_tool.py} +2 -6
  208. aiagents4pharma/talk2scholars/tests/{test_s2_multi.py → test_tools_s2_multi.py} +5 -5
  209. aiagents4pharma/talk2scholars/tests/{test_s2_retrieve.py → test_tools_s2_retrieve.py} +2 -1
  210. aiagents4pharma/talk2scholars/tests/{test_s2_search.py → test_tools_s2_search.py} +5 -5
  211. aiagents4pharma/talk2scholars/tests/{test_s2_single.py → test_tools_s2_single.py} +5 -5
  212. aiagents4pharma/talk2scholars/tests/{test_arxiv_downloader.py → test_utils_arxiv_downloader.py} +16 -25
  213. aiagents4pharma/talk2scholars/tests/{test_base_paper_downloader.py → test_utils_base_paper_downloader.py} +25 -47
  214. aiagents4pharma/talk2scholars/tests/{test_biorxiv_downloader.py → test_utils_biorxiv_downloader.py} +14 -42
  215. aiagents4pharma/talk2scholars/tests/{test_medrxiv_downloader.py → test_utils_medrxiv_downloader.py} +15 -49
  216. aiagents4pharma/talk2scholars/tests/{test_nvidia_nim_reranker.py → test_utils_nvidia_nim_reranker.py} +6 -16
  217. aiagents4pharma/talk2scholars/tests/{test_pdf_answer_formatter.py → test_utils_pdf_answer_formatter.py} +1 -0
  218. aiagents4pharma/talk2scholars/tests/{test_pdf_batch_processor.py → test_utils_pdf_batch_processor.py} +6 -15
  219. aiagents4pharma/talk2scholars/tests/{test_pdf_collection_manager.py → test_utils_pdf_collection_manager.py} +34 -11
  220. aiagents4pharma/talk2scholars/tests/{test_pdf_document_processor.py → test_utils_pdf_document_processor.py} +2 -3
  221. aiagents4pharma/talk2scholars/tests/{test_pdf_generate_answer.py → test_utils_pdf_generate_answer.py} +3 -6
  222. aiagents4pharma/talk2scholars/tests/{test_pdf_gpu_detection.py → test_utils_pdf_gpu_detection.py} +5 -16
  223. aiagents4pharma/talk2scholars/tests/{test_pdf_rag_pipeline.py → test_utils_pdf_rag_pipeline.py} +7 -17
  224. aiagents4pharma/talk2scholars/tests/{test_pdf_retrieve_chunks.py → test_utils_pdf_retrieve_chunks.py} +4 -11
  225. aiagents4pharma/talk2scholars/tests/{test_pdf_singleton_manager.py → test_utils_pdf_singleton_manager.py} +26 -23
  226. aiagents4pharma/talk2scholars/tests/{test_pdf_vector_normalization.py → test_utils_pdf_vector_normalization.py} +1 -1
  227. aiagents4pharma/talk2scholars/tests/{test_pdf_vector_store.py → test_utils_pdf_vector_store.py} +27 -55
  228. aiagents4pharma/talk2scholars/tests/{test_pubmed_downloader.py → test_utils_pubmed_downloader.py} +31 -91
  229. aiagents4pharma/talk2scholars/tests/{test_read_helper_utils.py → test_utils_read_helper_utils.py} +2 -6
  230. aiagents4pharma/talk2scholars/tests/{test_s2_utils_ext_ids.py → test_utils_s2_utils_ext_ids.py} +5 -15
  231. aiagents4pharma/talk2scholars/tests/{test_zotero_human_in_the_loop.py → test_utils_zotero_human_in_the_loop.py} +6 -13
  232. aiagents4pharma/talk2scholars/tests/{test_zotero_path.py → test_utils_zotero_path.py} +53 -45
  233. aiagents4pharma/talk2scholars/tests/{test_zotero_read.py → test_utils_zotero_read.py} +30 -91
  234. aiagents4pharma/talk2scholars/tests/{test_zotero_write.py → test_utils_zotero_write.py} +6 -16
  235. aiagents4pharma/talk2scholars/tools/__init__.py +1 -4
  236. aiagents4pharma/talk2scholars/tools/paper_download/paper_downloader.py +20 -35
  237. aiagents4pharma/talk2scholars/tools/paper_download/utils/__init__.py +7 -5
  238. aiagents4pharma/talk2scholars/tools/paper_download/utils/arxiv_downloader.py +9 -11
  239. aiagents4pharma/talk2scholars/tools/paper_download/utils/base_paper_downloader.py +14 -21
  240. aiagents4pharma/talk2scholars/tools/paper_download/utils/biorxiv_downloader.py +14 -22
  241. aiagents4pharma/talk2scholars/tools/paper_download/utils/medrxiv_downloader.py +11 -13
  242. aiagents4pharma/talk2scholars/tools/paper_download/utils/pubmed_downloader.py +14 -28
  243. aiagents4pharma/talk2scholars/tools/pdf/question_and_answer.py +4 -8
  244. aiagents4pharma/talk2scholars/tools/pdf/utils/__init__.py +16 -14
  245. aiagents4pharma/talk2scholars/tools/pdf/utils/answer_formatter.py +4 -4
  246. aiagents4pharma/talk2scholars/tools/pdf/utils/batch_processor.py +15 -17
  247. aiagents4pharma/talk2scholars/tools/pdf/utils/collection_manager.py +2 -2
  248. aiagents4pharma/talk2scholars/tools/pdf/utils/document_processor.py +5 -5
  249. aiagents4pharma/talk2scholars/tools/pdf/utils/generate_answer.py +4 -4
  250. aiagents4pharma/talk2scholars/tools/pdf/utils/get_vectorstore.py +2 -6
  251. aiagents4pharma/talk2scholars/tools/pdf/utils/gpu_detection.py +5 -9
  252. aiagents4pharma/talk2scholars/tools/pdf/utils/nvidia_nim_reranker.py +4 -4
  253. aiagents4pharma/talk2scholars/tools/pdf/utils/paper_loader.py +2 -2
  254. aiagents4pharma/talk2scholars/tools/pdf/utils/rag_pipeline.py +6 -15
  255. aiagents4pharma/talk2scholars/tools/pdf/utils/retrieve_chunks.py +7 -15
  256. aiagents4pharma/talk2scholars/tools/pdf/utils/singleton_manager.py +2 -2
  257. aiagents4pharma/talk2scholars/tools/pdf/utils/tool_helper.py +3 -4
  258. aiagents4pharma/talk2scholars/tools/pdf/utils/vector_normalization.py +8 -17
  259. aiagents4pharma/talk2scholars/tools/pdf/utils/vector_store.py +17 -33
  260. aiagents4pharma/talk2scholars/tools/s2/__init__.py +8 -6
  261. aiagents4pharma/talk2scholars/tools/s2/display_dataframe.py +3 -7
  262. aiagents4pharma/talk2scholars/tools/s2/multi_paper_rec.py +7 -6
  263. aiagents4pharma/talk2scholars/tools/s2/query_dataframe.py +5 -12
  264. aiagents4pharma/talk2scholars/tools/s2/retrieve_semantic_scholar_paper_id.py +2 -4
  265. aiagents4pharma/talk2scholars/tools/s2/search.py +6 -6
  266. aiagents4pharma/talk2scholars/tools/s2/single_paper_rec.py +5 -3
  267. aiagents4pharma/talk2scholars/tools/s2/utils/__init__.py +1 -3
  268. aiagents4pharma/talk2scholars/tools/s2/utils/multi_helper.py +12 -18
  269. aiagents4pharma/talk2scholars/tools/s2/utils/search_helper.py +11 -18
  270. aiagents4pharma/talk2scholars/tools/s2/utils/single_helper.py +11 -16
  271. aiagents4pharma/talk2scholars/tools/zotero/__init__.py +1 -4
  272. aiagents4pharma/talk2scholars/tools/zotero/utils/__init__.py +1 -4
  273. aiagents4pharma/talk2scholars/tools/zotero/utils/read_helper.py +21 -39
  274. aiagents4pharma/talk2scholars/tools/zotero/utils/review_helper.py +2 -6
  275. aiagents4pharma/talk2scholars/tools/zotero/utils/write_helper.py +8 -11
  276. aiagents4pharma/talk2scholars/tools/zotero/utils/zotero_path.py +4 -12
  277. aiagents4pharma/talk2scholars/tools/zotero/utils/zotero_pdf_downloader.py +13 -27
  278. aiagents4pharma/talk2scholars/tools/zotero/zotero_read.py +4 -7
  279. aiagents4pharma/talk2scholars/tools/zotero/zotero_review.py +8 -10
  280. aiagents4pharma/talk2scholars/tools/zotero/zotero_write.py +3 -2
  281. {aiagents4pharma-1.43.0.dist-info → aiagents4pharma-1.45.0.dist-info}/METADATA +115 -50
  282. aiagents4pharma-1.45.0.dist-info/RECORD +324 -0
  283. {aiagents4pharma-1.43.0.dist-info → aiagents4pharma-1.45.0.dist-info}/WHEEL +1 -2
  284. aiagents4pharma-1.43.0.dist-info/RECORD +0 -293
  285. aiagents4pharma-1.43.0.dist-info/top_level.txt +0 -1
  286. /aiagents4pharma/talk2scholars/tests/{test_state.py → test_states_state.py} +0 -0
  287. /aiagents4pharma/talk2scholars/tests/{test_pdf_paper_loader.py → test_utils_pdf_paper_loader.py} +0 -0
  288. /aiagents4pharma/talk2scholars/tests/{test_tool_helper_utils.py → test_utils_tool_helper_utils.py} +0 -0
  289. /aiagents4pharma/talk2scholars/tests/{test_zotero_pdf_downloader_utils.py → test_utils_zotero_pdf_downloader_utils.py} +0 -0
  290. {aiagents4pharma-1.43.0.dist-info → aiagents4pharma-1.45.0.dist-info}/licenses/LICENSE +0 -0
@@ -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
@@ -4,11 +4,15 @@ Tests the supervisor agent's routing logic and state management.
4
4
  """
5
5
 
6
6
  from types import SimpleNamespace
7
- import pytest
7
+
8
8
  import hydra
9
+ import pytest
9
10
  from langchain_core.language_models.chat_models import BaseChatModel
11
+ from langchain_core.messages import AIMessage, HumanMessage
12
+ from langchain_core.outputs import ChatGeneration, ChatResult
10
13
  from langchain_openai import ChatOpenAI
11
14
  from pydantic import Field
15
+
12
16
  from aiagents4pharma.talk2scholars.agents.main_agent import get_app
13
17
 
14
18
  # --- Dummy LLM Implementation ---
@@ -19,16 +23,23 @@ class DummyLLM(BaseChatModel):
19
23
 
20
24
  model_name: str = Field(...)
21
25
 
22
- def _generate(self, prompt, stop=None):
23
- """Generate a response given a prompt."""
24
- DummyLLM.called_prompt = prompt
25
- return "dummy output"
26
+ def _generate(self, messages, stop=None, run_manager=None, **kwargs):
27
+ """generate a dummy response based on the input messages."""
28
+ DummyLLM.called_prompt = messages[0].content
29
+ message = AIMessage(content="dummy output")
30
+ generation = ChatGeneration(message=message)
31
+ return ChatResult(generations=[generation])
26
32
 
27
33
  @property
28
34
  def _llm_type(self):
29
35
  """Return the type of the language model."""
30
36
  return "dummy"
31
37
 
38
+ # NEW: public shim to avoid protected access in tests
39
+ def public_llm_type(self) -> str:
40
+ """public method to access the LLM type."""
41
+ return self._llm_type
42
+
32
43
 
33
44
  # --- Dummy Workflow and Sub-agent Functions ---
34
45
 
@@ -105,17 +116,12 @@ class DummyHydraContext:
105
116
  def dict_to_namespace(d):
106
117
  """Convert a dictionary to a SimpleNamespace object."""
107
118
  return SimpleNamespace(
108
- **{
109
- key: dict_to_namespace(val) if isinstance(val, dict) else val
110
- for key, val in d.items()
111
- }
119
+ **{key: dict_to_namespace(val) if isinstance(val, dict) else val for key, val in d.items()}
112
120
  )
113
121
 
114
122
 
115
123
  dummy_config = {
116
- "agents": {
117
- "talk2scholars": {"main_agent": {"system_prompt": "Dummy system prompt"}}
118
- }
124
+ "agents": {"talk2scholars": {"main_agent": {"system_prompt": "Dummy system prompt"}}}
119
125
  }
120
126
 
121
127
 
@@ -141,9 +147,7 @@ class DummyHydraCompose:
141
147
  @pytest.fixture(autouse=True)
142
148
  def patch_hydra(monkeypatch):
143
149
  """Patch the hydra.initialize and hydra.compose functions to return dummy objects."""
144
- monkeypatch.setattr(
145
- hydra, "initialize", lambda version_base, config_path: DummyHydraContext()
146
- )
150
+ monkeypatch.setattr(hydra, "initialize", lambda version_base, config_path: DummyHydraContext())
147
151
  monkeypatch.setattr(
148
152
  hydra, "compose", lambda config_name, overrides: DummyHydraCompose(dummy_config)
149
153
  )
@@ -153,9 +157,7 @@ def dummy_paper_download_agent(uniq_id, llm_model):
153
157
  """Return a DummyWorkflow for the paper download agent."""
154
158
  dummy_paper_download_agent.called_uniq_id = uniq_id
155
159
  dummy_paper_download_agent.called_llm_model = llm_model
156
- return DummyWorkflow(
157
- supervisor_args={"agent": "paper_download", "uniq_id": uniq_id}
158
- )
160
+ return DummyWorkflow(supervisor_args={"agent": "paper_download", "uniq_id": uniq_id})
159
161
 
160
162
 
161
163
  @pytest.fixture(autouse=True)
@@ -186,16 +188,30 @@ def patch_sub_agents_and_supervisor(monkeypatch):
186
188
 
187
189
 
188
190
  def test_dummy_llm_generate():
189
- """Test the dummy LLM's generate function."""
191
+ """Test the dummy LLM's generate function through public interface."""
190
192
  dummy = DummyLLM(model_name="test-model")
191
- output = getattr(dummy, "_generate")("any prompt")
192
- assert output == "dummy output"
193
+ # Test that the dummy LLM can be used (testing the class works)
194
+ assert dummy.model_name == "test-model"
195
+ # Test through public interface that internally calls _generate (covers lines 26-27)
196
+ # Use invoke which internally calls _generate
197
+ messages = [HumanMessage(content="test prompt")]
198
+ result = dummy.invoke(messages)
199
+ # Verify the internal state was set
200
+ assert hasattr(DummyLLM, "called_prompt")
201
+ assert result is not None
202
+ assert DummyLLM.called_prompt == "test prompt"
193
203
 
194
204
 
195
205
  def test_dummy_llm_llm_type():
196
- """Test the dummy LLM's _llm_type property."""
206
+ """Test the dummy LLM's type identification."""
197
207
  dummy = DummyLLM(model_name="test-model")
198
- assert getattr(dummy, "_llm_type") == "dummy"
208
+
209
+ # Use public shim instead of protected attribute access
210
+ llm_type = dummy.public_llm_type()
211
+ assert llm_type == "dummy"
212
+
213
+ # Also test the public string representation
214
+ assert "DummyLLM" in str(dummy.__class__.__name__)
199
215
 
200
216
 
201
217
  def test_get_app_with_gpt4o_mini():
@@ -225,12 +241,14 @@ def test_get_app_with_other_model():
225
241
  assert supervisor_args.get("prompt") == "Dummy system prompt"
226
242
  assert getattr(app, "name", "") == "Talk2Scholars_MainAgent"
227
243
 
244
+
228
245
  def test_dummy_workflow_get_supervisor_args():
229
246
  """Test that DummyWorkflow.get_supervisor_args returns the stored args."""
230
247
  dummy_args = {"agent": "test", "uniq_id": "id123"}
231
248
  wf = DummyWorkflow(supervisor_args=dummy_args)
232
249
  assert wf.get_supervisor_args() is dummy_args
233
250
 
251
+
234
252
  def test_dummy_hydra_compose_get_config():
235
253
  """Test that DummyHydraCompose.get_config returns the raw config."""
236
254
  config_dict = {"agents": {"test": {"key": "value"}}}
@@ -1,9 +1,11 @@
1
1
  """Unit tests for the paper download agent in Talk2Scholars."""
2
2
 
3
3
  from unittest import mock
4
+
4
5
  import pytest
5
- from langchain_core.messages import HumanMessage, AIMessage
6
6
  from langchain_core.language_models.chat_models import BaseChatModel
7
+ from langchain_core.messages import AIMessage, HumanMessage
8
+
7
9
  from ..agents.paper_download_agent import get_app
8
10
  from ..state.state_talk2scholars import Talk2Scholars
9
11
 
@@ -13,9 +15,7 @@ def mock_hydra_fixture():
13
15
  """Mocks Hydra configuration for tests."""
14
16
  with mock.patch("hydra.initialize"), mock.patch("hydra.compose") as mock_compose:
15
17
  cfg_mock = mock.MagicMock()
16
- cfg_mock.agents.talk2scholars.paper_download_agent.paper_download_agent = (
17
- "Test prompt"
18
- )
18
+ cfg_mock.agents.talk2scholars.paper_download_agent.paper_download_agent = "Test prompt"
19
19
  mock_compose.return_value = cfg_mock
20
20
  yield mock_compose
21
21
 
@@ -26,9 +26,7 @@ def mock_tools_fixture():
26
26
  with mock.patch(
27
27
  "aiagents4pharma.talk2scholars.tools.paper_download.paper_downloader.download_papers"
28
28
  ) as mock_download_papers:
29
- mock_download_papers.return_value = {
30
- "article_data": {"dummy_key": "dummy_value"}
31
- }
29
+ mock_download_papers.return_value = {"article_data": {"dummy_key": "dummy_value"}}
32
30
  yield [mock_download_papers]
33
31
 
34
32
 
@@ -52,9 +50,7 @@ def test_paper_download_agent_invocation():
52
50
  """Verifies agent processes queries and updates state correctly."""
53
51
  _ = mock_tools_fixture # Prevents unused-argument warning
54
52
  thread_id = "test_thread_paper_dl"
55
- mock_state = Talk2Scholars(
56
- messages=[HumanMessage(content="Download paper 1234.5678")]
57
- )
53
+ mock_state = Talk2Scholars(messages=[HumanMessage(content="Download paper 1234.5678")])
58
54
  llm_mock = mock.Mock(spec=BaseChatModel)
59
55
 
60
56
  with mock.patch(
@@ -108,9 +104,7 @@ def test_paper_download_agent_tools_assignment(
108
104
  # Verify ToolNode was called with download_papers function
109
105
  assert mock_toolnode.called
110
106
  # Check that ToolNode was called with a list containing the download_papers tool
111
- call_args = mock_toolnode.call_args[0][
112
- 0
113
- ] # Get first positional argument (the tools list)
107
+ call_args = mock_toolnode.call_args[0][0] # Get first positional argument (the tools list)
114
108
  assert len(call_args) == 1
115
109
  # The tool should be a StructuredTool with name 'download_papers'
116
110
  tool = call_args[0]
@@ -140,6 +134,6 @@ def test_paper_download_agent_model_failure():
140
134
  ):
141
135
  with pytest.raises(Exception) as exc_info:
142
136
  get_app(thread_id, llm_mock)
143
- assert "Mock model failure" in str(
144
- exc_info.value
145
- ), "Model initialization failure should raise an exception."
137
+ assert "Mock model failure" in str(exc_info.value), (
138
+ "Model initialization failure should raise an exception."
139
+ )
@@ -3,8 +3,10 @@ Unit Tests for the PDF agent.
3
3
  """
4
4
 
5
5
  from unittest import mock
6
+
6
7
  import pytest
7
- from langchain_core.messages import HumanMessage, AIMessage
8
+ from langchain_core.messages import AIMessage, HumanMessage
9
+
8
10
  from ..agents.pdf_agent import get_app
9
11
  from ..state.state_talk2scholars import Talk2Scholars
10
12
 
@@ -29,9 +31,7 @@ def mock_tools_fixture():
29
31
  "aiagents4pharma.talk2scholars.agents.pdf_agent.question_and_answer"
30
32
  ) as mock_question_and_answer,
31
33
  ):
32
- mock_question_and_answer.return_value = {
33
- "result": "Mock Question and Answer Result"
34
- }
34
+ mock_question_and_answer.return_value = {"result": "Mock Question and Answer Result"}
35
35
  yield [mock_question_and_answer]
36
36
 
37
37
 
@@ -58,9 +58,7 @@ def test_pdf_agent_invocation(mock_llm):
58
58
  """Test that the PDF agent processes user input and returns a valid response."""
59
59
  thread_id = "test_thread"
60
60
  # Create a sample state with a human message.
61
- mock_state = Talk2Scholars(
62
- messages=[HumanMessage(content="Extract key data from PDF")]
63
- )
61
+ mock_state = Talk2Scholars(messages=[HumanMessage(content="Extract key data from PDF")])
64
62
  with mock.patch(
65
63
  "aiagents4pharma.talk2scholars.agents.pdf_agent.create_react_agent"
66
64
  ) as mock_create:
@@ -95,9 +93,7 @@ def test_pdf_agent_tools_assignment(request, mock_llm):
95
93
  mock.patch(
96
94
  "aiagents4pharma.talk2scholars.agents.pdf_agent.create_react_agent"
97
95
  ) as mock_create,
98
- mock.patch(
99
- "aiagents4pharma.talk2scholars.agents.pdf_agent.ToolNode"
100
- ) as mock_toolnode,
96
+ mock.patch("aiagents4pharma.talk2scholars.agents.pdf_agent.ToolNode") as mock_toolnode,
101
97
  ):
102
98
  mock_agent = mock.Mock()
103
99
  mock_create.return_value = mock_agent