aiagents4pharma 0.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (336) hide show
  1. aiagents4pharma/__init__.py +11 -0
  2. aiagents4pharma/talk2aiagents4pharma/.dockerignore +13 -0
  3. aiagents4pharma/talk2aiagents4pharma/Dockerfile +133 -0
  4. aiagents4pharma/talk2aiagents4pharma/README.md +1 -0
  5. aiagents4pharma/talk2aiagents4pharma/__init__.py +5 -0
  6. aiagents4pharma/talk2aiagents4pharma/agents/__init__.py +6 -0
  7. aiagents4pharma/talk2aiagents4pharma/agents/main_agent.py +70 -0
  8. aiagents4pharma/talk2aiagents4pharma/configs/__init__.py +5 -0
  9. aiagents4pharma/talk2aiagents4pharma/configs/agents/__init__.py +5 -0
  10. aiagents4pharma/talk2aiagents4pharma/configs/agents/main_agent/default.yaml +29 -0
  11. aiagents4pharma/talk2aiagents4pharma/configs/app/__init__.py +0 -0
  12. aiagents4pharma/talk2aiagents4pharma/configs/app/frontend/__init__.py +0 -0
  13. aiagents4pharma/talk2aiagents4pharma/configs/app/frontend/default.yaml +102 -0
  14. aiagents4pharma/talk2aiagents4pharma/configs/config.yaml +4 -0
  15. aiagents4pharma/talk2aiagents4pharma/docker-compose/cpu/.env.example +23 -0
  16. aiagents4pharma/talk2aiagents4pharma/docker-compose/cpu/docker-compose.yml +93 -0
  17. aiagents4pharma/talk2aiagents4pharma/docker-compose/gpu/.env.example +23 -0
  18. aiagents4pharma/talk2aiagents4pharma/docker-compose/gpu/docker-compose.yml +108 -0
  19. aiagents4pharma/talk2aiagents4pharma/install.md +154 -0
  20. aiagents4pharma/talk2aiagents4pharma/states/__init__.py +5 -0
  21. aiagents4pharma/talk2aiagents4pharma/states/state_talk2aiagents4pharma.py +18 -0
  22. aiagents4pharma/talk2aiagents4pharma/tests/__init__.py +3 -0
  23. aiagents4pharma/talk2aiagents4pharma/tests/test_main_agent.py +312 -0
  24. aiagents4pharma/talk2biomodels/.dockerignore +13 -0
  25. aiagents4pharma/talk2biomodels/Dockerfile +104 -0
  26. aiagents4pharma/talk2biomodels/README.md +1 -0
  27. aiagents4pharma/talk2biomodels/__init__.py +5 -0
  28. aiagents4pharma/talk2biomodels/agents/__init__.py +6 -0
  29. aiagents4pharma/talk2biomodels/agents/t2b_agent.py +104 -0
  30. aiagents4pharma/talk2biomodels/api/__init__.py +5 -0
  31. aiagents4pharma/talk2biomodels/api/ols.py +75 -0
  32. aiagents4pharma/talk2biomodels/api/uniprot.py +36 -0
  33. aiagents4pharma/talk2biomodels/configs/__init__.py +5 -0
  34. aiagents4pharma/talk2biomodels/configs/agents/__init__.py +5 -0
  35. aiagents4pharma/talk2biomodels/configs/agents/t2b_agent/__init__.py +3 -0
  36. aiagents4pharma/talk2biomodels/configs/agents/t2b_agent/default.yaml +14 -0
  37. aiagents4pharma/talk2biomodels/configs/app/__init__.py +0 -0
  38. aiagents4pharma/talk2biomodels/configs/app/frontend/__init__.py +0 -0
  39. aiagents4pharma/talk2biomodels/configs/app/frontend/default.yaml +72 -0
  40. aiagents4pharma/talk2biomodels/configs/config.yaml +7 -0
  41. aiagents4pharma/talk2biomodels/configs/tools/__init__.py +5 -0
  42. aiagents4pharma/talk2biomodels/configs/tools/ask_question/__init__.py +3 -0
  43. aiagents4pharma/talk2biomodels/configs/tools/ask_question/default.yaml +30 -0
  44. aiagents4pharma/talk2biomodels/configs/tools/custom_plotter/__init__.py +3 -0
  45. aiagents4pharma/talk2biomodels/configs/tools/custom_plotter/default.yaml +8 -0
  46. aiagents4pharma/talk2biomodels/configs/tools/get_annotation/__init__.py +3 -0
  47. aiagents4pharma/talk2biomodels/configs/tools/get_annotation/default.yaml +8 -0
  48. aiagents4pharma/talk2biomodels/install.md +63 -0
  49. aiagents4pharma/talk2biomodels/models/__init__.py +5 -0
  50. aiagents4pharma/talk2biomodels/models/basico_model.py +125 -0
  51. aiagents4pharma/talk2biomodels/models/sys_bio_model.py +60 -0
  52. aiagents4pharma/talk2biomodels/states/__init__.py +6 -0
  53. aiagents4pharma/talk2biomodels/states/state_talk2biomodels.py +49 -0
  54. aiagents4pharma/talk2biomodels/tests/BIOMD0000000449_url.xml +1585 -0
  55. aiagents4pharma/talk2biomodels/tests/__init__.py +3 -0
  56. aiagents4pharma/talk2biomodels/tests/article_on_model_537.pdf +0 -0
  57. aiagents4pharma/talk2biomodels/tests/test_api.py +31 -0
  58. aiagents4pharma/talk2biomodels/tests/test_ask_question.py +42 -0
  59. aiagents4pharma/talk2biomodels/tests/test_basico_model.py +67 -0
  60. aiagents4pharma/talk2biomodels/tests/test_get_annotation.py +190 -0
  61. aiagents4pharma/talk2biomodels/tests/test_getmodelinfo.py +92 -0
  62. aiagents4pharma/talk2biomodels/tests/test_integration.py +116 -0
  63. aiagents4pharma/talk2biomodels/tests/test_load_biomodel.py +35 -0
  64. aiagents4pharma/talk2biomodels/tests/test_param_scan.py +71 -0
  65. aiagents4pharma/talk2biomodels/tests/test_query_article.py +184 -0
  66. aiagents4pharma/talk2biomodels/tests/test_save_model.py +47 -0
  67. aiagents4pharma/talk2biomodels/tests/test_search_models.py +35 -0
  68. aiagents4pharma/talk2biomodels/tests/test_simulate_model.py +44 -0
  69. aiagents4pharma/talk2biomodels/tests/test_steady_state.py +86 -0
  70. aiagents4pharma/talk2biomodels/tests/test_sys_bio_model.py +67 -0
  71. aiagents4pharma/talk2biomodels/tools/__init__.py +17 -0
  72. aiagents4pharma/talk2biomodels/tools/ask_question.py +125 -0
  73. aiagents4pharma/talk2biomodels/tools/custom_plotter.py +165 -0
  74. aiagents4pharma/talk2biomodels/tools/get_annotation.py +342 -0
  75. aiagents4pharma/talk2biomodels/tools/get_modelinfo.py +159 -0
  76. aiagents4pharma/talk2biomodels/tools/load_arguments.py +134 -0
  77. aiagents4pharma/talk2biomodels/tools/load_biomodel.py +44 -0
  78. aiagents4pharma/talk2biomodels/tools/parameter_scan.py +310 -0
  79. aiagents4pharma/talk2biomodels/tools/query_article.py +64 -0
  80. aiagents4pharma/talk2biomodels/tools/save_model.py +98 -0
  81. aiagents4pharma/talk2biomodels/tools/search_models.py +96 -0
  82. aiagents4pharma/talk2biomodels/tools/simulate_model.py +137 -0
  83. aiagents4pharma/talk2biomodels/tools/steady_state.py +187 -0
  84. aiagents4pharma/talk2biomodels/tools/utils.py +23 -0
  85. aiagents4pharma/talk2cells/README.md +1 -0
  86. aiagents4pharma/talk2cells/__init__.py +5 -0
  87. aiagents4pharma/talk2cells/agents/__init__.py +6 -0
  88. aiagents4pharma/talk2cells/agents/scp_agent.py +87 -0
  89. aiagents4pharma/talk2cells/states/__init__.py +6 -0
  90. aiagents4pharma/talk2cells/states/state_talk2cells.py +15 -0
  91. aiagents4pharma/talk2cells/tests/scp_agent/test_scp_agent.py +22 -0
  92. aiagents4pharma/talk2cells/tools/__init__.py +6 -0
  93. aiagents4pharma/talk2cells/tools/scp_agent/__init__.py +6 -0
  94. aiagents4pharma/talk2cells/tools/scp_agent/display_studies.py +27 -0
  95. aiagents4pharma/talk2cells/tools/scp_agent/search_studies.py +78 -0
  96. aiagents4pharma/talk2knowledgegraphs/.dockerignore +13 -0
  97. aiagents4pharma/talk2knowledgegraphs/Dockerfile +131 -0
  98. aiagents4pharma/talk2knowledgegraphs/README.md +1 -0
  99. aiagents4pharma/talk2knowledgegraphs/__init__.py +5 -0
  100. aiagents4pharma/talk2knowledgegraphs/agents/__init__.py +5 -0
  101. aiagents4pharma/talk2knowledgegraphs/agents/t2kg_agent.py +99 -0
  102. aiagents4pharma/talk2knowledgegraphs/configs/__init__.py +5 -0
  103. aiagents4pharma/talk2knowledgegraphs/configs/agents/t2kg_agent/__init__.py +3 -0
  104. aiagents4pharma/talk2knowledgegraphs/configs/agents/t2kg_agent/default.yaml +62 -0
  105. aiagents4pharma/talk2knowledgegraphs/configs/app/__init__.py +5 -0
  106. aiagents4pharma/talk2knowledgegraphs/configs/app/frontend/__init__.py +3 -0
  107. aiagents4pharma/talk2knowledgegraphs/configs/app/frontend/default.yaml +79 -0
  108. aiagents4pharma/talk2knowledgegraphs/configs/config.yaml +13 -0
  109. aiagents4pharma/talk2knowledgegraphs/configs/tools/__init__.py +5 -0
  110. aiagents4pharma/talk2knowledgegraphs/configs/tools/graphrag_reasoning/__init__.py +3 -0
  111. aiagents4pharma/talk2knowledgegraphs/configs/tools/graphrag_reasoning/default.yaml +24 -0
  112. aiagents4pharma/talk2knowledgegraphs/configs/tools/multimodal_subgraph_extraction/__init__.py +0 -0
  113. aiagents4pharma/talk2knowledgegraphs/configs/tools/multimodal_subgraph_extraction/default.yaml +33 -0
  114. aiagents4pharma/talk2knowledgegraphs/configs/tools/subgraph_extraction/__init__.py +3 -0
  115. aiagents4pharma/talk2knowledgegraphs/configs/tools/subgraph_extraction/default.yaml +43 -0
  116. aiagents4pharma/talk2knowledgegraphs/configs/tools/subgraph_summarization/__init__.py +3 -0
  117. aiagents4pharma/talk2knowledgegraphs/configs/tools/subgraph_summarization/default.yaml +9 -0
  118. aiagents4pharma/talk2knowledgegraphs/configs/utils/database/milvus/__init__.py +3 -0
  119. aiagents4pharma/talk2knowledgegraphs/configs/utils/database/milvus/default.yaml +61 -0
  120. aiagents4pharma/talk2knowledgegraphs/configs/utils/enrichments/ols_terms/default.yaml +3 -0
  121. aiagents4pharma/talk2knowledgegraphs/configs/utils/enrichments/reactome_pathways/default.yaml +3 -0
  122. aiagents4pharma/talk2knowledgegraphs/configs/utils/enrichments/uniprot_proteins/default.yaml +6 -0
  123. aiagents4pharma/talk2knowledgegraphs/configs/utils/pubchem_utils/default.yaml +5 -0
  124. aiagents4pharma/talk2knowledgegraphs/datasets/__init__.py +5 -0
  125. aiagents4pharma/talk2knowledgegraphs/datasets/biobridge_primekg.py +607 -0
  126. aiagents4pharma/talk2knowledgegraphs/datasets/dataset.py +25 -0
  127. aiagents4pharma/talk2knowledgegraphs/datasets/primekg.py +212 -0
  128. aiagents4pharma/talk2knowledgegraphs/datasets/starkqa_primekg.py +210 -0
  129. aiagents4pharma/talk2knowledgegraphs/docker-compose/cpu/.env.example +23 -0
  130. aiagents4pharma/talk2knowledgegraphs/docker-compose/cpu/docker-compose.yml +93 -0
  131. aiagents4pharma/talk2knowledgegraphs/docker-compose/gpu/.env.example +23 -0
  132. aiagents4pharma/talk2knowledgegraphs/docker-compose/gpu/docker-compose.yml +108 -0
  133. aiagents4pharma/talk2knowledgegraphs/entrypoint.sh +180 -0
  134. aiagents4pharma/talk2knowledgegraphs/install.md +165 -0
  135. aiagents4pharma/talk2knowledgegraphs/milvus_data_dump.py +886 -0
  136. aiagents4pharma/talk2knowledgegraphs/states/__init__.py +5 -0
  137. aiagents4pharma/talk2knowledgegraphs/states/state_talk2knowledgegraphs.py +40 -0
  138. aiagents4pharma/talk2knowledgegraphs/tests/__init__.py +0 -0
  139. aiagents4pharma/talk2knowledgegraphs/tests/test_agents_t2kg_agent.py +318 -0
  140. aiagents4pharma/talk2knowledgegraphs/tests/test_datasets_biobridge_primekg.py +248 -0
  141. aiagents4pharma/talk2knowledgegraphs/tests/test_datasets_dataset.py +33 -0
  142. aiagents4pharma/talk2knowledgegraphs/tests/test_datasets_primekg.py +86 -0
  143. aiagents4pharma/talk2knowledgegraphs/tests/test_datasets_starkqa_primekg.py +125 -0
  144. aiagents4pharma/talk2knowledgegraphs/tests/test_tools_graphrag_reasoning.py +257 -0
  145. aiagents4pharma/talk2knowledgegraphs/tests/test_tools_milvus_multimodal_subgraph_extraction.py +1444 -0
  146. aiagents4pharma/talk2knowledgegraphs/tests/test_tools_multimodal_subgraph_extraction.py +159 -0
  147. aiagents4pharma/talk2knowledgegraphs/tests/test_tools_subgraph_extraction.py +152 -0
  148. aiagents4pharma/talk2knowledgegraphs/tests/test_tools_subgraph_summarization.py +201 -0
  149. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_database_milvus_connection_manager.py +812 -0
  150. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_embeddings_embeddings.py +51 -0
  151. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_embeddings_huggingface.py +49 -0
  152. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_embeddings_nim_molmim.py +59 -0
  153. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_embeddings_ollama.py +63 -0
  154. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_embeddings_sentencetransformer.py +47 -0
  155. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_enrichments.py +40 -0
  156. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_ollama.py +94 -0
  157. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_ols.py +70 -0
  158. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_pubchem.py +45 -0
  159. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_reactome.py +44 -0
  160. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_uniprot.py +48 -0
  161. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_extractions_milvus_multimodal_pcst.py +759 -0
  162. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_kg_utils.py +78 -0
  163. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_pubchem_utils.py +123 -0
  164. aiagents4pharma/talk2knowledgegraphs/tools/__init__.py +11 -0
  165. aiagents4pharma/talk2knowledgegraphs/tools/graphrag_reasoning.py +138 -0
  166. aiagents4pharma/talk2knowledgegraphs/tools/load_arguments.py +22 -0
  167. aiagents4pharma/talk2knowledgegraphs/tools/milvus_multimodal_subgraph_extraction.py +965 -0
  168. aiagents4pharma/talk2knowledgegraphs/tools/multimodal_subgraph_extraction.py +374 -0
  169. aiagents4pharma/talk2knowledgegraphs/tools/subgraph_extraction.py +291 -0
  170. aiagents4pharma/talk2knowledgegraphs/tools/subgraph_summarization.py +123 -0
  171. aiagents4pharma/talk2knowledgegraphs/utils/__init__.py +5 -0
  172. aiagents4pharma/talk2knowledgegraphs/utils/database/__init__.py +5 -0
  173. aiagents4pharma/talk2knowledgegraphs/utils/database/milvus_connection_manager.py +586 -0
  174. aiagents4pharma/talk2knowledgegraphs/utils/embeddings/__init__.py +5 -0
  175. aiagents4pharma/talk2knowledgegraphs/utils/embeddings/embeddings.py +81 -0
  176. aiagents4pharma/talk2knowledgegraphs/utils/embeddings/huggingface.py +111 -0
  177. aiagents4pharma/talk2knowledgegraphs/utils/embeddings/nim_molmim.py +54 -0
  178. aiagents4pharma/talk2knowledgegraphs/utils/embeddings/ollama.py +87 -0
  179. aiagents4pharma/talk2knowledgegraphs/utils/embeddings/sentence_transformer.py +73 -0
  180. aiagents4pharma/talk2knowledgegraphs/utils/enrichments/__init__.py +12 -0
  181. aiagents4pharma/talk2knowledgegraphs/utils/enrichments/enrichments.py +37 -0
  182. aiagents4pharma/talk2knowledgegraphs/utils/enrichments/ollama.py +129 -0
  183. aiagents4pharma/talk2knowledgegraphs/utils/enrichments/ols_terms.py +89 -0
  184. aiagents4pharma/talk2knowledgegraphs/utils/enrichments/pubchem_strings.py +78 -0
  185. aiagents4pharma/talk2knowledgegraphs/utils/enrichments/reactome_pathways.py +71 -0
  186. aiagents4pharma/talk2knowledgegraphs/utils/enrichments/uniprot_proteins.py +98 -0
  187. aiagents4pharma/talk2knowledgegraphs/utils/extractions/__init__.py +5 -0
  188. aiagents4pharma/talk2knowledgegraphs/utils/extractions/milvus_multimodal_pcst.py +762 -0
  189. aiagents4pharma/talk2knowledgegraphs/utils/extractions/multimodal_pcst.py +298 -0
  190. aiagents4pharma/talk2knowledgegraphs/utils/extractions/pcst.py +229 -0
  191. aiagents4pharma/talk2knowledgegraphs/utils/kg_utils.py +67 -0
  192. aiagents4pharma/talk2knowledgegraphs/utils/pubchem_utils.py +104 -0
  193. aiagents4pharma/talk2scholars/.dockerignore +13 -0
  194. aiagents4pharma/talk2scholars/Dockerfile +104 -0
  195. aiagents4pharma/talk2scholars/README.md +1 -0
  196. aiagents4pharma/talk2scholars/__init__.py +7 -0
  197. aiagents4pharma/talk2scholars/agents/__init__.py +13 -0
  198. aiagents4pharma/talk2scholars/agents/main_agent.py +89 -0
  199. aiagents4pharma/talk2scholars/agents/paper_download_agent.py +96 -0
  200. aiagents4pharma/talk2scholars/agents/pdf_agent.py +101 -0
  201. aiagents4pharma/talk2scholars/agents/s2_agent.py +135 -0
  202. aiagents4pharma/talk2scholars/agents/zotero_agent.py +127 -0
  203. aiagents4pharma/talk2scholars/configs/__init__.py +7 -0
  204. aiagents4pharma/talk2scholars/configs/agents/__init__.py +7 -0
  205. aiagents4pharma/talk2scholars/configs/agents/talk2scholars/__init__.py +7 -0
  206. aiagents4pharma/talk2scholars/configs/agents/talk2scholars/main_agent/__init__.py +3 -0
  207. aiagents4pharma/talk2scholars/configs/agents/talk2scholars/main_agent/default.yaml +52 -0
  208. aiagents4pharma/talk2scholars/configs/agents/talk2scholars/paper_download_agent/__init__.py +3 -0
  209. aiagents4pharma/talk2scholars/configs/agents/talk2scholars/paper_download_agent/default.yaml +19 -0
  210. aiagents4pharma/talk2scholars/configs/agents/talk2scholars/pdf_agent/__init__.py +3 -0
  211. aiagents4pharma/talk2scholars/configs/agents/talk2scholars/pdf_agent/default.yaml +19 -0
  212. aiagents4pharma/talk2scholars/configs/agents/talk2scholars/s2_agent/__init__.py +3 -0
  213. aiagents4pharma/talk2scholars/configs/agents/talk2scholars/s2_agent/default.yaml +44 -0
  214. aiagents4pharma/talk2scholars/configs/agents/talk2scholars/zotero_agent/__init__.py +3 -0
  215. aiagents4pharma/talk2scholars/configs/agents/talk2scholars/zotero_agent/default.yaml +19 -0
  216. aiagents4pharma/talk2scholars/configs/app/__init__.py +7 -0
  217. aiagents4pharma/talk2scholars/configs/app/frontend/__init__.py +3 -0
  218. aiagents4pharma/talk2scholars/configs/app/frontend/default.yaml +72 -0
  219. aiagents4pharma/talk2scholars/configs/config.yaml +16 -0
  220. aiagents4pharma/talk2scholars/configs/tools/__init__.py +21 -0
  221. aiagents4pharma/talk2scholars/configs/tools/multi_paper_recommendation/__init__.py +3 -0
  222. aiagents4pharma/talk2scholars/configs/tools/multi_paper_recommendation/default.yaml +26 -0
  223. aiagents4pharma/talk2scholars/configs/tools/paper_download/__init__.py +3 -0
  224. aiagents4pharma/talk2scholars/configs/tools/paper_download/default.yaml +124 -0
  225. aiagents4pharma/talk2scholars/configs/tools/question_and_answer/__init__.py +3 -0
  226. aiagents4pharma/talk2scholars/configs/tools/question_and_answer/default.yaml +62 -0
  227. aiagents4pharma/talk2scholars/configs/tools/retrieve_semantic_scholar_paper_id/__init__.py +3 -0
  228. aiagents4pharma/talk2scholars/configs/tools/retrieve_semantic_scholar_paper_id/default.yaml +12 -0
  229. aiagents4pharma/talk2scholars/configs/tools/search/__init__.py +3 -0
  230. aiagents4pharma/talk2scholars/configs/tools/search/default.yaml +26 -0
  231. aiagents4pharma/talk2scholars/configs/tools/single_paper_recommendation/__init__.py +3 -0
  232. aiagents4pharma/talk2scholars/configs/tools/single_paper_recommendation/default.yaml +26 -0
  233. aiagents4pharma/talk2scholars/configs/tools/zotero_read/__init__.py +3 -0
  234. aiagents4pharma/talk2scholars/configs/tools/zotero_read/default.yaml +57 -0
  235. aiagents4pharma/talk2scholars/configs/tools/zotero_write/__inti__.py +3 -0
  236. aiagents4pharma/talk2scholars/configs/tools/zotero_write/default.yaml +55 -0
  237. aiagents4pharma/talk2scholars/docker-compose/cpu/.env.example +21 -0
  238. aiagents4pharma/talk2scholars/docker-compose/cpu/docker-compose.yml +90 -0
  239. aiagents4pharma/talk2scholars/docker-compose/gpu/.env.example +21 -0
  240. aiagents4pharma/talk2scholars/docker-compose/gpu/docker-compose.yml +105 -0
  241. aiagents4pharma/talk2scholars/install.md +122 -0
  242. aiagents4pharma/talk2scholars/state/__init__.py +7 -0
  243. aiagents4pharma/talk2scholars/state/state_talk2scholars.py +98 -0
  244. aiagents4pharma/talk2scholars/tests/__init__.py +3 -0
  245. aiagents4pharma/talk2scholars/tests/test_agents_main_agent.py +256 -0
  246. aiagents4pharma/talk2scholars/tests/test_agents_paper_agents_download_agent.py +139 -0
  247. aiagents4pharma/talk2scholars/tests/test_agents_pdf_agent.py +114 -0
  248. aiagents4pharma/talk2scholars/tests/test_agents_s2_agent.py +198 -0
  249. aiagents4pharma/talk2scholars/tests/test_agents_zotero_agent.py +160 -0
  250. aiagents4pharma/talk2scholars/tests/test_s2_tools_display_dataframe.py +91 -0
  251. aiagents4pharma/talk2scholars/tests/test_s2_tools_query_dataframe.py +191 -0
  252. aiagents4pharma/talk2scholars/tests/test_states_state.py +38 -0
  253. aiagents4pharma/talk2scholars/tests/test_tools_paper_downloader.py +507 -0
  254. aiagents4pharma/talk2scholars/tests/test_tools_question_and_answer_tool.py +105 -0
  255. aiagents4pharma/talk2scholars/tests/test_tools_s2_multi.py +307 -0
  256. aiagents4pharma/talk2scholars/tests/test_tools_s2_retrieve.py +67 -0
  257. aiagents4pharma/talk2scholars/tests/test_tools_s2_search.py +286 -0
  258. aiagents4pharma/talk2scholars/tests/test_tools_s2_single.py +298 -0
  259. aiagents4pharma/talk2scholars/tests/test_utils_arxiv_downloader.py +469 -0
  260. aiagents4pharma/talk2scholars/tests/test_utils_base_paper_downloader.py +598 -0
  261. aiagents4pharma/talk2scholars/tests/test_utils_biorxiv_downloader.py +669 -0
  262. aiagents4pharma/talk2scholars/tests/test_utils_medrxiv_downloader.py +500 -0
  263. aiagents4pharma/talk2scholars/tests/test_utils_nvidia_nim_reranker.py +117 -0
  264. aiagents4pharma/talk2scholars/tests/test_utils_pdf_answer_formatter.py +67 -0
  265. aiagents4pharma/talk2scholars/tests/test_utils_pdf_batch_processor.py +92 -0
  266. aiagents4pharma/talk2scholars/tests/test_utils_pdf_collection_manager.py +173 -0
  267. aiagents4pharma/talk2scholars/tests/test_utils_pdf_document_processor.py +68 -0
  268. aiagents4pharma/talk2scholars/tests/test_utils_pdf_generate_answer.py +72 -0
  269. aiagents4pharma/talk2scholars/tests/test_utils_pdf_gpu_detection.py +129 -0
  270. aiagents4pharma/talk2scholars/tests/test_utils_pdf_paper_loader.py +116 -0
  271. aiagents4pharma/talk2scholars/tests/test_utils_pdf_rag_pipeline.py +88 -0
  272. aiagents4pharma/talk2scholars/tests/test_utils_pdf_retrieve_chunks.py +190 -0
  273. aiagents4pharma/talk2scholars/tests/test_utils_pdf_singleton_manager.py +159 -0
  274. aiagents4pharma/talk2scholars/tests/test_utils_pdf_vector_normalization.py +121 -0
  275. aiagents4pharma/talk2scholars/tests/test_utils_pdf_vector_store.py +406 -0
  276. aiagents4pharma/talk2scholars/tests/test_utils_pubmed_downloader.py +1007 -0
  277. aiagents4pharma/talk2scholars/tests/test_utils_read_helper_utils.py +106 -0
  278. aiagents4pharma/talk2scholars/tests/test_utils_s2_utils_ext_ids.py +403 -0
  279. aiagents4pharma/talk2scholars/tests/test_utils_tool_helper_utils.py +85 -0
  280. aiagents4pharma/talk2scholars/tests/test_utils_zotero_human_in_the_loop.py +266 -0
  281. aiagents4pharma/talk2scholars/tests/test_utils_zotero_path.py +496 -0
  282. aiagents4pharma/talk2scholars/tests/test_utils_zotero_pdf_downloader_utils.py +46 -0
  283. aiagents4pharma/talk2scholars/tests/test_utils_zotero_read.py +743 -0
  284. aiagents4pharma/talk2scholars/tests/test_utils_zotero_write.py +151 -0
  285. aiagents4pharma/talk2scholars/tools/__init__.py +9 -0
  286. aiagents4pharma/talk2scholars/tools/paper_download/__init__.py +12 -0
  287. aiagents4pharma/talk2scholars/tools/paper_download/paper_downloader.py +442 -0
  288. aiagents4pharma/talk2scholars/tools/paper_download/utils/__init__.py +22 -0
  289. aiagents4pharma/talk2scholars/tools/paper_download/utils/arxiv_downloader.py +207 -0
  290. aiagents4pharma/talk2scholars/tools/paper_download/utils/base_paper_downloader.py +336 -0
  291. aiagents4pharma/talk2scholars/tools/paper_download/utils/biorxiv_downloader.py +313 -0
  292. aiagents4pharma/talk2scholars/tools/paper_download/utils/medrxiv_downloader.py +196 -0
  293. aiagents4pharma/talk2scholars/tools/paper_download/utils/pubmed_downloader.py +323 -0
  294. aiagents4pharma/talk2scholars/tools/pdf/__init__.py +7 -0
  295. aiagents4pharma/talk2scholars/tools/pdf/question_and_answer.py +170 -0
  296. aiagents4pharma/talk2scholars/tools/pdf/utils/__init__.py +37 -0
  297. aiagents4pharma/talk2scholars/tools/pdf/utils/answer_formatter.py +62 -0
  298. aiagents4pharma/talk2scholars/tools/pdf/utils/batch_processor.py +198 -0
  299. aiagents4pharma/talk2scholars/tools/pdf/utils/collection_manager.py +172 -0
  300. aiagents4pharma/talk2scholars/tools/pdf/utils/document_processor.py +76 -0
  301. aiagents4pharma/talk2scholars/tools/pdf/utils/generate_answer.py +97 -0
  302. aiagents4pharma/talk2scholars/tools/pdf/utils/get_vectorstore.py +59 -0
  303. aiagents4pharma/talk2scholars/tools/pdf/utils/gpu_detection.py +150 -0
  304. aiagents4pharma/talk2scholars/tools/pdf/utils/nvidia_nim_reranker.py +97 -0
  305. aiagents4pharma/talk2scholars/tools/pdf/utils/paper_loader.py +123 -0
  306. aiagents4pharma/talk2scholars/tools/pdf/utils/rag_pipeline.py +113 -0
  307. aiagents4pharma/talk2scholars/tools/pdf/utils/retrieve_chunks.py +197 -0
  308. aiagents4pharma/talk2scholars/tools/pdf/utils/singleton_manager.py +140 -0
  309. aiagents4pharma/talk2scholars/tools/pdf/utils/tool_helper.py +86 -0
  310. aiagents4pharma/talk2scholars/tools/pdf/utils/vector_normalization.py +150 -0
  311. aiagents4pharma/talk2scholars/tools/pdf/utils/vector_store.py +327 -0
  312. aiagents4pharma/talk2scholars/tools/s2/__init__.py +21 -0
  313. aiagents4pharma/talk2scholars/tools/s2/display_dataframe.py +110 -0
  314. aiagents4pharma/talk2scholars/tools/s2/multi_paper_rec.py +111 -0
  315. aiagents4pharma/talk2scholars/tools/s2/query_dataframe.py +233 -0
  316. aiagents4pharma/talk2scholars/tools/s2/retrieve_semantic_scholar_paper_id.py +128 -0
  317. aiagents4pharma/talk2scholars/tools/s2/search.py +101 -0
  318. aiagents4pharma/talk2scholars/tools/s2/single_paper_rec.py +102 -0
  319. aiagents4pharma/talk2scholars/tools/s2/utils/__init__.py +5 -0
  320. aiagents4pharma/talk2scholars/tools/s2/utils/multi_helper.py +223 -0
  321. aiagents4pharma/talk2scholars/tools/s2/utils/search_helper.py +205 -0
  322. aiagents4pharma/talk2scholars/tools/s2/utils/single_helper.py +216 -0
  323. aiagents4pharma/talk2scholars/tools/zotero/__init__.py +7 -0
  324. aiagents4pharma/talk2scholars/tools/zotero/utils/__init__.py +7 -0
  325. aiagents4pharma/talk2scholars/tools/zotero/utils/read_helper.py +270 -0
  326. aiagents4pharma/talk2scholars/tools/zotero/utils/review_helper.py +74 -0
  327. aiagents4pharma/talk2scholars/tools/zotero/utils/write_helper.py +194 -0
  328. aiagents4pharma/talk2scholars/tools/zotero/utils/zotero_path.py +180 -0
  329. aiagents4pharma/talk2scholars/tools/zotero/utils/zotero_pdf_downloader.py +133 -0
  330. aiagents4pharma/talk2scholars/tools/zotero/zotero_read.py +105 -0
  331. aiagents4pharma/talk2scholars/tools/zotero/zotero_review.py +162 -0
  332. aiagents4pharma/talk2scholars/tools/zotero/zotero_write.py +91 -0
  333. aiagents4pharma-0.0.0.dist-info/METADATA +335 -0
  334. aiagents4pharma-0.0.0.dist-info/RECORD +336 -0
  335. aiagents4pharma-0.0.0.dist-info/WHEEL +4 -0
  336. aiagents4pharma-0.0.0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,406 @@
