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,6 +5,7 @@ Test cases for utils/enrichments/reactome_pathways.py
5
5
  """
6
6
 
7
7
  import pytest
8
+
8
9
  from ..utils.enrichments.reactome_pathways import EnrichmentWithReactome
9
10
 
10
11
  # In this test, we will consider 2 examples:
@@ -18,26 +19,25 @@ FIRST_PATHWAY = "Cyclic GMP-AMP (cGAMP) synthase (cGAS) was identified as a cyto
18
19
  SECOND_PATHWAY = "The P2RX7 (P2X7, P2Z) trimer binds ATP,"
19
20
  # The expected description of pathway R-HSA-1234567 is None.
20
21
 
22
+
21
23
  @pytest.fixture(name="enrich_obj")
22
24
  def fixture_uniprot_config():
23
25
  """Return a dictionary with the configuration for Reactome enrichment."""
24
26
  return EnrichmentWithReactome()
25
27
 
28
+
26
29
  def test_enrich_documents(enrich_obj):
27
30
  """Test the enrich_documents method."""
28
- reactome_pathways = ["R-HSA-3244647",
29
- "R-HSA-9905952",
30
- "R-HSA-1234567"]
31
+ reactome_pathways = ["R-HSA-3244647", "R-HSA-9905952", "R-HSA-1234567"]
31
32
  descriptions = enrich_obj.enrich_documents(reactome_pathways)
32
33
  assert descriptions[0].startswith(FIRST_PATHWAY)
33
34
  assert descriptions[1].startswith(SECOND_PATHWAY)
34
35
  assert descriptions[2] is None
35
36
 
37
+
36
38
  def test_enrich_documents_with_rag(enrich_obj):
37
39
  """Test the enrich_documents_with_rag method."""
38
- reactome_pathways = ["R-HSA-3244647",
39
- "R-HSA-9905952",
40
- "R-HSA-1234567"]
40
+ reactome_pathways = ["R-HSA-3244647", "R-HSA-9905952", "R-HSA-1234567"]
41
41
  descriptions = enrich_obj.enrich_documents_with_rag(reactome_pathways, None)
42
42
  assert descriptions[0].startswith(FIRST_PATHWAY)
43
43
  assert descriptions[1].startswith(SECOND_PATHWAY)
@@ -5,6 +5,7 @@ Test cases for utils/enrichments/uniprot_proteins.py
5
5
  """
6
6
 
7
7
  import pytest
8
+
8
9
  from ..utils.enrichments.uniprot_proteins import EnrichmentWithUniProt
9
10
 
10
11
  # In this test, we will consider 2 examples:
@@ -16,11 +17,13 @@ START_DESCP = "Multifunctional transcription factor"
16
17
  # The expected amino acid sequence of TP53 startswith:
17
18
  START_SEQ = "MEEPQSDPSV"
18
19
 
20
+
19
21
  @pytest.fixture(name="enrich_obj")
20
22
  def fixture_uniprot_config():
21
23
  """Return a dictionary with the configuration for UniProt enrichment."""
22
24
  return EnrichmentWithUniProt()
23
25
 
26
+
24
27
  def test_enrich_documents(enrich_obj):
25
28
  """Test the enrich_documents method."""
26
29
  gene_names = ["TP53", "TP5", "XZ"]
@@ -32,6 +35,7 @@ def test_enrich_documents(enrich_obj):
32
35
  assert descriptions[2] is None
33
36
  assert sequences[2] is None
34
37
 
38
+
35
39
  def test_enrich_documents_with_rag(enrich_obj):
36
40
  """Test the enrich_documents_with_rag method."""
37
41
  gene_names = ["TP53", "TP5", "XZ"]
@@ -5,44 +5,55 @@ Test cases for tools/utils/extractions/milvus_multimodal_pcst.py
5
5
  import importlib
6
6
  import sys
7
7
  import unittest
8
- from unittest.mock import patch, MagicMock, mock_open
8
+ from unittest.mock import MagicMock, mock_open, patch
9
+
9
10
  import numpy as np
10
11
  import pandas as pd
12
+
11
13
  from ..utils.extractions.milvus_multimodal_pcst import (
12
- MultimodalPCSTPruning, SystemDetector, DynamicLibraryLoader
14
+ DynamicLibraryLoader,
15
+ MultimodalPCSTPruning,
16
+ SystemDetector,
13
17
  )
