aiagents4pharma 1.30.0__tar.gz → 1.30.2__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.
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/PKG-INFO +4 -3
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/agents/main_agent.py +18 -10
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/agents/paper_download_agent.py +5 -6
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/agents/pdf_agent.py +4 -10
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/agents/zotero_agent.py +9 -7
- aiagents4pharma-1.30.2/aiagents4pharma/talk2scholars/configs/agents/talk2scholars/main_agent/default.yaml +22 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/configs/agents/talk2scholars/s2_agent/default.yaml +2 -2
- aiagents4pharma-1.30.2/aiagents4pharma/talk2scholars/configs/agents/talk2scholars/zotero_agent/default.yaml +13 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/configs/app/frontend/default.yaml +1 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/configs/tools/multi_paper_recommendation/default.yaml +6 -1
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/configs/tools/search/default.yaml +7 -1
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/configs/tools/single_paper_recommendation/default.yaml +6 -1
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/configs/tools/zotero_read/default.yaml +1 -1
- aiagents4pharma-1.30.2/aiagents4pharma/talk2scholars/configs/tools/zotero_write/default.yaml +55 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/state/state_talk2scholars.py +7 -1
- aiagents4pharma-1.30.2/aiagents4pharma/talk2scholars/tests/test_llm_main_integration.py +89 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/tests/test_main_agent.py +24 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/tests/test_question_and_answer_tool.py +79 -15
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/tests/test_routing_logic.py +13 -10
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/tests/test_s2_multi.py +27 -4
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/tests/test_s2_search.py +19 -3
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/tests/test_s2_single.py +27 -3
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/tests/test_zotero_agent.py +3 -2
- aiagents4pharma-1.30.2/aiagents4pharma/talk2scholars/tests/test_zotero_human_in_the_loop.py +273 -0
- aiagents4pharma-1.30.2/aiagents4pharma/talk2scholars/tests/test_zotero_path.py +475 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/tests/test_zotero_read.py +25 -18
- aiagents4pharma-1.30.2/aiagents4pharma/talk2scholars/tests/test_zotero_write.py +161 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/tools/paper_download/abstract_downloader.py +2 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/tools/paper_download/arxiv_downloader.py +11 -4
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/tools/paper_download/download_arxiv_input.py +5 -1
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/tools/pdf/question_and_answer.py +73 -26
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/tools/s2/multi_paper_rec.py +46 -22
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/tools/s2/query_results.py +1 -1
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/tools/s2/search.py +40 -12
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/tools/s2/single_paper_rec.py +42 -16
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/tools/zotero/__init__.py +1 -0
- aiagents4pharma-1.30.2/aiagents4pharma/talk2scholars/tools/zotero/utils/zotero_path.py +188 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/tools/zotero/zotero_read.py +35 -20
- aiagents4pharma-1.30.2/aiagents4pharma/talk2scholars/tools/zotero/zotero_review.py +198 -0
- aiagents4pharma-1.30.2/aiagents4pharma/talk2scholars/tools/zotero/zotero_write.py +215 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma.egg-info/PKG-INFO +4 -3
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma.egg-info/SOURCES.txt +3 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma.egg-info/requires.txt +1 -1
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/pyproject.toml +3 -2
- aiagents4pharma-1.30.2/release_version.txt +1 -0
- aiagents4pharma-1.30.0/aiagents4pharma/talk2scholars/configs/agents/talk2scholars/main_agent/default.yaml +0 -13
- aiagents4pharma-1.30.0/aiagents4pharma/talk2scholars/configs/agents/talk2scholars/zotero_agent/default.yaml +0 -19
- aiagents4pharma-1.30.0/aiagents4pharma/talk2scholars/tests/test_llm_main_integration.py +0 -58
- aiagents4pharma-1.30.0/aiagents4pharma/talk2scholars/tests/test_zotero_path.py +0 -57
- aiagents4pharma-1.30.0/aiagents4pharma/talk2scholars/tests/test_zotero_write.py +0 -626
- aiagents4pharma-1.30.0/aiagents4pharma/talk2scholars/tools/zotero/utils/zotero_path.py +0 -63
- aiagents4pharma-1.30.0/aiagents4pharma/talk2scholars/tools/zotero/zotero_write.py +0 -247
- aiagents4pharma-1.30.0/release_version.txt +0 -1
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/LICENSE +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/README.md +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2aiagents4pharma/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2aiagents4pharma/agents/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2aiagents4pharma/agents/main_agent.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2aiagents4pharma/configs/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2aiagents4pharma/configs/agents/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2aiagents4pharma/configs/agents/main_agent/default.yaml +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2aiagents4pharma/configs/config.yaml +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2aiagents4pharma/states/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2aiagents4pharma/states/state_talk2aiagents4pharma.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2aiagents4pharma/tests/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2aiagents4pharma/tests/test_main_agent.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2biomodels/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2biomodels/agents/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2biomodels/agents/t2b_agent.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2biomodels/api/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2biomodels/api/kegg.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2biomodels/api/ols.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2biomodels/api/uniprot.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2biomodels/configs/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2biomodels/configs/agents/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2biomodels/configs/agents/t2b_agent/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2biomodels/configs/agents/t2b_agent/default.yaml +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2biomodels/configs/config.yaml +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2biomodels/configs/tools/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2biomodels/configs/tools/ask_question/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2biomodels/configs/tools/ask_question/default.yaml +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2biomodels/configs/tools/custom_plotter/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2biomodels/configs/tools/custom_plotter/default.yaml +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2biomodels/configs/tools/get_annotation/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2biomodels/configs/tools/get_annotation/default.yaml +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2biomodels/models/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2biomodels/models/basico_model.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2biomodels/models/sys_bio_model.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2biomodels/states/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2biomodels/states/state_talk2biomodels.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2biomodels/tests/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2biomodels/tests/test_api.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2biomodels/tests/test_ask_question.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2biomodels/tests/test_basico_model.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2biomodels/tests/test_get_annotation.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2biomodels/tests/test_getmodelinfo.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2biomodels/tests/test_integration.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2biomodels/tests/test_load_biomodel.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2biomodels/tests/test_param_scan.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2biomodels/tests/test_query_article.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2biomodels/tests/test_search_models.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2biomodels/tests/test_simulate_model.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2biomodels/tests/test_steady_state.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2biomodels/tests/test_sys_bio_model.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2biomodels/tools/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2biomodels/tools/ask_question.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2biomodels/tools/custom_plotter.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2biomodels/tools/get_annotation.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2biomodels/tools/get_modelinfo.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2biomodels/tools/load_arguments.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2biomodels/tools/load_biomodel.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2biomodels/tools/parameter_scan.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2biomodels/tools/query_article.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2biomodels/tools/search_models.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2biomodels/tools/simulate_model.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2biomodels/tools/steady_state.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2biomodels/tools/utils.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2cells/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2cells/agents/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2cells/agents/scp_agent.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2cells/states/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2cells/states/state_talk2cells.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2cells/tests/scp_agent/test_scp_agent.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2cells/tools/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2cells/tools/scp_agent/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2cells/tools/scp_agent/display_studies.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2cells/tools/scp_agent/search_studies.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2knowledgegraphs/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2knowledgegraphs/agents/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2knowledgegraphs/agents/t2kg_agent.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2knowledgegraphs/configs/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2knowledgegraphs/configs/agents/t2kg_agent/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2knowledgegraphs/configs/agents/t2kg_agent/default.yaml +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2knowledgegraphs/configs/app/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2knowledgegraphs/configs/app/frontend/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2knowledgegraphs/configs/app/frontend/default.yaml +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2knowledgegraphs/configs/config.yaml +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2knowledgegraphs/configs/tools/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2knowledgegraphs/configs/tools/graphrag_reasoning/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2knowledgegraphs/configs/tools/graphrag_reasoning/default.yaml +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2knowledgegraphs/configs/tools/subgraph_extraction/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2knowledgegraphs/configs/tools/subgraph_extraction/default.yaml +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2knowledgegraphs/configs/tools/subgraph_summarization/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2knowledgegraphs/configs/tools/subgraph_summarization/default.yaml +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2knowledgegraphs/datasets/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2knowledgegraphs/datasets/biobridge_primekg.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2knowledgegraphs/datasets/dataset.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2knowledgegraphs/datasets/primekg.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2knowledgegraphs/datasets/starkqa_primekg.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2knowledgegraphs/states/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2knowledgegraphs/states/state_talk2knowledgegraphs.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2knowledgegraphs/tests/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2knowledgegraphs/tests/test_agents_t2kg_agent.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2knowledgegraphs/tests/test_datasets_biobridge_primekg.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2knowledgegraphs/tests/test_datasets_dataset.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2knowledgegraphs/tests/test_datasets_primekg.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2knowledgegraphs/tests/test_datasets_starkqa_primekg.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2knowledgegraphs/tests/test_tools_graphrag_reasoning.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2knowledgegraphs/tests/test_tools_subgraph_extraction.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2knowledgegraphs/tests/test_tools_subgraph_summarization.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2knowledgegraphs/tests/test_utils_embeddings_embeddings.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2knowledgegraphs/tests/test_utils_embeddings_huggingface.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2knowledgegraphs/tests/test_utils_embeddings_nim_molmim.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2knowledgegraphs/tests/test_utils_embeddings_ollama.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2knowledgegraphs/tests/test_utils_embeddings_sentencetransformer.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_enrichments.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_ollama.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_pubchem.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2knowledgegraphs/tests/test_utils_kg_utils.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2knowledgegraphs/tests/test_utils_pubchem_utils.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2knowledgegraphs/tools/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2knowledgegraphs/tools/graphrag_reasoning.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2knowledgegraphs/tools/load_arguments.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2knowledgegraphs/tools/subgraph_extraction.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2knowledgegraphs/tools/subgraph_summarization.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2knowledgegraphs/utils/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2knowledgegraphs/utils/embeddings/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2knowledgegraphs/utils/embeddings/embeddings.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2knowledgegraphs/utils/embeddings/huggingface.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2knowledgegraphs/utils/embeddings/nim_molmim.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2knowledgegraphs/utils/embeddings/ollama.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2knowledgegraphs/utils/embeddings/sentence_transformer.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2knowledgegraphs/utils/enrichments/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2knowledgegraphs/utils/enrichments/enrichments.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2knowledgegraphs/utils/enrichments/ollama.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2knowledgegraphs/utils/enrichments/pubchem_strings.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2knowledgegraphs/utils/extractions/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2knowledgegraphs/utils/extractions/pcst.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2knowledgegraphs/utils/kg_utils.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2knowledgegraphs/utils/pubchem_utils.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/agents/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/agents/s2_agent.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/configs/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/configs/agents/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/configs/agents/talk2scholars/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/configs/agents/talk2scholars/main_agent/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/configs/agents/talk2scholars/paper_download_agent/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/configs/agents/talk2scholars/pdf_agent/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/configs/agents/talk2scholars/s2_agent/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/configs/agents/talk2scholars/zotero_agent/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/configs/app/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/configs/app/frontend/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/configs/config.yaml +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/configs/tools/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/configs/tools/download_arxiv_paper/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/configs/tools/multi_paper_recommendation/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/configs/tools/question_and_answer/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/configs/tools/retrieve_semantic_scholar_paper_id/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/configs/tools/retrieve_semantic_scholar_paper_id/default.yaml +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/configs/tools/search/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/configs/tools/single_paper_recommendation/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/configs/tools/zotero_read/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/configs/tools/zotero_write/__inti__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/state/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/tests/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/tests/test_paper_download_agent.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/tests/test_paper_download_tools.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/tests/test_pdf_agent.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/tests/test_s2_agent.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/tests/test_s2_display.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/tests/test_s2_query.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/tests/test_s2_retrieve.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/tests/test_state.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/tools/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/tools/paper_download/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/tools/pdf/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/tools/s2/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/tools/s2/display_results.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/tools/s2/retrieve_semantic_scholar_paper_id.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/tools/zotero/utils/__init__.py +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma.egg-info/dependency_links.txt +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma.egg-info/top_level.txt +0 -0
- {aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
|
|
1
|
-
Metadata-Version: 2.
|
1
|
+
Metadata-Version: 2.4
|
2
2
|
Name: aiagents4pharma
|
3
|
-
Version: 1.30.
|
3
|
+
Version: 1.30.2
|
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
|
@@ -23,7 +23,7 @@ Requires-Dist: langchain-experimental==0.3.3
|
|
23
23
|
Requires-Dist: langchain-nvidia-ai-endpoints==0.3.9
|
24
24
|
Requires-Dist: langchain-openai==0.2.5
|
25
25
|
Requires-Dist: langchain_ollama==0.2.3
|
26
|
-
Requires-Dist: langgraph_supervisor==0.0.
|
26
|
+
Requires-Dist: langgraph_supervisor==0.0.9
|
27
27
|
Requires-Dist: matplotlib==3.9.2
|
28
28
|
Requires-Dist: openai==1.59.4
|
29
29
|
Requires-Dist: ollama==0.4.7
|
@@ -62,6 +62,7 @@ Requires-Dist: umap-learn==0.5.7
|
|
62
62
|
Requires-Dist: plotly-express==0.4.1
|
63
63
|
Requires-Dist: seaborn==0.13.2
|
64
64
|
Requires-Dist: scanpy==1.11.0
|
65
|
+
Dynamic: license-file
|
65
66
|
|
66
67
|
[](https://github.com/VirtualPatientEngine/AIAgents4Pharma/actions/workflows/tests_talk2biomodels.yml)
|
67
68
|
[](https://github.com/VirtualPatientEngine/AIAgents4Pharma/actions/workflows/tests_talk2cells.yml)
|
{aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/agents/main_agent.py
RENAMED
@@ -1,11 +1,14 @@
|
|
1
1
|
#!/usr/bin/env python3
|
2
2
|
|
3
3
|
"""
|
4
|
-
Main agent for
|
4
|
+
Main agent module for initializing and running the Talk2Scholars application.
|
5
5
|
|
6
|
-
This module
|
7
|
-
|
8
|
-
|
6
|
+
This module sets up the hierarchical agent system using LangGraph and integrates
|
7
|
+
various sub-agents for handling different tasks such as semantic scholar, zotero,
|
8
|
+
PDF processing, and paper downloading.
|
9
|
+
|
10
|
+
Functions:
|
11
|
+
- get_app: Initializes and returns the LangGraph-based hierarchical agent system.
|
9
12
|
"""
|
10
13
|
|
11
14
|
import logging
|
@@ -16,6 +19,8 @@ from langchain_core.language_models.chat_models import BaseChatModel
|
|
16
19
|
from langgraph.checkpoint.memory import MemorySaver
|
17
20
|
from ..agents.s2_agent import get_app as get_app_s2
|
18
21
|
from ..agents.zotero_agent import get_app as get_app_zotero
|
22
|
+
from ..agents.pdf_agent import get_app as get_app_pdf
|
23
|
+
from ..agents.paper_download_agent import get_app as get_app_paper_download
|
19
24
|
from ..state.state_talk2scholars import Talk2Scholars
|
20
25
|
|
21
26
|
# Initialize logger
|
@@ -43,12 +48,13 @@ def get_app(uniq_id, llm_model: BaseChatModel):
|
|
43
48
|
>>> app = get_app("thread_123")
|
44
49
|
>>> result = app.invoke(initial_state)
|
45
50
|
"""
|
46
|
-
if llm_model
|
47
|
-
llm_model
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
51
|
+
if hasattr(llm_model, "model_name"):
|
52
|
+
if llm_model.model_name == "gpt-4o-mini":
|
53
|
+
llm_model = ChatOpenAI(
|
54
|
+
model="gpt-4o-mini",
|
55
|
+
temperature=0,
|
56
|
+
model_kwargs={"parallel_tool_calls": False},
|
57
|
+
)
|
52
58
|
# Load hydra configuration
|
53
59
|
logger.log(logging.INFO, "Launching Talk2Scholars with thread_id %s", uniq_id)
|
54
60
|
with hydra.initialize(version_base=None, config_path="../configs/"):
|
@@ -62,6 +68,8 @@ def get_app(uniq_id, llm_model: BaseChatModel):
|
|
62
68
|
[
|
63
69
|
get_app_s2(uniq_id, llm_model), # semantic scholar
|
64
70
|
get_app_zotero(uniq_id, llm_model), # zotero
|
71
|
+
get_app_pdf(uniq_id, llm_model), # pdf
|
72
|
+
get_app_paper_download(uniq_id, llm_model), # paper download
|
65
73
|
],
|
66
74
|
model=llm_model,
|
67
75
|
state_schema=Talk2Scholars,
|
@@ -20,6 +20,7 @@ from ..tools.s2.query_results import query_results
|
|
20
20
|
logging.basicConfig(level=logging.INFO)
|
21
21
|
logger = logging.getLogger(__name__)
|
22
22
|
|
23
|
+
|
23
24
|
def get_app(uniq_id, llm_model: BaseChatModel):
|
24
25
|
"""
|
25
26
|
Initializes and returns the LangGraph application for the Talk2Scholars paper download agent.
|
@@ -39,14 +40,12 @@ def get_app(uniq_id, llm_model: BaseChatModel):
|
|
39
40
|
with hydra.initialize(version_base=None, config_path="../configs"):
|
40
41
|
cfg = hydra.compose(
|
41
42
|
config_name="config",
|
42
|
-
overrides=["agents/talk2scholars/paper_download_agent=default"]
|
43
|
+
overrides=["agents/talk2scholars/paper_download_agent=default"],
|
43
44
|
)
|
44
45
|
cfg = cfg.agents.talk2scholars.paper_download_agent
|
45
46
|
|
46
47
|
# Define tools properly
|
47
|
-
tools = ToolNode(
|
48
|
-
[download_arxiv_paper, query_results]
|
49
|
-
)
|
48
|
+
tools = ToolNode([download_arxiv_paper, query_results])
|
50
49
|
|
51
50
|
# Define the model
|
52
51
|
logger.info("Using OpenAI model %s", llm_model)
|
@@ -54,7 +53,7 @@ def get_app(uniq_id, llm_model: BaseChatModel):
|
|
54
53
|
llm_model,
|
55
54
|
tools=tools,
|
56
55
|
state_schema=Talk2Scholars,
|
57
|
-
prompt=cfg.
|
56
|
+
prompt=cfg.paper_download_agent,
|
58
57
|
checkpointer=MemorySaver(),
|
59
58
|
)
|
60
59
|
|
@@ -79,7 +78,7 @@ def get_app(uniq_id, llm_model: BaseChatModel):
|
|
79
78
|
checkpointer = MemorySaver()
|
80
79
|
|
81
80
|
# Compile the graph
|
82
|
-
app = workflow.compile(checkpointer=checkpointer)
|
81
|
+
app = workflow.compile(checkpointer=checkpointer, name="agent_paper_download")
|
83
82
|
|
84
83
|
# Logging the information and returning the app
|
85
84
|
logger.info("Compiled the graph")
|
{aiagents4pharma-1.30.0 → aiagents4pharma-1.30.2}/aiagents4pharma/talk2scholars/agents/pdf_agent.py
RENAMED
@@ -26,10 +26,7 @@ logging.basicConfig(level=logging.INFO)
|
|
26
26
|
logger = logging.getLogger(__name__)
|
27
27
|
|
28
28
|
|
29
|
-
def get_app(
|
30
|
-
uniq_id,
|
31
|
-
llm_model: BaseChatModel
|
32
|
-
):
|
29
|
+
def get_app(uniq_id, llm_model: BaseChatModel):
|
33
30
|
"""
|
34
31
|
Initializes and returns the LangGraph application for the PDF agent.
|
35
32
|
|
@@ -40,7 +37,7 @@ def get_app(
|
|
40
37
|
|
41
38
|
Args:
|
42
39
|
uniq_id (str): A unique identifier for the current conversation session or thread.
|
43
|
-
llm_model (BaseChatModel, optional): The language model instance to be used.
|
40
|
+
llm_model (BaseChatModel, optional): The language model instance to be used.
|
44
41
|
Defaults to ChatOpenAI(model="gpt-4o-mini", temperature=0).
|
45
42
|
|
46
43
|
Returns:
|
@@ -71,10 +68,7 @@ def get_app(
|
|
71
68
|
Any: The response generated by the language model after processing the state.
|
72
69
|
"""
|
73
70
|
logger.info("Creating Agent_PDF node with thread_id %s", uniq_id)
|
74
|
-
response = model.invoke(
|
75
|
-
state,
|
76
|
-
{"configurable": {"thread_id": uniq_id}}
|
77
|
-
)
|
71
|
+
response = model.invoke(state, {"configurable": {"thread_id": uniq_id}})
|
78
72
|
return response
|
79
73
|
|
80
74
|
# Define the tool node that includes the PDF QnA tool.
|
@@ -100,7 +94,7 @@ def get_app(
|
|
100
94
|
checkpointer = MemorySaver()
|
101
95
|
|
102
96
|
# Compile the graph into a runnable app.
|
103
|
-
app = workflow.compile(checkpointer=checkpointer)
|
97
|
+
app = workflow.compile(checkpointer=checkpointer, name="agent_pdf")
|
104
98
|
logger.info("Compiled the PDF agent graph.")
|
105
99
|
|
106
100
|
return app
|
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env python3
|
2
2
|
|
3
3
|
"""
|
4
|
-
Agent for interacting with Zotero
|
4
|
+
Agent for interacting with Zotero with human-in-the-loop features
|
5
5
|
"""
|
6
6
|
|
7
7
|
import logging
|
@@ -13,8 +13,9 @@ from langgraph.graph import START, StateGraph
|
|
13
13
|
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
|
-
from ..tools.zotero.zotero_read import
|
17
|
-
from ..tools.zotero.
|
16
|
+
from ..tools.zotero.zotero_read import zotero_read
|
17
|
+
from ..tools.zotero.zotero_review import zotero_review
|
18
|
+
from ..tools.zotero.zotero_write import zotero_write
|
18
19
|
from ..tools.s2.display_results import display_results as s2_display
|
19
20
|
from ..tools.s2.query_results import query_results as s2_query_results
|
20
21
|
from ..tools.s2.retrieve_semantic_scholar_paper_id import (
|
@@ -32,7 +33,7 @@ def get_app(uniq_id, llm_model: BaseChatModel):
|
|
32
33
|
|
33
34
|
This function sets up the Zotero agent, which integrates various tools to search,
|
34
35
|
retrieve, and display research papers from Zotero. The agent follows the ReAct
|
35
|
-
pattern for structured interaction.
|
36
|
+
pattern for structured interaction and includes human-in-the-loop features.
|
36
37
|
|
37
38
|
Args:
|
38
39
|
uniq_id (str): Unique identifier for the current conversation session.
|
@@ -87,11 +88,12 @@ def get_app(uniq_id, llm_model: BaseChatModel):
|
|
87
88
|
# Define the tools
|
88
89
|
tools = ToolNode(
|
89
90
|
[
|
90
|
-
|
91
|
+
zotero_read,
|
91
92
|
s2_display,
|
92
93
|
s2_query_results,
|
93
94
|
retrieve_semantic_scholar_paper_id,
|
94
|
-
|
95
|
+
zotero_review, # First review
|
96
|
+
zotero_write, # Then save with user confirmation
|
95
97
|
]
|
96
98
|
)
|
97
99
|
|
@@ -104,7 +106,7 @@ def get_app(uniq_id, llm_model: BaseChatModel):
|
|
104
106
|
tools=tools,
|
105
107
|
state_schema=Talk2Scholars,
|
106
108
|
prompt=cfg.zotero_agent,
|
107
|
-
checkpointer=MemorySaver(),
|
109
|
+
checkpointer=MemorySaver(), # Required for interrupts to work
|
108
110
|
)
|
109
111
|
|
110
112
|
workflow = StateGraph(Talk2Scholars)
|
@@ -0,0 +1,22 @@
|
|
1
|
+
_target_: agents.main_agent.get_app
|
2
|
+
temperature: 0
|
3
|
+
system_prompt: >
|
4
|
+
You are Talk2Scholars agent coordinating academic paper discovery
|
5
|
+
and analysis with help of the following agents:
|
6
|
+
1. Agent S2: This agent can be used to search and recommend papers
|
7
|
+
from Semantic Scholar. Use this agent when the user asks for
|
8
|
+
general paper/article searches and recommendations, or to retrieve information
|
9
|
+
from the last displayed results table or query abstract of last
|
10
|
+
displayed results.
|
11
|
+
2. Agent Zotero: This agent can be used to retrieve, display, and query
|
12
|
+
papers/articles from the Zotero library. Use this agent only when the user
|
13
|
+
explicitly asks for papers from Zotero. This tool can also be used to
|
14
|
+
save papers in the zotero library.
|
15
|
+
3. Agent PaperFetch: This agent can be used to download papers/articles
|
16
|
+
from ArXiv.
|
17
|
+
4. Agent PDFQuery: This agent can be used to query contents of an
|
18
|
+
uploaded or downloaded PDF/paper/article.
|
19
|
+
|
20
|
+
Your final response should be a one sentence summary of the information
|
21
|
+
retrieved from the agents above. Do not repeat the information already
|
22
|
+
displayed to the user in the response of the agents.
|
@@ -15,5 +15,5 @@ s2_agent: >
|
|
15
15
|
1. When user requests papers, use search/recommendation tools to find papers
|
16
16
|
2. Use `display_results` tool to display the response from the search/recommendation tools
|
17
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 "
|
19
|
-
pass the "
|
18
|
+
4. When the user wants recommendations, you can get the "semantic_scholar_paper_id" using `query_results` tool in the "last_displayed_results" key, then
|
19
|
+
pass the "semantic_scholar_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,13 @@
|
|
1
|
+
target: agents.zotero_agent.get_app
|
2
|
+
zotero_agent: >
|
3
|
+
You are a knowledgeable research assistant with expertise in academic literature.
|
4
|
+
Your goal is to help users find, manage, and save relevant research papers and display them.
|
5
|
+
|
6
|
+
When saving papers to Zotero:
|
7
|
+
1. First use zotero_review with the collection path.
|
8
|
+
2. Wait for user confirmation (they must say "Yes" or "Approve").
|
9
|
+
3. Use zotero_write with both the collection_path and user_confirmation and call `s2_display` tool after the papers as saved.
|
10
|
+
|
11
|
+
IMPORTANT: Human approval is required for saving papers to Zotero. Never save papers
|
12
|
+
without explicit approval from the user. Always respect the user's decision if they
|
13
|
+
choose not to save papers.
|
@@ -6,10 +6,15 @@ api_fields:
|
|
6
6
|
- "title"
|
7
7
|
- "abstract"
|
8
8
|
- "year"
|
9
|
-
- "authors"
|
9
|
+
- "authors.name"
|
10
|
+
- "authors.authorId"
|
10
11
|
- "citationCount"
|
11
12
|
- "url"
|
12
13
|
- "externalIds"
|
14
|
+
- "venue"
|
15
|
+
- "publicationVenue" # Full object, instead of specific subfields
|
16
|
+
- "journal" # Full object, instead of specific subfields
|
17
|
+
- "publicationDate"
|
13
18
|
# Commented fields that could be added later if needed
|
14
19
|
|
15
20
|
# Default headers and params
|
@@ -6,10 +6,16 @@ api_fields:
|
|
6
6
|
- "title"
|
7
7
|
- "abstract"
|
8
8
|
- "year"
|
9
|
-
- "authors"
|
9
|
+
- "authors.name"
|
10
|
+
- "authors.authorId"
|
10
11
|
- "citationCount"
|
11
12
|
- "url"
|
12
13
|
- "externalIds"
|
14
|
+
- "venue"
|
15
|
+
- "publicationVenue" # Full object, instead of specific subfields
|
16
|
+
- "journal" # Full object, instead of specific subfields
|
17
|
+
- "publicationDate"
|
18
|
+
|
13
19
|
# Commented fields that could be added later if needed
|
14
20
|
# - "publicationTypes"
|
15
21
|
# - "openAccessPdf"
|
@@ -6,10 +6,15 @@ api_fields:
|
|
6
6
|
- "title"
|
7
7
|
- "abstract"
|
8
8
|
- "year"
|
9
|
-
- "authors"
|
9
|
+
- "authors.name"
|
10
|
+
- "authors.authorId"
|
10
11
|
- "citationCount"
|
11
12
|
- "url"
|
12
13
|
- "externalIds"
|
14
|
+
- "venue"
|
15
|
+
- "publicationVenue" # Full object, instead of specific subfields
|
16
|
+
- "journal" # Full object, instead of specific subfields
|
17
|
+
- "publicationDate"
|
13
18
|
# Commented fields that could be added later if needed
|
14
19
|
# - "publicationTypes"
|
15
20
|
# - "openAccessPdf"
|
@@ -0,0 +1,55 @@
|
|
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
|
+
# filter_excluded_types: ["attachment", "note", "annotation"]
|
@@ -9,6 +9,7 @@ across agent interactions.
|
|
9
9
|
import logging
|
10
10
|
from typing import Annotated, Any, Dict
|
11
11
|
from langchain_core.language_models import BaseChatModel
|
12
|
+
from langchain_core.embeddings import Embeddings
|
12
13
|
from langgraph.prebuilt.chat_agent_executor import AgentState
|
13
14
|
|
14
15
|
# Configure logging
|
@@ -53,7 +54,11 @@ class Talk2Scholars(AgentState):
|
|
53
54
|
papers (Dict[str, Any]): Stores the research papers retrieved from the agent's queries.
|
54
55
|
multi_papers (Dict[str, Any]): Stores multiple recommended papers from various sources.
|
55
56
|
zotero_read (Dict[str, Any]): Stores the papers retrieved from Zotero.
|
57
|
+
zotero_write_approval_status (Dict[str, Any]): Stores the approval status and collection
|
58
|
+
path for Zotero save operations.
|
56
59
|
llm_model (BaseChatModel): The language model instance used for generating responses.
|
60
|
+
text_embedding_model (Embeddings): The text embedding model used for
|
61
|
+
similarity calculations.
|
57
62
|
"""
|
58
63
|
|
59
64
|
# Agent state fields
|
@@ -62,5 +67,6 @@ class Talk2Scholars(AgentState):
|
|
62
67
|
multi_papers: Annotated[Dict[str, Any], replace_dict]
|
63
68
|
pdf_data: Annotated[Dict[str, Any], replace_dict]
|
64
69
|
zotero_read: Annotated[Dict[str, Any], replace_dict]
|
70
|
+
zotero_write_approval_status: Annotated[Dict[str, Any], replace_dict]
|
65
71
|
llm_model: BaseChatModel
|
66
|
-
|
72
|
+
text_embedding_model: Embeddings
|
@@ -0,0 +1,89 @@
|
|
1
|
+
"""
|
2
|
+
Integration tests for talk2scholars system with OpenAI.
|
3
|
+
This test triggers all sub-agents by sending a conversation that covers:
|
4
|
+
- Searching Semantic Scholar (S2 agent)
|
5
|
+
- Retrieving Zotero results (Zotero agent)
|
6
|
+
- Querying PDF content (PDF agent)
|
7
|
+
- Downloading paper details from arXiv (Paper Download agent)
|
8
|
+
"""
|
9
|
+
|
10
|
+
# This will be covered in the next pr.
|
11
|
+
|
12
|
+
#
|
13
|
+
# import os
|
14
|
+
# import pytest
|
15
|
+
# import hydra
|
16
|
+
# from langchain_openai import ChatOpenAI
|
17
|
+
# from langchain_core.messages import HumanMessage, AIMessage
|
18
|
+
# from ..agents.main_agent import get_app
|
19
|
+
# from ..state.state_talk2scholars import Talk2Scholars
|
20
|
+
#
|
21
|
+
# # pylint: disable=redefined-outer-name,too-few-public-methods
|
22
|
+
#
|
23
|
+
#
|
24
|
+
# @pytest.mark.skipif(
|
25
|
+
# not os.getenv("OPENAI_API_KEY"), reason="Requires OpenAI API key to run"
|
26
|
+
# )
|
27
|
+
# def test_main_agent_real_llm():
|
28
|
+
# """
|
29
|
+
# Integration test for the Talk2Scholars system using a real OpenAI LLM.
|
30
|
+
# This test verifies that the supervisor correctly routes to all sub-agents by
|
31
|
+
# providing a conversation with queries intended to trigger each agent.
|
32
|
+
# """
|
33
|
+
# # Load Hydra configuration EXACTLY like in main_agent.py
|
34
|
+
# with hydra.initialize(version_base=None, config_path="../configs"):
|
35
|
+
# cfg = hydra.compose(
|
36
|
+
# config_name="config", overrides=["agents/talk2scholars/main_agent=default"]
|
37
|
+
# )
|
38
|
+
# hydra_cfg = cfg.agents.talk2scholars.main_agent
|
39
|
+
# assert hydra_cfg is not None, "Hydra config failed to load"
|
40
|
+
#
|
41
|
+
# # Use the real OpenAI API (ensure OPENAI_API_KEY is set in environment)
|
42
|
+
# llm = ChatOpenAI(model="gpt-4o-mini", temperature=hydra_cfg.temperature)
|
43
|
+
#
|
44
|
+
# # Initialize the main agent workflow (with real Hydra config)
|
45
|
+
# thread_id = "test_thread"
|
46
|
+
# app = get_app(thread_id, llm)
|
47
|
+
#
|
48
|
+
# # Provide a multi-turn conversation intended to trigger all sub-agents:
|
49
|
+
# # - S2 agent: "Search Semantic Scholar for AI papers on transformers."
|
50
|
+
# # - Zotero agent: "Retrieve Zotero results for these papers."
|
51
|
+
# # - PDF agent: "Analyze the attached PDF and summarize its key findings."
|
52
|
+
# # - Paper Download agent: "Download the paper details from arXiv."
|
53
|
+
# initial_state = Talk2Scholars(
|
54
|
+
# messages=[
|
55
|
+
# HumanMessage(
|
56
|
+
# content="Search Semantic Scholar for AI papers on transformers."
|
57
|
+
# ),
|
58
|
+
# HumanMessage(content="Also, retrieve Zotero results for these papers."),
|
59
|
+
# HumanMessage(
|
60
|
+
# content="I have attached a PDF; analyze it and tell me the key findings."
|
61
|
+
# ),
|
62
|
+
# HumanMessage(content="Finally, download the paper from arXiv."),
|
63
|
+
# ]
|
64
|
+
# )
|
65
|
+
#
|
66
|
+
# # Invoke the agent (which routes to the appropriate sub-agents)
|
67
|
+
# result = app.invoke(
|
68
|
+
# initial_state,
|
69
|
+
# {"configurable": {"config_id": thread_id, "thread_id": thread_id}},
|
70
|
+
# )
|
71
|
+
#
|
72
|
+
# # Assert that the result contains messages and that the final message is valid.
|
73
|
+
# assert "messages" in result, "Expected 'messages' in the response"
|
74
|
+
# last_message = result["messages"][-1]
|
75
|
+
# assert isinstance(
|
76
|
+
# last_message, (HumanMessage, AIMessage, str)
|
77
|
+
# ), "Last message should be a valid response type"
|
78
|
+
#
|
79
|
+
# # Concatenate message texts (if available) to perform keyword checks.
|
80
|
+
# output_text = " ".join(
|
81
|
+
# msg.content if hasattr(msg, "content") else str(msg)
|
82
|
+
# for msg in result["messages"]
|
83
|
+
# ).lower()
|
84
|
+
#
|
85
|
+
# # Check for keywords that suggest each sub-agent was invoked.
|
86
|
+
# for keyword in ["semantic scholar", "zotero", "pdf", "arxiv"]:
|
87
|
+
# assert (
|
88
|
+
# keyword in output_text
|
89
|
+
# ), f"Expected keyword '{keyword}' in the output response"
|
@@ -65,6 +65,13 @@ def dummy_get_app_zotero(uniq_id, llm_model):
|
|
65
65
|
return DummyWorkflow(supervisor_args={"agent": "zotero", "uniq_id": uniq_id})
|
66
66
|
|
67
67
|
|
68
|
+
def dummy_get_app_pdf(uniq_id, llm_model):
|
69
|
+
"""Return a DummyWorkflow for the PDF agent."""
|
70
|
+
dummy_get_app_pdf.called_uniq_id = uniq_id
|
71
|
+
dummy_get_app_pdf.called_llm_model = llm_model
|
72
|
+
return DummyWorkflow(supervisor_args={"agent": "pdf", "uniq_id": uniq_id})
|
73
|
+
|
74
|
+
|
68
75
|
def dummy_create_supervisor(apps, model, state_schema, **kwargs):
|
69
76
|
"""Return a DummyWorkflow for the supervisor."""
|
70
77
|
dummy_create_supervisor.called_kwargs = kwargs
|
@@ -136,6 +143,15 @@ def patch_hydra(monkeypatch):
|
|
136
143
|
)
|
137
144
|
|
138
145
|
|
146
|
+
def dummy_get_app_paper_download(uniq_id, llm_model):
|
147
|
+
"""Return a DummyWorkflow for the paper download agent."""
|
148
|
+
dummy_get_app_paper_download.called_uniq_id = uniq_id
|
149
|
+
dummy_get_app_paper_download.called_llm_model = llm_model
|
150
|
+
return DummyWorkflow(
|
151
|
+
supervisor_args={"agent": "paper_download", "uniq_id": uniq_id}
|
152
|
+
)
|
153
|
+
|
154
|
+
|
139
155
|
@pytest.fixture(autouse=True)
|
140
156
|
def patch_sub_agents_and_supervisor(monkeypatch):
|
141
157
|
"""Patch the sub-agents and supervisor creation functions."""
|
@@ -146,6 +162,14 @@ def patch_sub_agents_and_supervisor(monkeypatch):
|
|
146
162
|
"aiagents4pharma.talk2scholars.agents.main_agent.get_app_zotero",
|
147
163
|
dummy_get_app_zotero,
|
148
164
|
)
|
165
|
+
monkeypatch.setattr(
|
166
|
+
"aiagents4pharma.talk2scholars.agents.main_agent.get_app_pdf",
|
167
|
+
dummy_get_app_pdf,
|
168
|
+
)
|
169
|
+
monkeypatch.setattr(
|
170
|
+
"aiagents4pharma.talk2scholars.agents.main_agent.get_app_paper_download",
|
171
|
+
dummy_get_app_paper_download,
|
172
|
+
)
|
149
173
|
monkeypatch.setattr(
|
150
174
|
"aiagents4pharma.talk2scholars.agents.main_agent.create_supervisor",
|
151
175
|
dummy_create_supervisor,
|