aiagents4pharma 1.28.0__tar.gz → 1.29.0__tar.gz

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 (226) hide show
  1. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/PKG-INFO +6 -5
  2. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/README.md +5 -4
  3. aiagents4pharma-1.29.0/aiagents4pharma/talk2scholars/agents/main_agent.py +78 -0
  4. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/agents/s2_agent.py +10 -6
  5. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/agents/zotero_agent.py +12 -6
  6. aiagents4pharma-1.29.0/aiagents4pharma/talk2scholars/configs/agents/talk2scholars/main_agent/default.yaml +13 -0
  7. aiagents4pharma-1.29.0/aiagents4pharma/talk2scholars/configs/agents/talk2scholars/s2_agent/default.yaml +19 -0
  8. aiagents4pharma-1.29.0/aiagents4pharma/talk2scholars/configs/agents/talk2scholars/zotero_agent/default.yaml +19 -0
  9. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/configs/config.yaml +1 -0
  10. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/configs/tools/__init__.py +1 -0
  11. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/configs/tools/multi_paper_recommendation/default.yaml +1 -1
  12. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/configs/tools/search/default.yaml +1 -1
  13. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/configs/tools/single_paper_recommendation/default.yaml +1 -1
  14. aiagents4pharma-1.29.0/aiagents4pharma/talk2scholars/configs/tools/zotero_read/default.yaml +56 -0
  15. aiagents4pharma-1.29.0/aiagents4pharma/talk2scholars/configs/tools/zotero_write/__inti__.py +3 -0
  16. aiagents4pharma-1.29.0/aiagents4pharma/talk2scholars/tests/test_main_agent.py +196 -0
  17. aiagents4pharma-1.29.0/aiagents4pharma/talk2scholars/tests/test_s2_display.py +74 -0
  18. aiagents4pharma-1.29.0/aiagents4pharma/talk2scholars/tests/test_s2_multi.py +282 -0
  19. aiagents4pharma-1.29.0/aiagents4pharma/talk2scholars/tests/test_s2_query.py +78 -0
  20. aiagents4pharma-1.29.0/aiagents4pharma/talk2scholars/tests/test_s2_retrieve.py +65 -0
  21. aiagents4pharma-1.29.0/aiagents4pharma/talk2scholars/tests/test_s2_search.py +266 -0
  22. aiagents4pharma-1.29.0/aiagents4pharma/talk2scholars/tests/test_s2_single.py +274 -0
  23. aiagents4pharma-1.29.0/aiagents4pharma/talk2scholars/tests/test_zotero_path.py +57 -0
  24. aiagents4pharma-1.29.0/aiagents4pharma/talk2scholars/tests/test_zotero_read.py +412 -0
  25. aiagents4pharma-1.29.0/aiagents4pharma/talk2scholars/tests/test_zotero_write.py +626 -0
  26. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/tools/s2/multi_paper_rec.py +50 -34
  27. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/tools/s2/retrieve_semantic_scholar_paper_id.py +8 -8
  28. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/tools/s2/search.py +36 -23
  29. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/tools/s2/single_paper_rec.py +44 -38
  30. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/tools/zotero/__init__.py +2 -0
  31. aiagents4pharma-1.29.0/aiagents4pharma/talk2scholars/tools/zotero/utils/__init__.py +5 -0
  32. aiagents4pharma-1.29.0/aiagents4pharma/talk2scholars/tools/zotero/utils/zotero_path.py +63 -0
  33. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/tools/zotero/zotero_read.py +64 -19
  34. aiagents4pharma-1.29.0/aiagents4pharma/talk2scholars/tools/zotero/zotero_write.py +247 -0
  35. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma.egg-info/PKG-INFO +6 -5
  36. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma.egg-info/SOURCES.txt +14 -5
  37. aiagents4pharma-1.29.0/release_version.txt +1 -0
  38. aiagents4pharma-1.28.0/aiagents4pharma/talk2scholars/agents/main_agent.py +0 -252
  39. aiagents4pharma-1.28.0/aiagents4pharma/talk2scholars/configs/agents/talk2scholars/main_agent/default.yaml +0 -59
  40. aiagents4pharma-1.28.0/aiagents4pharma/talk2scholars/configs/agents/talk2scholars/s2_agent/default.yaml +0 -42
  41. aiagents4pharma-1.28.0/aiagents4pharma/talk2scholars/configs/agents/talk2scholars/zotero_agent/default.yaml +0 -35
  42. aiagents4pharma-1.28.0/aiagents4pharma/talk2scholars/configs/tools/zotero_read/default.yaml +0 -15
  43. aiagents4pharma-1.28.0/aiagents4pharma/talk2scholars/tests/test_call_s2.py +0 -100
  44. aiagents4pharma-1.28.0/aiagents4pharma/talk2scholars/tests/test_call_zotero.py +0 -94
  45. aiagents4pharma-1.28.0/aiagents4pharma/talk2scholars/tests/test_main_agent.py +0 -121
  46. aiagents4pharma-1.28.0/aiagents4pharma/talk2scholars/tests/test_s2_tools.py +0 -355
  47. aiagents4pharma-1.28.0/aiagents4pharma/talk2scholars/tests/test_zotero_tool.py +0 -171
  48. aiagents4pharma-1.28.0/release_version.txt +0 -1
  49. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/LICENSE +0 -0
  50. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/__init__.py +0 -0
  51. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2aiagents4pharma/__init__.py +0 -0
  52. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2aiagents4pharma/agents/__init__.py +0 -0
  53. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2aiagents4pharma/agents/main_agent.py +0 -0
  54. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2aiagents4pharma/configs/__init__.py +0 -0
  55. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2aiagents4pharma/configs/agents/__init__.py +0 -0
  56. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2aiagents4pharma/configs/agents/main_agent/default.yaml +0 -0
  57. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2aiagents4pharma/configs/config.yaml +0 -0
  58. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2aiagents4pharma/states/__init__.py +0 -0
  59. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2aiagents4pharma/states/state_talk2aiagents4pharma.py +0 -0
  60. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2aiagents4pharma/tests/__init__.py +0 -0
  61. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2aiagents4pharma/tests/test_main_agent.py +0 -0
  62. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/__init__.py +0 -0
  63. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/agents/__init__.py +0 -0
  64. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/agents/t2b_agent.py +0 -0
  65. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/api/__init__.py +0 -0
  66. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/api/kegg.py +0 -0
  67. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/api/ols.py +0 -0
  68. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/api/uniprot.py +0 -0
  69. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/configs/__init__.py +0 -0
  70. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/configs/agents/__init__.py +0 -0
  71. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/configs/agents/t2b_agent/__init__.py +0 -0
  72. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/configs/agents/t2b_agent/default.yaml +0 -0
  73. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/configs/config.yaml +0 -0
  74. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/configs/tools/__init__.py +0 -0
  75. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/configs/tools/ask_question/__init__.py +0 -0
  76. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/configs/tools/ask_question/default.yaml +0 -0
  77. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/configs/tools/custom_plotter/__init__.py +0 -0
  78. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/configs/tools/custom_plotter/default.yaml +0 -0
  79. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/configs/tools/get_annotation/__init__.py +0 -0
  80. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/configs/tools/get_annotation/default.yaml +0 -0
  81. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/models/__init__.py +0 -0
  82. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/models/basico_model.py +0 -0
  83. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/models/sys_bio_model.py +0 -0
  84. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/states/__init__.py +0 -0
  85. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/states/state_talk2biomodels.py +0 -0
  86. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/tests/__init__.py +0 -0
  87. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/tests/test_api.py +0 -0
  88. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/tests/test_ask_question.py +0 -0
  89. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/tests/test_basico_model.py +0 -0
  90. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/tests/test_get_annotation.py +0 -0
  91. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/tests/test_getmodelinfo.py +0 -0
  92. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/tests/test_integration.py +0 -0
  93. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/tests/test_load_biomodel.py +0 -0
  94. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/tests/test_param_scan.py +0 -0
  95. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/tests/test_query_article.py +0 -0
  96. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/tests/test_search_models.py +0 -0
  97. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/tests/test_simulate_model.py +0 -0
  98. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/tests/test_steady_state.py +0 -0
  99. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/tests/test_sys_bio_model.py +0 -0
  100. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/tools/__init__.py +0 -0
  101. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/tools/ask_question.py +0 -0
  102. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/tools/custom_plotter.py +0 -0
  103. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/tools/get_annotation.py +0 -0
  104. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/tools/get_modelinfo.py +0 -0
  105. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/tools/load_arguments.py +0 -0
  106. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/tools/load_biomodel.py +0 -0
  107. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/tools/parameter_scan.py +0 -0
  108. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/tools/query_article.py +0 -0
  109. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/tools/search_models.py +0 -0
  110. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/tools/simulate_model.py +0 -0
  111. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/tools/steady_state.py +0 -0
  112. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/tools/utils.py +0 -0
  113. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2cells/__init__.py +0 -0
  114. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2cells/agents/__init__.py +0 -0
  115. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2cells/agents/scp_agent.py +0 -0
  116. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2cells/states/__init__.py +0 -0
  117. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2cells/states/state_talk2cells.py +0 -0
  118. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2cells/tests/scp_agent/test_scp_agent.py +0 -0
  119. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2cells/tools/__init__.py +0 -0
  120. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2cells/tools/scp_agent/__init__.py +0 -0
  121. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2cells/tools/scp_agent/display_studies.py +0 -0
  122. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2cells/tools/scp_agent/search_studies.py +0 -0
  123. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/__init__.py +0 -0
  124. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/agents/__init__.py +0 -0
  125. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/agents/t2kg_agent.py +0 -0
  126. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/configs/__init__.py +0 -0
  127. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/configs/agents/t2kg_agent/__init__.py +0 -0
  128. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/configs/agents/t2kg_agent/default.yaml +0 -0
  129. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/configs/app/__init__.py +0 -0
  130. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/configs/app/frontend/__init__.py +0 -0
  131. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/configs/app/frontend/default.yaml +0 -0
  132. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/configs/config.yaml +0 -0
  133. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/configs/tools/__init__.py +0 -0
  134. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/configs/tools/graphrag_reasoning/__init__.py +0 -0
  135. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/configs/tools/graphrag_reasoning/default.yaml +0 -0
  136. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/configs/tools/subgraph_extraction/__init__.py +0 -0
  137. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/configs/tools/subgraph_extraction/default.yaml +0 -0
  138. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/configs/tools/subgraph_summarization/__init__.py +0 -0
  139. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/configs/tools/subgraph_summarization/default.yaml +0 -0
  140. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/datasets/__init__.py +0 -0
  141. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/datasets/biobridge_primekg.py +0 -0
  142. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/datasets/dataset.py +0 -0
  143. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/datasets/primekg.py +0 -0
  144. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/datasets/starkqa_primekg.py +0 -0
  145. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/states/__init__.py +0 -0
  146. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/states/state_talk2knowledgegraphs.py +0 -0
  147. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/tests/__init__.py +0 -0
  148. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/tests/test_agents_t2kg_agent.py +0 -0
  149. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/tests/test_datasets_biobridge_primekg.py +0 -0
  150. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/tests/test_datasets_dataset.py +0 -0
  151. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/tests/test_datasets_primekg.py +0 -0
  152. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/tests/test_datasets_starkqa_primekg.py +0 -0
  153. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/tests/test_tools_graphrag_reasoning.py +0 -0
  154. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/tests/test_tools_subgraph_extraction.py +0 -0
  155. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/tests/test_tools_subgraph_summarization.py +0 -0
  156. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/tests/test_utils_embeddings_embeddings.py +0 -0
  157. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/tests/test_utils_embeddings_huggingface.py +0 -0
  158. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/tests/test_utils_embeddings_nim_molmim.py +0 -0
  159. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/tests/test_utils_embeddings_ollama.py +0 -0
  160. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/tests/test_utils_embeddings_sentencetransformer.py +0 -0
  161. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_enrichments.py +0 -0
  162. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_ollama.py +0 -0
  163. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_pubchem.py +0 -0
  164. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/tests/test_utils_kg_utils.py +0 -0
  165. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/tests/test_utils_pubchem_utils.py +0 -0
  166. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/tools/__init__.py +0 -0
  167. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/tools/graphrag_reasoning.py +0 -0
  168. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/tools/load_arguments.py +0 -0
  169. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/tools/subgraph_extraction.py +0 -0
  170. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/tools/subgraph_summarization.py +0 -0
  171. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/utils/__init__.py +0 -0
  172. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/utils/embeddings/__init__.py +0 -0
  173. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/utils/embeddings/embeddings.py +0 -0
  174. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/utils/embeddings/huggingface.py +0 -0
  175. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/utils/embeddings/nim_molmim.py +0 -0
  176. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/utils/embeddings/ollama.py +0 -0
  177. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/utils/embeddings/sentence_transformer.py +0 -0
  178. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/utils/enrichments/__init__.py +0 -0
  179. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/utils/enrichments/enrichments.py +0 -0
  180. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/utils/enrichments/ollama.py +0 -0
  181. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/utils/enrichments/pubchem_strings.py +0 -0
  182. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/utils/extractions/__init__.py +0 -0
  183. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/utils/extractions/pcst.py +0 -0
  184. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/utils/kg_utils.py +0 -0
  185. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/utils/pubchem_utils.py +0 -0
  186. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/__init__.py +0 -0
  187. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/agents/__init__.py +0 -0
  188. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/agents/pdf_agent.py +0 -0
  189. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/configs/__init__.py +0 -0
  190. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/configs/agents/__init__.py +0 -0
  191. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/configs/agents/talk2scholars/__init__.py +0 -0
  192. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/configs/agents/talk2scholars/main_agent/__init__.py +0 -0
  193. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/configs/agents/talk2scholars/pdf_agent/__init__.py +0 -0
  194. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/configs/agents/talk2scholars/s2_agent/__init__.py +0 -0
  195. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/configs/agents/talk2scholars/zotero_agent/__init__.py +0 -0
  196. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/configs/app/__init__.py +0 -0
  197. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/configs/app/frontend/__init__.py +0 -0
  198. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/configs/app/frontend/default.yaml +0 -0
  199. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/configs/tools/multi_paper_recommendation/__init__.py +0 -0
  200. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/configs/tools/question_and_answer/__init__.py +0 -0
  201. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/configs/tools/retrieve_semantic_scholar_paper_id/__init__.py +0 -0
  202. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/configs/tools/retrieve_semantic_scholar_paper_id/default.yaml +0 -0
  203. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/configs/tools/search/__init__.py +0 -0
  204. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/configs/tools/single_paper_recommendation/__init__.py +0 -0
  205. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/configs/tools/zotero_read/__init__.py +0 -0
  206. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/state/__init__.py +0 -0
  207. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/state/state_talk2scholars.py +0 -0
  208. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/tests/__init__.py +0 -0
  209. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/tests/test_llm_main_integration.py +0 -0
  210. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/tests/test_pdf_agent.py +0 -0
  211. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/tests/test_question_and_answer_tool.py +0 -0
  212. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/tests/test_routing_logic.py +0 -0
  213. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/tests/test_s2_agent.py +0 -0
  214. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/tests/test_state.py +0 -0
  215. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/tests/test_zotero_agent.py +0 -0
  216. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/tools/__init__.py +0 -0
  217. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/tools/pdf/__init__.py +0 -0
  218. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/tools/pdf/question_and_answer.py +0 -0
  219. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/tools/s2/__init__.py +0 -0
  220. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/tools/s2/display_results.py +0 -0
  221. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/tools/s2/query_results.py +0 -0
  222. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma.egg-info/dependency_links.txt +0 -0
  223. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma.egg-info/requires.txt +0 -0
  224. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma.egg-info/top_level.txt +0 -0
  225. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/pyproject.toml +0 -0
  226. {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: aiagents4pharma
3
- Version: 1.28.0
3
+ Version: 1.29.0
4
4
  Summary: AI Agents for drug discovery, drug development, and other pharmaceutical R&D.
5
5
  Classifier: Programming Language :: Python :: 3
6
6
  Classifier: License :: OSI Approved :: MIT License
@@ -91,6 +91,7 @@ Our toolkit currently consists of the following agents:
91
91
  ![Python Version from PEP 621 TOML](https://img.shields.io/python/required-version-toml?tomlFilePath=https%3A%2F%2Fraw.githubusercontent.com%2FVirtualPatientEngine%2FAIAgents4Pharma%2Frefs%2Fheads%2Fmain%2Fpyproject.toml)
92
92
 
93
93
  ### Installation
94
+
94
95
  _Please use version 1.26.2 or later for better support with NVIDIA NIM models._
95
96
 
96
97
  #### Option 1: PyPI
@@ -135,10 +136,10 @@ cd AIAgents4Pharma/aiagents4pharma/talk2knowledgegraphs
135
136
  LANGCHAIN_TRACING_V2=true
136
137
  LANGCHAIN_API_KEY=your_langchain_api_key_here
137
138
  # Notes:
138
- # - The API endpoint for Ollama is already set in env.example.
139
- # - Both API keys (OPENAI_API_KEY and NVIDIA_API_KEY) are required for Talk2AIAgents4Pharma.
140
- # - If using Talk2KnowledgeGraphs separately, only the OPENAI_API_KEY is needed.
141
- # - Langsmith API for tracing is optional for both, set it in env.example if required.
139
+ # The API endpoint for Ollama is already set in env.example.
140
+ # Both API keys (OPENAI_API_KEY and NVIDIA_API_KEY) are required for Talk2AIAgents4Pharma.
141
+ # If using Talk2KnowledgeGraphs separately, only the OPENAI_API_KEY is needed.
142
+ # Langsmith API for tracing is optional for both, set it in env.example if required.
142
143
  ```
143
144
 
144
145
  4. Save the file.
@@ -26,6 +26,7 @@ Our toolkit currently consists of the following agents:
26
26
  ![Python Version from PEP 621 TOML](https://img.shields.io/python/required-version-toml?tomlFilePath=https%3A%2F%2Fraw.githubusercontent.com%2FVirtualPatientEngine%2FAIAgents4Pharma%2Frefs%2Fheads%2Fmain%2Fpyproject.toml)
27
27
 
28
28
  ### Installation
29
+
29
30
  _Please use version 1.26.2 or later for better support with NVIDIA NIM models._
30
31
 
31
32
  #### Option 1: PyPI
@@ -70,10 +71,10 @@ cd AIAgents4Pharma/aiagents4pharma/talk2knowledgegraphs
70
71
  LANGCHAIN_TRACING_V2=true
71
72
  LANGCHAIN_API_KEY=your_langchain_api_key_here
72
73
  # Notes:
73
- # - The API endpoint for Ollama is already set in env.example.
74
- # - Both API keys (OPENAI_API_KEY and NVIDIA_API_KEY) are required for Talk2AIAgents4Pharma.
75
- # - If using Talk2KnowledgeGraphs separately, only the OPENAI_API_KEY is needed.
76
- # - Langsmith API for tracing is optional for both, set it in env.example if required.
74
+ # The API endpoint for Ollama is already set in env.example.
75
+ # Both API keys (OPENAI_API_KEY and NVIDIA_API_KEY) are required for Talk2AIAgents4Pharma.
76
+ # If using Talk2KnowledgeGraphs separately, only the OPENAI_API_KEY is needed.
77
+ # Langsmith API for tracing is optional for both, set it in env.example if required.
77
78
  ```
78
79
 
79
80
  4. Save the file.
@@ -0,0 +1,78 @@
1
+ #!/usr/bin/env python3
2
+
3
+ """
4
+ Main agent for the talk2scholars app using ReAct pattern.
5
+
6
+ This module implements a hierarchical agent system where a supervisor agent
7
+ routes queries to specialized sub-agents. It follows the LangGraph patterns
8
+ for multi-agent systems and implements proper state management.
9
+ """
10
+
11
+ import logging
12
+ import hydra
13
+ from langgraph_supervisor import create_supervisor
14
+ from langchain_openai import ChatOpenAI
15
+ from langchain_core.language_models.chat_models import BaseChatModel
16
+ from langgraph.checkpoint.memory import MemorySaver
17
+ from ..agents.s2_agent import get_app as get_app_s2
18
+ from ..agents.zotero_agent import get_app as get_app_zotero
19
+ from ..state.state_talk2scholars import Talk2Scholars
20
+
21
+ # Initialize logger
22
+ logging.basicConfig(level=logging.INFO)
23
+ logger = logging.getLogger(__name__)
24
+
25
+
26
+ def get_app(uniq_id, llm_model: BaseChatModel):
27
+ """
28
+ Initializes and returns the LangGraph-based hierarchical agent system.
29
+
30
+ This function constructs the agent workflow by defining nodes for the supervisor
31
+ and sub-agents. It compiles the graph using `StateGraph` to enable structured
32
+ conversational workflows.
33
+
34
+ Args:
35
+ thread_id (str): A unique session identifier for tracking conversation state.
36
+ llm_model (BaseChatModel, optional): The language model used for query processing.
37
+ Defaults to `ChatOpenAI(model="gpt-4o-mini", temperature=0)`.
38
+
39
+ Returns:
40
+ StateGraph: A compiled LangGraph application that can process user queries.
41
+
42
+ Example:
43
+ >>> app = get_app("thread_123")
44
+ >>> result = app.invoke(initial_state)
45
+ """
46
+ if llm_model.model_name == "gpt-4o-mini":
47
+ llm_model = ChatOpenAI(
48
+ model="gpt-4o-mini",
49
+ temperature=0,
50
+ model_kwargs={"parallel_tool_calls": False},
51
+ )
52
+ # Load hydra configuration
53
+ logger.log(logging.INFO, "Launching Talk2Scholars with thread_id %s", uniq_id)
54
+ with hydra.initialize(version_base=None, config_path="../configs/"):
55
+ cfg = hydra.compose(
56
+ config_name="config", overrides=["agents/talk2scholars/main_agent=default"]
57
+ )
58
+ cfg = cfg.agents.talk2scholars.main_agent
59
+ logger.log(logging.INFO, "System_prompt of Talk2Scholars: %s", cfg.system_prompt)
60
+ # Create supervisor workflow
61
+ workflow = create_supervisor(
62
+ [
63
+ get_app_s2(uniq_id, llm_model), # semantic scholar
64
+ get_app_zotero(uniq_id, llm_model), # zotero
65
+ ],
66
+ model=llm_model,
67
+ state_schema=Talk2Scholars,
68
+ # Full history is needed to extract
69
+ # the tool artifacts
70
+ output_mode="full_history",
71
+ add_handoff_back_messages=False,
72
+ prompt=cfg.system_prompt,
73
+ )
74
+
75
+ # Compile and run
76
+ app = workflow.compile(checkpointer=MemorySaver(), name="Talk2Scholars_MainAgent")
77
+
78
+ return app
@@ -28,9 +28,7 @@ logging.basicConfig(level=logging.INFO)
28
28
  logger = logging.getLogger(__name__)
29
29
 
30
30
 
31
- def get_app(
32
- uniq_id, llm_model: BaseChatModel
33
- ):
31
+ def get_app(uniq_id, llm_model: BaseChatModel):
34
32
  """
35
33
  Initializes and returns the LangGraph application for the Semantic Scholar (S2) agent.
36
34
 
@@ -86,6 +84,7 @@ def get_app(
86
84
  config_name="config", overrides=["agents/talk2scholars/s2_agent=default"]
87
85
  )
88
86
  cfg = cfg.agents.talk2scholars.s2_agent
87
+ logger.log(logging.INFO, "Loaded configuration for S2 agent")
89
88
 
90
89
  # Define the tools
91
90
  tools = ToolNode(
@@ -107,7 +106,7 @@ def get_app(
107
106
  llm_model,
108
107
  tools=tools,
109
108
  state_schema=Talk2Scholars,
110
- state_modifier=cfg.s2_agent,
109
+ prompt=cfg.s2_agent,
111
110
  checkpointer=MemorySaver(),
112
111
  )
113
112
 
@@ -122,7 +121,12 @@ def get_app(
122
121
  # This compiles it into a LangChain Runnable,
123
122
  # meaning you can use it as you would any other runnable.
124
123
  # Note that we're (optionally) passing the memory when compiling the graph
125
- app = workflow.compile(checkpointer=checkpointer)
126
- logger.log(logging.INFO, "Compiled the graph")
124
+ app = workflow.compile(checkpointer=checkpointer, name="agent_s2")
125
+ logger.log(
126
+ logging.INFO,
127
+ "Compiled the graph with thread_id %s and llm_model %s",
128
+ uniq_id,
129
+ llm_model,
130
+ )
127
131
 
128
132
  return app
@@ -14,6 +14,7 @@ from langgraph.prebuilt import create_react_agent, ToolNode
14
14
  from langgraph.checkpoint.memory import MemorySaver
15
15
  from ..state.state_talk2scholars import Talk2Scholars
16
16
  from ..tools.zotero.zotero_read import zotero_search_tool
17
+ from ..tools.zotero.zotero_write import zotero_save_tool
17
18
  from ..tools.s2.display_results import display_results as s2_display
18
19
  from ..tools.s2.query_results import query_results as s2_query_results
19
20
  from ..tools.s2.retrieve_semantic_scholar_paper_id import (
@@ -25,9 +26,7 @@ logging.basicConfig(level=logging.INFO)
25
26
  logger = logging.getLogger(__name__)
26
27
 
27
28
 
28
- def get_app(
29
- uniq_id, llm_model: BaseChatModel
30
- ):
29
+ def get_app(uniq_id, llm_model: BaseChatModel):
31
30
  """
32
31
  Initializes and returns the LangGraph application for the Zotero agent.
33
32
 
@@ -83,6 +82,7 @@ def get_app(
83
82
  overrides=["agents/talk2scholars/zotero_agent=default"],
84
83
  )
85
84
  cfg = cfg.agents.talk2scholars.zotero_agent
85
+ logger.log(logging.INFO, "Loaded configuration for Zotero agent")
86
86
 
87
87
  # Define the tools
88
88
  tools = ToolNode(
@@ -91,6 +91,7 @@ def get_app(
91
91
  s2_display,
92
92
  s2_query_results,
93
93
  retrieve_semantic_scholar_paper_id,
94
+ zotero_save_tool,
94
95
  ]
95
96
  )
96
97
 
@@ -102,7 +103,7 @@ def get_app(
102
103
  llm_model,
103
104
  tools=tools,
104
105
  state_schema=Talk2Scholars,
105
- state_modifier=cfg.zotero_agent,
106
+ prompt=cfg.zotero_agent,
106
107
  checkpointer=MemorySaver(),
107
108
  )
108
109
 
@@ -114,7 +115,12 @@ def get_app(
114
115
  checkpointer = MemorySaver()
115
116
 
116
117
  # Compile the graph
117
- app = workflow.compile(checkpointer=checkpointer)
118
- logger.log(logging.INFO, "Compiled the graph")
118
+ app = workflow.compile(checkpointer=checkpointer, name="agent_zotero")
119
+ logger.log(
120
+ logging.INFO,
121
+ "Compiled the graph with thread_id %s and llm_model %s",
122
+ uniq_id,
123
+ llm_model,
124
+ )
119
125
 
120
126
  return app
@@ -0,0 +1,13 @@
1
+ _target_: agents.main_agent.get_app
2
+ temperature: 0
3
+ system_prompt: >
4
+ You are the Talk2Scholars agent coordinating academic paper discovery and analysis.
5
+
6
+ You have access to the following agents:
7
+ 1. S2_agent: This agent can be used to search and recommend papers
8
+ from Semantic Scholar. Use this agent when the user asks for
9
+ general paper searches and recommendations.
10
+ 2. Zotero_agent: This agent can be used to retrieve, display, and query
11
+ papers from the Zotero library. Use this agent only when the user
12
+ explicitly asks for papers from Zotero. This tool can also be used to
13
+ save papers in under collections in the zotero library
@@ -0,0 +1,19 @@
1
+ _target_: agents.s2_agent.get_app
2
+ s2_agent: >
3
+ You are an academic research assistant with access to the
4
+ Semantic Scholar API for paper discovery and analysis.
5
+
6
+ AVAILABLE TOOLS:
7
+ 1. search - Search for academic papers by query string
8
+ 2. display_results - Display the papers retrieved by other tools
9
+ 3. single_paper_rec - Get recommendations based on a SINGLE paper
10
+ 4. multi_paper_rec - Get recommendations based on MULTIPLE papers
11
+ 5. query_results - Ask questions about the current set of papers
12
+ 6. retrieve_semantic_scholar_paper_id - Get Semantic Scholar ID for a paper title
13
+
14
+ WORKFLOW STEPS:
15
+ 1. When user requests papers, use search/recommendation tools to find papers
16
+ 2. Use `display_results` tool to display the response from the search/recommendation tools
17
+ 3. Use `query_results` tool to query over the selected paper only when the user asks to
18
+ 4. When the user wants recommendations, you can get the "paper_id" using `query_results` tool in the "last_displayed_results" key, then
19
+ pass the "paper_id" to `search`, `single_paper_rec` or `multi_paper_rec` tools depending on the user's query. Do not use "arxiv_id"
@@ -0,0 +1,19 @@
1
+ target: agents.zotero_agent.get_app
2
+ zotero_agent: >
3
+ You are a specialized Zotero library agent with access to tools for paper retrieval and management.
4
+
5
+ AVAILABLE TOOLS:
6
+ 1. zotero_search_tool - Search and retrieve papers from Zotero library
7
+ 2. display_results - Display the papers retrieved by other tools
8
+ 3. query_results - Ask questions about the current set of papers
9
+ 4. retrieve_semantic_scholar_paper_id - Get Semantic Scholar ID for a paper title for the papers from zotero library
10
+ 5. zotero_write - Save paper to users zotero library under specfied collections
11
+
12
+
13
+ WORKFLOW STEPS
14
+ 1. When user requests papers, use `zotero_search_tool` to find papers
15
+ 2. Use `display_results` tool to display the response
16
+ 3. Use `query_results` tool to query over the selected paper only when the user asks to
17
+ 4. Use `retrieve_semantic_scholar_paper_id` to get the semantic scholar id of a paper title for the papers from zotero library
18
+ 5. Use `zotero_write` to save the papers to users zotero library under collections and call `display_results` only after you recive
19
+ the save was successfull
@@ -11,3 +11,4 @@ defaults:
11
11
  - tools/retrieve_semantic_scholar_paper_id: default
12
12
  - tools/question_and_answer: default
13
13
  - tools/zotero_read: default
14
+ - tools/zotero_write: default
@@ -7,3 +7,4 @@ from . import single_paper_recommendation
7
7
  from . import multi_paper_recommendation
8
8
  from . import question_and_answer
9
9
  from . import zotero_read
10
+ from . import zotero_write
@@ -9,8 +9,8 @@ api_fields:
9
9
  - "authors"
10
10
  - "citationCount"
11
11
  - "url"
12
+ - "externalIds"
12
13
  # Commented fields that could be added later if needed
13
- # - "externalIds"
14
14
 
15
15
  # Default headers and params
16
16
  headers:
@@ -9,8 +9,8 @@ api_fields:
9
9
  - "authors"
10
10
  - "citationCount"
11
11
  - "url"
12
+ - "externalIds"
12
13
  # Commented fields that could be added later if needed
13
- # - "externalIds"
14
14
  # - "publicationTypes"
15
15
  # - "openAccessPdf"
16
16
 
@@ -9,8 +9,8 @@ api_fields:
9
9
  - "authors"
10
10
  - "citationCount"
11
11
  - "url"
12
+ - "externalIds"
12
13
  # Commented fields that could be added later if needed
13
- # - "externalIds"
14
14
  # - "publicationTypes"
15
15
  # - "openAccessPdf"
16
16
 
@@ -0,0 +1,56 @@
1
+ # Default configuration for Zotero search tool
2
+ library_type: "user" # Type of library ('user' or 'group')
3
+ default_limit: 2
4
+ request_timeout: 10
5
+ user_id: ${oc.env:ZOTERO_USER_ID} # Load from environment variable
6
+ api_key: ${oc.env:ZOTERO_API_KEY} # Load from environment variable
7
+
8
+ # Default search parameters
9
+ search_params:
10
+ limit: ${.default_limit}
11
+
12
+ # Item Types and Limit
13
+ zotero:
14
+ max_limit: 100
15
+ filter_item_types:
16
+ [
17
+ "Artwork",
18
+ "Audio Recording",
19
+ "Bill",
20
+ "Blog Post",
21
+ "Book",
22
+ "Book Section",
23
+ "Case",
24
+ "Conference Paper",
25
+ "Dataset",
26
+ "Dictionary Entry",
27
+ "Document",
28
+ "E-mail",
29
+ "Encyclopedia Article",
30
+ "Film",
31
+ "Forum Post",
32
+ "Hearing",
33
+ "Instant Message",
34
+ "Interview",
35
+ "Journal Article",
36
+ "Letter",
37
+ "Magazine Article",
38
+ "Manuscript",
39
+ "Map",
40
+ "Newspaper Article",
41
+ "Patent",
42
+ "Podcast",
43
+ "Preprint",
44
+ "Presentation",
45
+ "Radio Broadcast",
46
+ "Report",
47
+ "Software",
48
+ "Standard",
49
+ "Statute",
50
+ "Thesis",
51
+ "TV Broadcast",
52
+ "Video Recording",
53
+ "Web Page",
54
+ ]
55
+
56
+ filter_excluded_types: ["attachment", "note", "annotation"]
@@ -0,0 +1,3 @@
1
+ """
2
+ Import all the modules in the package
3
+ """
@@ -0,0 +1,196 @@
1
+ """
2
+ Unit tests for main agent functionality.
3
+ Tests the supervisor agent's routing logic and state management.
4
+ """
5
+
6
+ # pylint: disable=redefined-outer-name,too-few-public-methods
7
+
8
+ from types import SimpleNamespace
9
+ import pytest
10
+ import hydra
11
+ from langchain_core.language_models.chat_models import BaseChatModel
12
+ from langchain_openai import ChatOpenAI
13
+ from pydantic import Field
14
+ from aiagents4pharma.talk2scholars.agents.main_agent import get_app
15
+
16
+ # --- Dummy LLM Implementation ---
17
+
18
+
19
+ class DummyLLM(BaseChatModel):
20
+ """A dummy language model implementation for testing purposes."""
21
+
22
+ model_name: str = Field(...)
23
+
24
+ def _generate(self, prompt, stop=None):
25
+ """Generate a response given a prompt."""
26
+ DummyLLM.called_prompt = prompt
27
+ return "dummy output"
28
+
29
+ @property
30
+ def _llm_type(self):
31
+ """Return the type of the language model."""
32
+ return "dummy"
33
+
34
+
35
+ # --- Dummy Workflow and Sub-agent Functions ---
36
+
37
+
38
+ class DummyWorkflow:
39
+ """A dummy workflow class that records arguments for verification."""
40
+
41
+ def __init__(self, supervisor_args=None):
42
+ """Initialize the workflow with the given supervisor arguments."""
43
+ self.supervisor_args = supervisor_args or {}
44
+ self.checkpointer = None
45
+ self.name = None
46
+
47
+ def compile(self, checkpointer, name):
48
+ """Compile the workflow with the given checkpointer and name."""
49
+ self.checkpointer = checkpointer
50
+ self.name = name
51
+ return self
52
+
53
+
54
+ def dummy_get_app_s2(uniq_id, llm_model):
55
+ """Return a DummyWorkflow for the S2 agent."""
56
+ dummy_get_app_s2.called_uniq_id = uniq_id
57
+ dummy_get_app_s2.called_llm_model = llm_model
58
+ return DummyWorkflow(supervisor_args={"agent": "s2", "uniq_id": uniq_id})
59
+
60
+
61
+ def dummy_get_app_zotero(uniq_id, llm_model):
62
+ """Return a DummyWorkflow for the Zotero agent."""
63
+ dummy_get_app_zotero.called_uniq_id = uniq_id
64
+ dummy_get_app_zotero.called_llm_model = llm_model
65
+ return DummyWorkflow(supervisor_args={"agent": "zotero", "uniq_id": uniq_id})
66
+
67
+
68
+ def dummy_create_supervisor(apps, model, state_schema, **kwargs):
69
+ """Return a DummyWorkflow for the supervisor."""
70
+ dummy_create_supervisor.called_kwargs = kwargs
71
+ return DummyWorkflow(
72
+ supervisor_args={
73
+ "apps": apps,
74
+ "model": model,
75
+ "state_schema": state_schema,
76
+ **kwargs,
77
+ }
78
+ )
79
+
80
+
81
+ # --- Dummy Hydra Configuration Setup ---
82
+
83
+
84
+ class DummyHydraContext:
85
+ """A dummy context manager for mocking Hydra's initialize and compose functions."""
86
+
87
+ def __enter__(self):
88
+ """Return None when entering the context."""
89
+ return None
90
+
91
+ def __exit__(self, exc_type, exc_val, traceback):
92
+ """Exit function that does nothing."""
93
+ return None
94
+
95
+
96
+ def dict_to_namespace(d):
97
+ """Convert a dictionary to a SimpleNamespace object."""
98
+ return SimpleNamespace(
99
+ **{
100
+ key: dict_to_namespace(val) if isinstance(val, dict) else val
101
+ for key, val in d.items()
102
+ }
103
+ )
104
+
105
+
106
+ dummy_config = {
107
+ "agents": {
108
+ "talk2scholars": {"main_agent": {"system_prompt": "Dummy system prompt"}}
109
+ }
110
+ }
111
+
112
+
113
+ class DummyHydraCompose:
114
+ """A dummy class that returns a namespace from a dummy config dictionary."""
115
+
116
+ def __init__(self, config):
117
+ """Constructor that stores the dummy config."""
118
+ self.config = config
119
+
120
+ def __getattr__(self, item):
121
+ """Return a namespace from the dummy config."""
122
+ return dict_to_namespace(self.config.get(item, {}))
123
+
124
+
125
+ # --- Pytest Fixtures to Patch Dependencies ---
126
+
127
+
128
+ @pytest.fixture(autouse=True)
129
+ def patch_hydra(monkeypatch):
130
+ """Patch the hydra.initialize and hydra.compose functions to return dummy objects."""
131
+ monkeypatch.setattr(
132
+ hydra, "initialize", lambda version_base, config_path: DummyHydraContext()
133
+ )
134
+ monkeypatch.setattr(
135
+ hydra, "compose", lambda config_name, overrides: DummyHydraCompose(dummy_config)
136
+ )
137
+
138
+
139
+ @pytest.fixture(autouse=True)
140
+ def patch_sub_agents_and_supervisor(monkeypatch):
141
+ """Patch the sub-agents and supervisor creation functions."""
142
+ monkeypatch.setattr(
143
+ "aiagents4pharma.talk2scholars.agents.main_agent.get_app_s2", dummy_get_app_s2
144
+ )
145
+ monkeypatch.setattr(
146
+ "aiagents4pharma.talk2scholars.agents.main_agent.get_app_zotero",
147
+ dummy_get_app_zotero,
148
+ )
149
+ monkeypatch.setattr(
150
+ "aiagents4pharma.talk2scholars.agents.main_agent.create_supervisor",
151
+ dummy_create_supervisor,
152
+ )
153
+
154
+
155
+ # --- Test Cases ---
156
+
157
+
158
+ def test_dummy_llm_generate():
159
+ """Test the dummy LLM's generate function."""
160
+ dummy = DummyLLM(model_name="test-model")
161
+ output = getattr(dummy, "_generate")("any prompt")
162
+ assert output == "dummy output"
163
+
164
+
165
+ def test_dummy_llm_llm_type():
166
+ """Test the dummy LLM's _llm_type property."""
167
+ dummy = DummyLLM(model_name="test-model")
168
+ assert getattr(dummy, "_llm_type") == "dummy"
169
+
170
+
171
+ def test_get_app_with_gpt4o_mini():
172
+ """
173
+ Test that get_app replaces a 'gpt-4o-mini' LLM with a new ChatOpenAI instance.
174
+ """
175
+ uniq_id = "test_thread"
176
+ dummy_llm = DummyLLM(model_name="gpt-4o-mini")
177
+ app = get_app(uniq_id, dummy_llm)
178
+
179
+ supervisor_args = getattr(app, "supervisor_args", {})
180
+ assert isinstance(supervisor_args.get("model"), ChatOpenAI)
181
+ assert supervisor_args.get("prompt") == "Dummy system prompt"
182
+ assert getattr(app, "name", "") == "Talk2Scholars_MainAgent"
183
+
184
+
185
+ def test_get_app_with_other_model():
186
+ """
187
+ Test that get_app does not replace the LLM if its model_name is not 'gpt-4o-mini'.
188
+ """
189
+ uniq_id = "test_thread_2"
190
+ dummy_llm = DummyLLM(model_name="other-model")
191
+ app = get_app(uniq_id, dummy_llm)
192
+
193
+ supervisor_args = getattr(app, "supervisor_args", {})
194
+ assert supervisor_args.get("model") is dummy_llm
195
+ assert supervisor_args.get("prompt") == "Dummy system prompt"
196
+ assert getattr(app, "name", "") == "Talk2Scholars_MainAgent"
@@ -0,0 +1,74 @@
1
+ """
2
+ Unit tests for S2 tools functionality.
3
+ """
4
+
5
+ # pylint: disable=redefined-outer-name
6
+ import pytest
7
+ from langgraph.types import Command
8
+ from ..tools.s2.display_results import (
9
+ display_results,
10
+ NoPapersFoundError as raised_error,
11
+ )
12
+
13
+
14
+ @pytest.fixture
15
+ def initial_state():
16
+ """Provides an empty initial state for tests."""
17
+ return {"papers": {}, "multi_papers": {}}
18
+
19
+
20
+ # Fixed test data for deterministic results
21
+ MOCK_SEARCH_RESPONSE = {
22
+ "data": [
23
+ {
24
+ "paperId": "123",
25
+ "title": "Machine Learning Basics",
26
+ "abstract": "An introduction to ML",
27
+ "year": 2023,
28
+ "citationCount": 100,
29
+ "url": "https://example.com/paper1",
30
+ "authors": [{"name": "Test Author"}],
31
+ }
32
+ ]
33
+ }
34
+
35
+ MOCK_STATE_PAPER = {
36
+ "123": {
37
+ "Title": "Machine Learning Basics",
38
+ "Abstract": "An introduction to ML",
39
+ "Year": 2023,
40
+ "Citation Count": 100,
41
+ "URL": "https://example.com/paper1",
42
+ }
43
+ }
44
+
45
+
46
+ class TestS2Tools:
47
+ """Unit tests for individual S2 tools"""
48
+
49
+ def test_display_results_empty_state(self, initial_state):
50
+ """Verifies display_results tool behavior when state is empty and raises an exception"""
51
+ with pytest.raises(
52
+ raised_error,
53
+ match="No papers found. A search/rec needs to be performed first.",
54
+ ):
55
+ display_results.invoke({"state": initial_state, "tool_call_id": "test123"})
56
+
57
+ def test_display_results_shows_papers(self, initial_state):
58
+ """Verifies display_results tool correctly returns papers from state"""
59
+ state = initial_state.copy()
60
+ state["last_displayed_papers"] = "papers"
61
+ state["papers"] = MOCK_STATE_PAPER
62
+
63
+ result = display_results.invoke(
64
+ input={"state": state, "tool_call_id": "test123"}
65
+ )
66
+
67
+ assert isinstance(result, Command) # Expect a Command object
68
+ assert isinstance(result.update, dict) # Ensure update is a dictionary
69
+ assert "messages" in result.update
70
+ assert len(result.update["messages"]) == 1
71
+ assert (
72
+ "1 papers found. Papers are attached as an artifact."
73
+ in result.update["messages"][0].content
74
+ )