14
18
 
19
+
15
20
  class TestMultimodalPCSTPruning(unittest.TestCase):
16
21
  """
17
22
  Test cases for MultimodalPCSTPruning class (Milvus-based PCST pruning).
18
23
  """
24
+
19
25
  def setUp(self):
20
26
  # Patch cupy and cudf to simulate GPU environment
21
- patcher_cupy = patch.dict('sys.modules', {'cupy': MagicMock(), 'cudf': MagicMock()})
27
+ patcher_cupy = patch.dict("sys.modules", {"cupy": MagicMock(), "cudf": MagicMock()})
22
28
  patcher_cupy.start()
23
29
  self.addCleanup(patcher_cupy.stop)
24
30
 
25
31
  # Patch pcst_fast
26
- pcst_fast_patcher = patch("aiagents4pharma.talk2knowledgegraphs.utils."
27
- "extractions.milvus_multimodal_pcst.pcst_fast")
32
+ pcst_fast_patcher = patch(
33
+ "aiagents4pharma.talk2knowledgegraphs.utils."
34
+ "extractions.milvus_multimodal_pcst.pcst_fast"
35
+ )
28
36
  mock_pcst_fast = pcst_fast_patcher.start()
29
37
  self.addCleanup(pcst_fast_patcher.stop)
30
38
  mock_pcst_fast.pcst_fast.return_value = ([0, 1], [0])
31
39
 
32
40
  # Patch Collection
33
- collection_patcher = patch("aiagents4pharma.talk2knowledgegraphs.utils."
34
- "extractions.milvus_multimodal_pcst.Collection")
41
+ collection_patcher = patch(
42
+ "aiagents4pharma.talk2knowledgegraphs.utils."
43
+ "extractions.milvus_multimodal_pcst.Collection"
44
+ )
35
45
  self.mock_collection = collection_patcher.start()
36
46
  self.addCleanup(collection_patcher.stop)
37
47
 
38
48
  # Patch open for cache_edge_index_path
39
- open_patcher = patch('builtins.open', mock_open(read_data='[[0,1],[1,2]]'))
49
+ open_patcher = patch("builtins.open", mock_open(read_data="[[0,1],[1,2]]"))
40
50
  open_patcher.start()
41
51
  self.addCleanup(open_patcher.stop)
42
52
 
43
53
  # Patch pickle.load to return a numpy array for edge_index
44
- pickle_patcher = patch("aiagents4pharma.talk2knowledgegraphs.utils."
45
- "extractions.milvus_multimodal_pcst.pickle")
54
+ pickle_patcher = patch(
55
+ "aiagents4pharma.talk2knowledgegraphs.utils.extractions.milvus_multimodal_pcst.pickle"
56
+ )
46
57
  mock_pickle = pickle_patcher.start()
47
58
  self.addCleanup(pickle_patcher.stop)
48
59
  mock_pickle.load.return_value = np.array([[0, 1], [1, 2]])
@@ -59,13 +70,15 @@ class TestMultimodalPCSTPruning(unittest.TestCase):
59
70
  edge_coll = MagicMock()
60
71
  edge_coll.num_entities = 2
61
72
  edge_coll.search.return_value = [[MagicMock(id=0, score=1.0), MagicMock(id=1, score=0.5)]]
62
- self.mock_collection.side_effect = lambda name: node_coll if "nodes" in name else edge_coll
73
+ self.mock_collection.side_effect = lambda name: (
74
+ node_coll if "nodes" in name else edge_coll
75
+ )
63
76
 
64
77
  # Setup mock loader
65
78
  self.mock_loader = MagicMock()
66
79
  self.mock_loader.py = np # Use numpy for array operations
67
80
  self.mock_loader.df = pd # Use pandas for dataframes
68
- self.mock_loader.to_list = lambda x: x.tolist() if hasattr(x, 'tolist') else list(x)
81
+ self.mock_loader.to_list = lambda x: x.tolist() if hasattr(x, "tolist") else list(x)
69
82
 
70
83
  def test_extract_subgraph_use_description_true(self):
71
84
  """
@@ -73,9 +86,17 @@ class TestMultimodalPCSTPruning(unittest.TestCase):
73
86
  """
74
87
  # Create instance