1
+ """
2
+ Unit tests for the Vectorstore class with GPU support and embedding normalization.
3
+ """
4
+
5
+ from types import SimpleNamespace
6
+ from unittest.mock import MagicMock, patch
7
+
8
+ import pytest
9
+ from langchain_core.documents import Document
10
+ from langchain_core.embeddings import Embeddings
11
+
12
+ from aiagents4pharma.talk2scholars.tools.pdf.utils.vector_store import Vectorstore
13
+
14
+ MODULE = "aiagents4pharma.talk2scholars.tools.pdf.utils.vector_store"
15
+
16
+
17
+ @pytest.fixture(name="mock_config")
18
+ def _mock_config():
19
+ """
20
+ Fixture providing a mock configuration object with default GPU detection off.
21
+ """
22
+ return SimpleNamespace(
23
+ milvus=SimpleNamespace(
24
+ host="localhost",
25
+ port=19530,
26
+ collection_name="test_collection",
27
+ db_name="test_db",
28
+ embedding_dim=384,
29
+ ),
30
+ gpu_detection=SimpleNamespace(force_cpu_mode=False),
31
+ )
32
+
33
+
34
+ @pytest.fixture(name="mock_embedding")
35
+ def _mock_embedding():
36
+ """
37
+ Fixture providing a mock Embeddings model.
38
+ """
39
+ return MagicMock(spec=Embeddings)
40
+
41
+
42
+ @pytest.fixture(name="dummy_embedding")
43
+ def _dummy_embedding():
44
+ """
45
+ Fixture providing a dummy Embeddings model.
46
+ """
47
+ return MagicMock(spec=Embeddings)
48
+
49
+
50
+ @pytest.fixture(name="dummy_config")
51
+ def _dummy_config():
52
+ """
53
+ Fixture providing a dummy configuration object.
54
+ """
55
+ return SimpleNamespace(
56
+ milvus=SimpleNamespace(
57
+ host="localhost",
58
+ port=19530,
59
+ collection_name="test_collection",
60
+ db_name="test_db",
61
+ embedding_dim=768,
62
+ ),
63
+ gpu_detection=SimpleNamespace(force_cpu_mode=False),
64
+ )
65
+
66
+
67
+ @pytest.fixture(name="dummy_vectorstore_components")
68
+ def _dummy_vectorstore_components():
69
+ """
70
+ Provides VectorstoreSingleton mock and vector_store with empty collection.
71
+ """
72
+ with (
73
+ patch(f"{MODULE}.detect_nvidia_gpu", return_value=True),
74
+ patch(
75
+ f"{MODULE}.get_optimal_index_config",
76
+ return_value=(
77
+ {"index_type": "IVF_FLAT", "metric_type": "IP"},
78
+ {"nprobe": 10},
79
+ ),
80
+ ),
81
+ patch(f"{MODULE}.ensure_collection_exists", return_value=MagicMock()),
82
+ patch(f"{MODULE}.VectorstoreSingleton") as singleton_cls,
83
+ ):
84
+ mock_singleton = MagicMock()
85
+ mock_vector_store = MagicMock()
86
+ mock_collection = MagicMock()
87
+ mock_collection.num_entities = 0
88
+ mock_collection.flush.return_value = None
89
+ mock_vector_store.col = mock_collection
90
+ mock_vector_store.collection = mock_collection
91
+ mock_singleton.get_vector_store.return_value = mock_vector_store
92
+ mock_singleton.get_connection.return_value = "connected"
93
+ singleton_cls.return_value = mock_singleton
94
+ yield mock_singleton, mock_vector_store
95
+
96
+
97
+ def test_vectorstore_initialization(mock_config, mock_embedding):
98
+ """
99
+ Test Vectorstore initialization with GPU and mocked dependencies.
100
+ """
101
+ with (
102
+ patch(f"{MODULE}.detect_nvidia_gpu", return_value=True),
103
+ patch(f"{MODULE}.log_index_configuration"),
104
+ patch(
105
+ f"{MODULE}.get_optimal_index_config",
106
+ return_value=({"metric_type": "IP"}, {}),
107
+ ),
108
+ patch(f"{MODULE}.wrap_embedding_model_if_needed", return_value=mock_embedding),
109
+ patch(f"{MODULE}.ensure_collection_exists", return_value="mock_collection"),
110
+ patch(f"{MODULE}.VectorstoreSingleton") as singleton_cls,
111
+ ):
112
+ mock_singleton = MagicMock()
113
+ mock_vector_store = MagicMock()
114
+ mock_collection = MagicMock()
115
+ mock_collection.num_entities = 0
116
+ mock_collection.flush.return_value = None
117
+ mock_vector_store.col = mock_collection
118
+ mock_vector_store.collection = mock_collection
119
+ mock_singleton.get_vector_store.return_value = mock_vector_store
120
+ mock_singleton.get_connection.return_value = None
121
+ singleton_cls.return_value = mock_singleton
122
+
123
+ vs = Vectorstore(embedding_model=mock_embedding, config=mock_config)
124
+
125
+ assert vs.embedding_model is mock_embedding
126
+ assert vs.collection == "mock_collection"
127
+ assert vs.has_gpu
128
+ assert vs.vector_store is mock_vector_store
129
+
130
+
131
+ def test_get_embedding_info(mock_config, mock_embedding):
132
+ """
133
+ Test retrieval of embedding configuration info.
134
+ """
135
+ with (
136
+ patch(f"{MODULE}.detect_nvidia_gpu", return_value=True),
137
+ patch(f"{MODULE}.log_index_configuration"),
138
+ patch(
139
+ f"{MODULE}.get_optimal_index_config",
140
+ return_value=({"metric_type": "IP", "index_type": "IVF"}, {}),
141
+ ),
142
+ patch(f"{MODULE}.wrap_embedding_model_if_needed", return_value=mock_embedding),
143
+ patch(f"{MODULE}.ensure_collection_exists", return_value="mock_collection"),
144
+ patch(f"{MODULE}.VectorstoreSingleton") as singleton_cls,
145
+ ):
146
+ mock_singleton = MagicMock()
147
+ mock_vector_store = MagicMock()
148
+ mock_collection = MagicMock()
149
+ mock_collection.num_entities = 0
150
+ mock_collection.flush.return_value = None
151
+ mock_vector_store.col = mock_collection
152
+ mock_vector_store.collection = mock_collection
153
+ mock_singleton.get_vector_store.return_value = mock_vector_store
154
+ mock_singleton.get_connection.return_value = None
155
+ singleton_cls.return_value = mock_singleton
156
+
157
+ vs = Vectorstore(embedding_model=mock_embedding, config=mock_config)
158
+ info = vs.get_embedding_info()
159
+
160
+ assert info["has_gpu"]
161
+ assert info["use_cosine"]
162
+ assert "original_model_type" in info
163
+ assert "wrapped_model_type" in info
164
+ assert "normalization_enabled" in info
165
+
166
+
167
+ def test_load_existing_papers_with_exception(mock_embedding, mock_config):
168
+ """
169
+ Test that _load_existing_paper_ids propagates on flush failure.
170
+ """
171
+ with (
172
+ patch(f"{MODULE}.wrap_embedding_model_if_needed", return_value=mock_embedding),
173
+ patch(f"{MODULE}.VectorstoreSingleton") as singleton_cls,
174
+ patch(f"{MODULE}.ensure_collection_exists"),
175
+ patch(f"{MODULE}.detect_nvidia_gpu", return_value=True),
176
+ patch(
177
+ f"{MODULE}.get_optimal_index_config",
178
+ return_value=({"metric_type": "IP"}, {}),
179
+ ),
180
+ patch(f"{MODULE}.log_index_configuration"),
181
+ ):
182
+ mock_singleton = MagicMock()
183
+ # Set up failing store directly for initialization
184
+ bad_collection = MagicMock()
185
+ bad_collection.num_entities = 0
186
+ bad_collection.flush.side_effect = Exception("flush failed")
187
+ bad_store = MagicMock()
188
+ bad_store.col = bad_collection
189
+ bad_store.collection = bad_collection
190
+ mock_singleton.get_vector_store.return_value = bad_store
191
+ mock_singleton.get_connection.return_value = None
192
+ singleton_cls.return_value = mock_singleton
193
+
194
+ # Test error propagation through initialization that calls _load_existing_paper_ids
195
+ with pytest.raises(Exception) as excinfo:
196
+ Vectorstore(embedding_model=mock_embedding, config=mock_config)
197
+ assert "flush failed" in str(excinfo.value)
198
+
199
+
200
+ def test_ensure_collection_loaded_with_entities(mock_embedding, mock_config):
201
+ """
202
+ Test that _ensure_collection_loaded loads data when entities > 0.
203
+ """
204
+ with (
205
+ patch(f"{MODULE}.wrap_embedding_model_if_needed", return_value=mock_embedding),
206
+ patch(f"{MODULE}.VectorstoreSingleton") as singleton_cls,
207
+ patch(f"{MODULE}.ensure_collection_exists"),
208
+ patch(f"{MODULE}.detect_nvidia_gpu", return_value=True),
209
+ patch(
210
+ f"{MODULE}.get_optimal_index_config",
211
+ return_value=({"metric_type": "IP"}, {}),
212
+ ),
213
+ patch(f"{MODULE}.log_index_configuration"),
214
+ ):
215
+ mock_singleton = MagicMock()
216
+ mock_store = MagicMock()
217
+ mock_collection = MagicMock()
218
+ mock_collection.num_entities = 5
219
+ mock_collection.flush.return_value = None
220
+ mock_store.col = mock_collection
221
+ mock_store.collection = mock_collection
222
+ mock_singleton.get_vector_store.return_value = mock_store
223
+ mock_singleton.get_connection.return_value = None
224
+ singleton_cls.return_value = mock_singleton
225
+
226
+ # Test through initialization which calls _ensure_collection_loaded
227
+ Vectorstore(embedding_model=mock_embedding, config=mock_config)
228
+ assert mock_collection.load.called
229
+
230
+
231
+ def test_ensure_collection_loaded_handles_exception(mock_embedding, mock_config):
232
+ """
233
+ Test that _ensure_collection_loaded propagates on flush failure.
234
+ """
235
+ with (
236
+ patch(f"{MODULE}.wrap_embedding_model_if_needed", return_value=mock_embedding),
237
+ patch(f"{MODULE}.VectorstoreSingleton") as singleton_cls,
238
+ patch(f"{MODULE}.ensure_collection_exists"),
239
+ patch(f"{MODULE}.detect_nvidia_gpu", return_value=True),
240
+ patch(
241
+ f"{MODULE}.get_optimal_index_config",
242
+ return_value=({"metric_type": "IP"}, {}),
243
+ ),
244
+ patch(f"{MODULE}.log_index_configuration"),
245
+ ):
246
+ mock_singleton = MagicMock()
247
+ # Set up failing store directly for initialization
248
+ bad_collection = MagicMock()
249
+ bad_collection.num_entities = 0
250
+ bad_collection.flush.side_effect = Exception("flush error")
251
+ bad_store = MagicMock()
252
+ bad_store.col = bad_collection
253
+ bad_store.collection = bad_collection
254
+ mock_singleton.get_vector_store.return_value = bad_store
255
+ mock_singleton.get_connection.return_value = None
256
+ singleton_cls.return_value = mock_singleton
257
+
258
+ # Test error propagation through initialization that calls _ensure_collection_loaded
259
+ with pytest.raises(Exception) as excinfo:
260
+ Vectorstore(embedding_model=mock_embedding, config=mock_config)
261
+ assert "flush error" in str(excinfo.value)
262
+
263
+
264
+ def test_force_cpu_mode_logs_override(mock_config, mock_embedding):
265
+ """
266
+ Test that forcing CPU mode via config disables GPU detection.
267
+ """
268
+ mock_config.gpu_detection.force_cpu_mode = True
269
+ with (
270
+ patch(f"{MODULE}.wrap_embedding_model_if_needed", return_value=mock_embedding),
271
+ patch(f"{MODULE}.VectorstoreSingleton") as singleton_cls,
272
+ patch(f"{MODULE}.ensure_collection_exists", return_value="mock_collection"),
273
+ patch(f"{MODULE}.detect_nvidia_gpu", return_value=True),
274
+ patch(
275
+ f"{MODULE}.get_optimal_index_config",
276
+ return_value=({"metric_type": "IP"}, {}),
277
+ ),
278
+ patch(f"{MODULE}.log_index_configuration"),
279
+ ):
280
+ mock_singleton = MagicMock()
281
+ mock_store = MagicMock()
282
+ mock_collection = MagicMock()
283
+ mock_collection.num_entities = 0
284
+ mock_collection.flush.return_value = None
285
+ mock_store.col = mock_collection
286
+ mock_store.collection = mock_collection
287
+ mock_singleton.get_vector_store.return_value = mock_store
288
+ mock_singleton.get_connection.return_value = None
289
+ singleton_cls.return_value = mock_singleton
290
+
291
+ vs = Vectorstore(embedding_model=mock_embedding, config=mock_config)
292
+
293
+ assert not vs.has_gpu
294
+
295
+
296
+ def test_similarity_metric_override(dummy_embedding, dummy_config, dummy_vectorstore_components):
297
+ """
298
+ Test setting of use_cosine from config.similarity_metric.
299
+ """
300
+ dummy_config.similarity_metric = SimpleNamespace(use_cosine=False)
301
+ # unpack and ignore vector_store
302
+ _singleton, _mock_vector_store = dummy_vectorstore_components
303
+ vs = Vectorstore(dummy_embedding, config=dummy_config)
304
+ assert not vs.use_cosine
305
+
306
+
307
+ def test_load_existing_paper_ids_fallback_to_collection(
308
+ dummy_embedding, dummy_config, dummy_vectorstore_components
309
+ ):
310
+ """
311
+ Test fallback if both `col` and `collection` missing.
312
+ """
313
+ _, mock_vector_store = dummy_vectorstore_components
314
+ for attr in ("col", "collection"):
315
+ if hasattr(mock_vector_store, attr):
316
+ delattr(mock_vector_store, attr)
317
+
318
+ vs = Vectorstore(dummy_embedding, config=dummy_config)
319
+ # The loaded_papers is set during initialization via _load_existing_paper_ids
320
+ assert isinstance(vs.loaded_papers, set)
321
+
322
+
323
+ def test_load_existing_papers_collection_empty_logs(
324
+ dummy_embedding, dummy_config, dummy_vectorstore_components
325
+ ):
326
+ """
327
+ Test logging when collection empty in _load_existing_paper_ids.
328
+ """
329
+ _, mock_vector_store = dummy_vectorstore_components
330
+ mock_collection = MagicMock()
331
+ mock_collection.num_entities = 0
332
+ mock_collection.flush.return_value = None
333
+ mock_vector_store.col = mock_collection
334
+
335
+ vs = Vectorstore(dummy_embedding, config=dummy_config)
336
+ # The loaded_papers is set during initialization via _load_existing_paper_ids
337
+ assert len(vs.loaded_papers) == 0
338
+
339
+
340
+ def test_similarity_search_filter_paths(
341
+ dummy_embedding, dummy_config, dummy_vectorstore_components
342
+ ):
343
+ """
344
+ Test filter expression generation in similarity_search.
345
+ """
346
+ _, mock_vector_store = dummy_vectorstore_components
347
+ mock_vector_store.similarity_search.return_value = [Document(page_content="test")]
348
+ vs = Vectorstore(dummy_embedding, config=dummy_config)
349
+ vs.vector_store = mock_vector_store
350
+
351
+ filters = {
352
+ "field1": "value",
353
+ "field2": [1, 2],
354
+ "field3": 99,
355
+ "field4": 3.14,
356
+ }
357
+ result = vs.similarity_search(query="text", filter=filters)
358
+ assert isinstance(result, list)
359
+
360
+
361
+ def test_mmr_search_filter_paths(dummy_embedding, dummy_config, dummy_vectorstore_components):
362
+ """
363
+ Test filter expression generation in max_marginal_relevance_search.
364
+ """
365
+ _, mock_vector_store = dummy_vectorstore_components
366
+ mock_vector_store.max_marginal_relevance_search.return_value = [Document(page_content="test")]
367
+ vs = Vectorstore(dummy_embedding, config=dummy_config)
368
+ vs.vector_store = mock_vector_store
369
+
370
+ filters = {"f": "text", "g": ["a", "b"], "h": 7, "j": 3.3}
371
+ result = vs.max_marginal_relevance_search(query="q", filter=filters)
372
+ assert isinstance(result, list)
373
+
374
+
375
+ def test_ensure_collection_loaded_no_col_and_no_collection(
376
+ dummy_embedding, dummy_config, dummy_vectorstore_components
377
+ ):
378
+ """
379
+ Test no-op when no collection attributes present.
380
+ """
381
+ _, mock_vector_store = dummy_vectorstore_components
382
+ for attr in ("col", "collection"):
383
+ if hasattr(mock_vector_store, attr):
384
+ delattr(mock_vector_store, attr)
385
+
386
+ # Test initialization succeeds without exception
387
+ Vectorstore(dummy_embedding, config=dummy_config)
388
+ # Collection loading is handled during initialization via _ensure_collection_loaded
389
+ # no exception if we got this far
390
+
391
+
392
+ def test_ensure_collection_loaded_empty_logs(
393
+ dummy_embedding, dummy_config, dummy_vectorstore_components
394
+ ):
395
+ """
396
+ Test logging when collection empty in _ensure_collection_loaded.
397
+ """
398
+ _, mock_vector_store = dummy_vectorstore_components
399
+ mock_collection = MagicMock()
400
+ mock_collection.num_entities = 0
401
+ mock_vector_store.col = mock_collection
402
+
403
+ # Test initialization succeeds without exception
404
+ Vectorstore(dummy_embedding, config=dummy_config)
405
+ # Collection loading is handled during initialization via _ensure_collection_loaded
406
+ # no exception if we got this far