75
88
  pcst = MultimodalPCSTPruning(
76
- topk=3, topk_e=3, cost_e=0.5, c_const=0.01, root=-1,
77
- num_clusters=1, pruning="gw", verbosity_level=0, use_description=True, metric_type="IP",
78
- loader=self.mock_loader
89
+ topk=3,
90
+ topk_e=3,
91
+ cost_e=0.5,
92
+ c_const=0.01,
93
+ root=-1,
94
+ num_clusters=1,
95
+ pruning="gw",
96
+ verbosity_level=0,
97
+ use_description=True,
98
+ metric_type="IP",
99
+ loader=self.mock_loader,
79
100
  )
80
101
  # Dummy embeddings
81
102
  text_emb = [0.1, 0.2, 0.3]
@@ -97,10 +118,17 @@ class TestMultimodalPCSTPruning(unittest.TestCase):
97
118
  """
98
119
  # Create instance
99
120
  pcst = MultimodalPCSTPruning(
100
- topk=3, topk_e=3, cost_e=0.5, c_const=0.01, root=-1,
101
- num_clusters=1, pruning="gw", verbosity_level=0, use_description=False,
121
+ topk=3,
122
+ topk_e=3,
123
+ cost_e=0.5,
124
+ c_const=0.01,
125
+ root=-1,
126
+ num_clusters=1,
127
+ pruning="gw",
128
+ verbosity_level=0,
129
+ use_description=False,
102
130
  metric_type="IP",
103
- loader=self.mock_loader
131
+ loader=self.mock_loader,
104
132
  )
105
133
  # Dummy embeddings
106
134
  text_emb = [0.1, 0.2, 0.3]
@@ -121,9 +149,17 @@ class TestMultimodalPCSTPruning(unittest.TestCase):
121
149
  Test get_subgraph_nodes_edges with virtual vertices present (len(virtual_vertices) > 0).
122
150
  """
123
151
  pcst = MultimodalPCSTPruning(
124
- topk=3, topk_e=3, cost_e=0.5, c_const=0.01, root=-1,
125
- num_clusters=1, pruning="gw", verbosity_level=0, use_description=True, metric_type="IP",
126
- loader=self.mock_loader
152
+ topk=3,
153
+ topk_e=3,
154
+ cost_e=0.5,
155
+ c_const=0.01,
156
+ root=-1,
157
+ num_clusters=1,
158
+ pruning="gw",
159
+ verbosity_level=0,
160
+ use_description=True,
161
+ metric_type="IP",
162
+ loader=self.mock_loader,
127
163
  )
128
164
  # Simulate num_nodes = 2, vertices contains [0, 1, 2, 3] (2 and 3 are virtual)
129
165
  num_nodes = 2
@@ -133,13 +169,10 @@ class TestMultimodalPCSTPruning(unittest.TestCase):
133
169
  edges_dict = {
134
170
  "edges": np.array([0, 1, 2]),
135
171
  "num_prior_edges": 2,
136
- "edge_index": np.array([[0, 1, 2, 3], [1, 2, 3, 4]])
172
+ "edge_index": np.array([[0, 1, 2, 3], [1, 2, 3, 4]]),
137
173
  }
138
174
  # mapping simulates mapping for edges and nodes
139
- mapping = {
140
- "edges": {0: 0, 1: 1},
141
- "nodes": {2: 2, 3: 3}
142
- }
175
+ mapping = {"edges": {0: 0, 1: 1}, "nodes": {2: 2, 3: 3}}
143
176
 
144
177
  # Call extract_subgraph
145
178
  result = pcst.get_subgraph_nodes_edges(num_nodes, vertices, edges_dict, mapping)
@@ -157,8 +190,9 @@ class TestMultimodalPCSTPruning(unittest.TestCase):
157
190
  Test coverage for GPU import branch by patching sys.modules to mock cupy and
158
191
  cudf as numpy and pandas.
159
192
  """
160
- module_name = "aiagents4pharma.talk2knowledgegraphs.utils" + \
161
- ".extractions.milvus_multimodal_pcst"
193
+ module_name = (
194
+ "aiagents4pharma.talk2knowledgegraphs.utils" + ".extractions.milvus_multimodal_pcst"
195
+ )
162
196
  with patch.dict("sys.modules", {"cupy": np, "cudf": pd}):
163
197
  # Reload the module to trigger the GPU branch
164
198
  mod = importlib.reload(sys.modules[module_name])
@@ -168,14 +202,24 @@ class TestMultimodalPCSTPruning(unittest.TestCase):
168
202
  mock_pickle = MagicMock()
169
203
  mock_pickle.load.return_value = np.array([[0, 1], [1, 2]])
170
204
  # Patch Collection, pcst_fast, and pickle after reload
171
- with patch(f"{module_name}.Collection", self.mock_collection), \
172
- patch(f"{module_name}.pcst_fast", mock_pcst_fast), \
173
- patch(f"{module_name}.pickle", mock_pickle):
174
- pcst_pruning_cls = getattr(mod, "MultimodalPCSTPruning")
205
+ with (
206
+ patch(f"{module_name}.Collection", self.mock_collection),
207
+ patch(f"{module_name}.pcst_fast", mock_pcst_fast),
208
+ patch(f"{module_name}.pickle", mock_pickle),
209
+ ):
210
+ pcst_pruning_cls = mod.MultimodalPCSTPruning
175
211
  pcst = pcst_pruning_cls(
176
- topk=3, topk_e=3, cost_e=0.5, c_const=0.01, root=-1,
177
- num_clusters=1, pruning="gw", verbosity_level=0, use_description=True,
178
- metric_type="IP", loader=self.mock_loader
212
+ topk=3,
213
+ topk_e=3,
214
+ cost_e=0.5,
215
+ c_const=0.01,
216
+ root=-1,
217
+ num_clusters=1,
218
+ pruning="gw",
219
+ verbosity_level=0,
220
+ use_description=True,
221
+ metric_type="IP",
222
+ loader=self.mock_loader,
179
223
  )
180
224
  # Dummy embeddings
181
225
  text_emb = [0.1, 0.2, 0.3]
@@ -195,15 +239,15 @@ class TestMultimodalPCSTPruning(unittest.TestCase):
195
239
  class TestSystemDetector(unittest.TestCase):
196
240
  """Test cases for SystemDetector class."""
197
241
 
198
- @patch('aiagents4pharma.talk2knowledgegraphs.utils.extractions.'
199
- 'milvus_multimodal_pcst.platform')
200
- @patch('aiagents4pharma.talk2knowledgegraphs.utils.extractions.'
201
- 'milvus_multimodal_pcst.subprocess')
242
+ @patch("aiagents4pharma.talk2knowledgegraphs.utils.extractions.milvus_multimodal_pcst.platform")
243
+ @patch(
244
+ "aiagents4pharma.talk2knowledgegraphs.utils.extractions.milvus_multimodal_pcst.subprocess"
245
+ )
202
246
  def test_system_detector_gpu_detected(self, mock_subprocess, mock_platform):
203
247
  """Test SystemDetector when GPU is detected."""
204
248
  # Mock platform calls
205
- mock_platform.system.return_value = 'Linux'
206
- mock_platform.machine.return_value = 'x86_64'
249
+ mock_platform.system.return_value = "Linux"
250
+ mock_platform.machine.return_value = "x86_64"
207
251
 
208
252
  # Mock successful nvidia-smi call
209
253
  mock_result = MagicMock()
@@ -213,20 +257,20 @@ class TestSystemDetector(unittest.TestCase):
213
257
  detector = SystemDetector()
214
258
 
215
259
  # Assertions
216
- self.assertEqual(detector.os_type, 'linux')
217
- self.assertEqual(detector.architecture, 'x86_64')
260
+ self.assertEqual(detector.os_type, "linux")
261
+ self.assertEqual(detector.architecture, "x86_64")
218
262
  self.assertTrue(detector.has_nvidia_gpu)
219
263
  self.assertTrue(detector.use_gpu)
220
264
 
221
- @patch('aiagents4pharma.talk2knowledgegraphs.utils.extractions.'
222
- 'milvus_multimodal_pcst.platform')
223
- @patch('aiagents4pharma.talk2knowledgegraphs.utils.extractions.'
224
- 'milvus_multimodal_pcst.subprocess')
265
+ @patch("aiagents4pharma.talk2knowledgegraphs.utils.extractions.milvus_multimodal_pcst.platform")
266
+ @patch(
267
+ "aiagents4pharma.talk2knowledgegraphs.utils.extractions.milvus_multimodal_pcst.subprocess"
268
+ )
225
269
  def test_system_detector_no_gpu(self, mock_subprocess, mock_platform):
226
270
  """Test SystemDetector when no GPU is detected."""
227
271
  # Mock platform calls
228
- mock_platform.system.return_value = 'Linux'
229
- mock_platform.machine.return_value = 'x86_64'
272
+ mock_platform.system.return_value = "Linux"
273
+ mock_platform.machine.return_value = "x86_64"
230
274
 
231
275
  # Mock failed nvidia-smi call
232
276
  mock_result = MagicMock()
@@ -236,20 +280,20 @@ class TestSystemDetector(unittest.TestCase):
236
280
  detector = SystemDetector()
237
281
 
238
282
  # Assertions
239
- self.assertEqual(detector.os_type, 'linux')
240
- self.assertEqual(detector.architecture, 'x86_64')
283
+ self.assertEqual(detector.os_type, "linux")
284
+ self.assertEqual(detector.architecture, "x86_64")
241
285
  self.assertFalse(detector.has_nvidia_gpu)
242
286
  self.assertFalse(detector.use_gpu)
243
287
 
244
- @patch('aiagents4pharma.talk2knowledgegraphs.utils.extractions.'
245
- 'milvus_multimodal_pcst.platform')
246
- @patch('aiagents4pharma.talk2knowledgegraphs.utils.extractions.'
247
- 'milvus_multimodal_pcst.subprocess')
288
+ @patch("aiagents4pharma.talk2knowledgegraphs.utils.extractions.milvus_multimodal_pcst.platform")
289
+ @patch(
290
+ "aiagents4pharma.talk2knowledgegraphs.utils.extractions.milvus_multimodal_pcst.subprocess"
291
+ )
248
292
  def test_system_detector_macos_no_gpu(self, mock_subprocess, mock_platform):
249
293
  """Test SystemDetector on macOS (no GPU support)."""
250
294
  # Mock platform calls
251
- mock_platform.system.return_value = 'Darwin'
252
- mock_platform.machine.return_value = 'arm64'
295
+ mock_platform.system.return_value = "Darwin"
296
+ mock_platform.machine.return_value = "arm64"
253
297
 
254
298
  # Mock successful nvidia-smi call (but macOS should still disable GPU)
255
299
  mock_result = MagicMock()
@@ -259,20 +303,20 @@ class TestSystemDetector(unittest.TestCase):
259
303
  detector = SystemDetector()
260
304
 
261
305
  # Assertions
262
- self.assertEqual(detector.os_type, 'darwin')
263
- self.assertEqual(detector.architecture, 'arm64')
306
+ self.assertEqual(detector.os_type, "darwin")
307
+ self.assertEqual(detector.architecture, "arm64")
264
308
  self.assertTrue(detector.has_nvidia_gpu) # GPU detected
265
309
  self.assertFalse(detector.use_gpu) # But not used on macOS
266
310
 
267
- @patch('aiagents4pharma.talk2knowledgegraphs.utils.extractions.'
268
- 'milvus_multimodal_pcst.platform')
269
- @patch('aiagents4pharma.talk2knowledgegraphs.utils.extractions.'
270
- 'milvus_multimodal_pcst.subprocess')
311
+ @patch("aiagents4pharma.talk2knowledgegraphs.utils.extractions.milvus_multimodal_pcst.platform")
312
+ @patch(
313
+ "aiagents4pharma.talk2knowledgegraphs.utils.extractions.milvus_multimodal_pcst.subprocess"
314
+ )
271
315
  def test_system_detector_subprocess_exception(self, mock_subprocess, mock_platform):
272
316
  """Test SystemDetector when subprocess raises exception."""
273
317
  # Mock platform calls
274
- mock_platform.system.return_value = 'Linux'
275
- mock_platform.machine.return_value = 'x86_64'
318
+ mock_platform.system.return_value = "Linux"
319
+ mock_platform.machine.return_value = "x86_64"
276
320
 
277
321
  # Mock subprocess to raise FileNotFoundError
278
322
  mock_subprocess.run.side_effect = FileNotFoundError("nvidia-smi not found")
@@ -282,20 +326,20 @@ class TestSystemDetector(unittest.TestCase):
282
326
  detector = SystemDetector()
283
327
 
284
328
  # Assertions
285
- self.assertEqual(detector.os_type, 'linux')
286
- self.assertEqual(detector.architecture, 'x86_64')
329
+ self.assertEqual(detector.os_type, "linux")
330
+ self.assertEqual(detector.architecture, "x86_64")
287
331
  self.assertFalse(detector.has_nvidia_gpu)
288
332
  self.assertFalse(detector.use_gpu)
289
333
 
290
- @patch('aiagents4pharma.talk2knowledgegraphs.utils.extractions.'
291
- 'milvus_multimodal_pcst.platform')
292
- @patch('aiagents4pharma.talk2knowledgegraphs.utils.extractions.'
293
- 'milvus_multimodal_pcst.subprocess')
334
+ @patch("aiagents4pharma.talk2knowledgegraphs.utils.extractions.milvus_multimodal_pcst.platform")
335
+ @patch(
336
+ "aiagents4pharma.talk2knowledgegraphs.utils.extractions.milvus_multimodal_pcst.subprocess"
337
+ )
294
338
  def test_system_detector_timeout(self, mock_subprocess, mock_platform):
295
339
  """Test SystemDetector when subprocess times out."""
296
340
  # Mock platform calls
297
- mock_platform.system.return_value = 'Linux'
298
- mock_platform.machine.return_value = 'x86_64'
341
+ mock_platform.system.return_value = "Linux"
342
+ mock_platform.machine.return_value = "x86_64"
299
343
 
300
344
  # Mock subprocess to raise TimeoutExpired
301
345
  mock_subprocess.TimeoutExpired = Exception
@@ -305,20 +349,25 @@ class TestSystemDetector(unittest.TestCase):
305
349
  detector = SystemDetector()
306
350
 
307
351
  # Assertions
308
- self.assertEqual(detector.os_type, 'linux')
309
- self.assertEqual(detector.architecture, 'x86_64')
352
+ self.assertEqual(detector.os_type, "linux")
353
+ self.assertEqual(detector.architecture, "x86_64")
310
354
  self.assertFalse(detector.has_nvidia_gpu)
311
355
  self.assertFalse(detector.use_gpu)
312
356
 
313
357
  def test_get_system_info(self):
314
358
  """Test get_system_info method."""
315
- with patch('aiagents4pharma.talk2knowledgegraphs.utils.extractions.'
316
- 'milvus_multimodal_pcst.platform') as mock_platform, \
317
- patch('aiagents4pharma.talk2knowledgegraphs.utils.extractions.'
318
- 'milvus_multimodal_pcst.subprocess') as mock_subprocess:
319
-
320
- mock_platform.system.return_value = 'Linux'
321
- mock_platform.machine.return_value = 'x86_64'
359
+ with (
360
+ patch(
361
+ "aiagents4pharma.talk2knowledgegraphs.utils.extractions."
362
+ "milvus_multimodal_pcst.platform"
363
+ ) as mock_platform,
364
+ patch(
365
+ "aiagents4pharma.talk2knowledgegraphs.utils.extractions."
366
+ "milvus_multimodal_pcst.subprocess"
367
+ ) as mock_subprocess,
368
+ ):
369
+ mock_platform.system.return_value = "Linux"
370
+ mock_platform.machine.return_value = "x86_64"
322
371
 
323
372
  mock_result = MagicMock()
324
373
  mock_result.returncode = 0
@@ -337,13 +386,18 @@ class TestSystemDetector(unittest.TestCase):
337
386
 
338
387
  def test_is_gpu_compatible(self):
339
388
  """Test is_gpu_compatible method."""
340
- with patch('aiagents4pharma.talk2knowledgegraphs.utils.extractions.'
341
- 'milvus_multimodal_pcst.platform') as mock_platform, \
342
- patch('aiagents4pharma.talk2knowledgegraphs.utils.extractions.'
343
- 'milvus_multimodal_pcst.subprocess') as mock_subprocess:
344
-
345
- mock_platform.system.return_value = 'Linux'
346
- mock_platform.machine.return_value = 'x86_64'
389
+ with (
390
+ patch(
391
+ "aiagents4pharma.talk2knowledgegraphs.utils.extractions."
392
+ "milvus_multimodal_pcst.platform"
393
+ ) as mock_platform,
394
+ patch(
395
+ "aiagents4pharma.talk2knowledgegraphs.utils.extractions."
396
+ "milvus_multimodal_pcst.subprocess"
397
+ ) as mock_subprocess,
398
+ ):
399
+ mock_platform.system.return_value = "Linux"
400
+ mock_platform.machine.return_value = "x86_64"
347
401
 
348
402
  mock_result = MagicMock()
349
403
  mock_result.returncode = 0
@@ -375,14 +429,17 @@ class TestDynamicLibraryLoader(unittest.TestCase):
375
429
  self.assertFalse(loader.normalize_vectors)
376
430
  self.assertEqual(loader.metric_type, "COSINE")
377
431
 
378
- @patch.dict('sys.modules', {'cupy': MagicMock(), 'cudf': MagicMock()})
432
+ @patch.dict("sys.modules", {"cupy": MagicMock(), "cudf": MagicMock()})
379
433
  def test_dynamic_library_loader_gpu_mode_success(self):
380
434
  """Test DynamicLibraryLoader in GPU mode with successful imports."""
381
435
  self.mock_detector.use_gpu = True
382
436
 
383
437
  # Mock the CUDF_AVAILABLE flag
384
- with patch('aiagents4pharma.talk2knowledgegraphs.utils.extractions.'
385
- 'milvus_multimodal_pcst.CUDF_AVAILABLE', True):
438
+ with patch(
439
+ "aiagents4pharma.talk2knowledgegraphs.utils.extractions."
440
+ "milvus_multimodal_pcst.CUDF_AVAILABLE",
441
+ True,
442
+ ):
386
443
  loader = DynamicLibraryLoader(self.mock_detector)
387
444
 
388
445
  # Assertions
@@ -395,8 +452,11 @@ class TestDynamicLibraryLoader(unittest.TestCase):
395
452
  self.mock_detector.use_gpu = True
396
453
 
397
454
  # Mock CUDF_AVAILABLE as False to simulate import failure
398
- with patch('aiagents4pharma.talk2knowledgegraphs.utils.extractions.'
399
- 'milvus_multimodal_pcst.CUDF_AVAILABLE', False):
455
+ with patch(
456
+ "aiagents4pharma.talk2knowledgegraphs.utils.extractions."
457
+ "milvus_multimodal_pcst.CUDF_AVAILABLE",
458
+ False,
459
+ ):
400
460
  loader = DynamicLibraryLoader(self.mock_detector)
401
461
 
402
462
  # Should fallback to CPU mode
@@ -446,13 +506,16 @@ class TestDynamicLibraryLoader(unittest.TestCase):
446
506
  # Should return matrix unchanged in CPU mode even when normalize_vectors is True
447
507
  np.testing.assert_array_equal(result, matrix)
448
508
 
449
- @patch.dict('sys.modules', {'cupy': MagicMock(), 'cudf': MagicMock()})
509
+ @patch.dict("sys.modules", {"cupy": MagicMock(), "cudf": MagicMock()})
450
510
  def test_normalize_matrix_gpu_mode(self):
451
511
  """Test normalize_matrix in GPU mode."""
452
512
  self.mock_detector.use_gpu = True
453
513
 
454
- with patch('aiagents4pharma.talk2knowledgegraphs.utils.extractions.'
455
- 'milvus_multimodal_pcst.CUDF_AVAILABLE', True):
514
+ with patch(
515
+ "aiagents4pharma.talk2knowledgegraphs.utils.extractions."
516
+ "milvus_multimodal_pcst.CUDF_AVAILABLE",
517
+ True,
518
+ ):
456
519
  loader = DynamicLibraryLoader(self.mock_detector)
457
520
 
458
521
  # Mock cupy operations
@@ -2,9 +2,10 @@
2
2
  Test cases for utils/kg_utils.py
3
3
  """
4
4
 
5
- import pytest
6
5
  import networkx as nx
7
6
  import pandas as pd
7
+ import pytest
8
+
8
9
  from ..utils import kg_utils
9
10
 
10
11
 
@@ -62,9 +63,7 @@ def test_df_pandas_to_kg():
62
63
  }
63
64
  df_edges = pd.DataFrame(edges_data)
64
65
 
65
- kg = kg_utils.df_pandas_to_kg(
66
- df_edges, df_nodes_attrs, "node_source", "node_target"
67
- )
66
+ kg = kg_utils.df_pandas_to_kg(df_edges, df_nodes_attrs, "node_source", "node_target")
68
67
 
69
68
  assert len(kg.nodes) == 2
70
69
  assert len(kg.edges) == 1