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.
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/PKG-INFO +6 -5
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/README.md +5 -4
- aiagents4pharma-1.29.0/aiagents4pharma/talk2scholars/agents/main_agent.py +78 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/agents/s2_agent.py +10 -6
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/agents/zotero_agent.py +12 -6
- aiagents4pharma-1.29.0/aiagents4pharma/talk2scholars/configs/agents/talk2scholars/main_agent/default.yaml +13 -0
- aiagents4pharma-1.29.0/aiagents4pharma/talk2scholars/configs/agents/talk2scholars/s2_agent/default.yaml +19 -0
- aiagents4pharma-1.29.0/aiagents4pharma/talk2scholars/configs/agents/talk2scholars/zotero_agent/default.yaml +19 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/configs/config.yaml +1 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/configs/tools/__init__.py +1 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/configs/tools/multi_paper_recommendation/default.yaml +1 -1
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/configs/tools/search/default.yaml +1 -1
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/configs/tools/single_paper_recommendation/default.yaml +1 -1
- aiagents4pharma-1.29.0/aiagents4pharma/talk2scholars/configs/tools/zotero_read/default.yaml +56 -0
- aiagents4pharma-1.29.0/aiagents4pharma/talk2scholars/configs/tools/zotero_write/__inti__.py +3 -0
- aiagents4pharma-1.29.0/aiagents4pharma/talk2scholars/tests/test_main_agent.py +196 -0
- aiagents4pharma-1.29.0/aiagents4pharma/talk2scholars/tests/test_s2_display.py +74 -0
- aiagents4pharma-1.29.0/aiagents4pharma/talk2scholars/tests/test_s2_multi.py +282 -0
- aiagents4pharma-1.29.0/aiagents4pharma/talk2scholars/tests/test_s2_query.py +78 -0
- aiagents4pharma-1.29.0/aiagents4pharma/talk2scholars/tests/test_s2_retrieve.py +65 -0
- aiagents4pharma-1.29.0/aiagents4pharma/talk2scholars/tests/test_s2_search.py +266 -0
- aiagents4pharma-1.29.0/aiagents4pharma/talk2scholars/tests/test_s2_single.py +274 -0
- aiagents4pharma-1.29.0/aiagents4pharma/talk2scholars/tests/test_zotero_path.py +57 -0
- aiagents4pharma-1.29.0/aiagents4pharma/talk2scholars/tests/test_zotero_read.py +412 -0
- aiagents4pharma-1.29.0/aiagents4pharma/talk2scholars/tests/test_zotero_write.py +626 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/tools/s2/multi_paper_rec.py +50 -34
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/tools/s2/retrieve_semantic_scholar_paper_id.py +8 -8
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/tools/s2/search.py +36 -23
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/tools/s2/single_paper_rec.py +44 -38
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/tools/zotero/__init__.py +2 -0
- aiagents4pharma-1.29.0/aiagents4pharma/talk2scholars/tools/zotero/utils/__init__.py +5 -0
- aiagents4pharma-1.29.0/aiagents4pharma/talk2scholars/tools/zotero/utils/zotero_path.py +63 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/tools/zotero/zotero_read.py +64 -19
- aiagents4pharma-1.29.0/aiagents4pharma/talk2scholars/tools/zotero/zotero_write.py +247 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma.egg-info/PKG-INFO +6 -5
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma.egg-info/SOURCES.txt +14 -5
- aiagents4pharma-1.29.0/release_version.txt +1 -0
- aiagents4pharma-1.28.0/aiagents4pharma/talk2scholars/agents/main_agent.py +0 -252
- aiagents4pharma-1.28.0/aiagents4pharma/talk2scholars/configs/agents/talk2scholars/main_agent/default.yaml +0 -59
- aiagents4pharma-1.28.0/aiagents4pharma/talk2scholars/configs/agents/talk2scholars/s2_agent/default.yaml +0 -42
- aiagents4pharma-1.28.0/aiagents4pharma/talk2scholars/configs/agents/talk2scholars/zotero_agent/default.yaml +0 -35
- aiagents4pharma-1.28.0/aiagents4pharma/talk2scholars/configs/tools/zotero_read/default.yaml +0 -15
- aiagents4pharma-1.28.0/aiagents4pharma/talk2scholars/tests/test_call_s2.py +0 -100
- aiagents4pharma-1.28.0/aiagents4pharma/talk2scholars/tests/test_call_zotero.py +0 -94
- aiagents4pharma-1.28.0/aiagents4pharma/talk2scholars/tests/test_main_agent.py +0 -121
- aiagents4pharma-1.28.0/aiagents4pharma/talk2scholars/tests/test_s2_tools.py +0 -355
- aiagents4pharma-1.28.0/aiagents4pharma/talk2scholars/tests/test_zotero_tool.py +0 -171
- aiagents4pharma-1.28.0/release_version.txt +0 -1
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/LICENSE +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2aiagents4pharma/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2aiagents4pharma/agents/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2aiagents4pharma/agents/main_agent.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2aiagents4pharma/configs/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2aiagents4pharma/configs/agents/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2aiagents4pharma/configs/agents/main_agent/default.yaml +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2aiagents4pharma/configs/config.yaml +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2aiagents4pharma/states/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2aiagents4pharma/states/state_talk2aiagents4pharma.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2aiagents4pharma/tests/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2aiagents4pharma/tests/test_main_agent.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/agents/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/agents/t2b_agent.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/api/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/api/kegg.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/api/ols.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/api/uniprot.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/configs/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/configs/agents/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/configs/agents/t2b_agent/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/configs/agents/t2b_agent/default.yaml +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/configs/config.yaml +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/configs/tools/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/configs/tools/ask_question/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/configs/tools/ask_question/default.yaml +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/configs/tools/custom_plotter/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/configs/tools/custom_plotter/default.yaml +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/configs/tools/get_annotation/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/configs/tools/get_annotation/default.yaml +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/models/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/models/basico_model.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/models/sys_bio_model.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/states/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/states/state_talk2biomodels.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/tests/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/tests/test_api.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/tests/test_ask_question.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/tests/test_basico_model.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/tests/test_get_annotation.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/tests/test_getmodelinfo.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/tests/test_integration.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/tests/test_load_biomodel.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/tests/test_param_scan.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/tests/test_query_article.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/tests/test_search_models.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/tests/test_simulate_model.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/tests/test_steady_state.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/tests/test_sys_bio_model.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/tools/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/tools/ask_question.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/tools/custom_plotter.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/tools/get_annotation.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/tools/get_modelinfo.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/tools/load_arguments.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/tools/load_biomodel.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/tools/parameter_scan.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/tools/query_article.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/tools/search_models.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/tools/simulate_model.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/tools/steady_state.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2biomodels/tools/utils.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2cells/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2cells/agents/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2cells/agents/scp_agent.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2cells/states/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2cells/states/state_talk2cells.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2cells/tests/scp_agent/test_scp_agent.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2cells/tools/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2cells/tools/scp_agent/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2cells/tools/scp_agent/display_studies.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2cells/tools/scp_agent/search_studies.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/agents/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/agents/t2kg_agent.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/configs/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/configs/agents/t2kg_agent/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/configs/agents/t2kg_agent/default.yaml +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/configs/app/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/configs/app/frontend/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/configs/app/frontend/default.yaml +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/configs/config.yaml +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/configs/tools/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/configs/tools/graphrag_reasoning/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/configs/tools/graphrag_reasoning/default.yaml +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/configs/tools/subgraph_extraction/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/configs/tools/subgraph_extraction/default.yaml +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/configs/tools/subgraph_summarization/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/configs/tools/subgraph_summarization/default.yaml +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/datasets/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/datasets/biobridge_primekg.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/datasets/dataset.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/datasets/primekg.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/datasets/starkqa_primekg.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/states/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/states/state_talk2knowledgegraphs.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/tests/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/tests/test_agents_t2kg_agent.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/tests/test_datasets_biobridge_primekg.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/tests/test_datasets_dataset.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/tests/test_datasets_primekg.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/tests/test_datasets_starkqa_primekg.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/tests/test_tools_graphrag_reasoning.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/tests/test_tools_subgraph_extraction.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/tests/test_tools_subgraph_summarization.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/tests/test_utils_embeddings_embeddings.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/tests/test_utils_embeddings_huggingface.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/tests/test_utils_embeddings_nim_molmim.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/tests/test_utils_embeddings_ollama.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/tests/test_utils_embeddings_sentencetransformer.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_enrichments.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_ollama.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_pubchem.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/tests/test_utils_kg_utils.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/tests/test_utils_pubchem_utils.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/tools/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/tools/graphrag_reasoning.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/tools/load_arguments.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/tools/subgraph_extraction.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/tools/subgraph_summarization.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/utils/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/utils/embeddings/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/utils/embeddings/embeddings.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/utils/embeddings/huggingface.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/utils/embeddings/nim_molmim.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/utils/embeddings/ollama.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/utils/embeddings/sentence_transformer.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/utils/enrichments/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/utils/enrichments/enrichments.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/utils/enrichments/ollama.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/utils/enrichments/pubchem_strings.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/utils/extractions/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/utils/extractions/pcst.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/utils/kg_utils.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2knowledgegraphs/utils/pubchem_utils.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/agents/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/agents/pdf_agent.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/configs/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/configs/agents/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/configs/agents/talk2scholars/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/configs/agents/talk2scholars/main_agent/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/configs/agents/talk2scholars/pdf_agent/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/configs/agents/talk2scholars/s2_agent/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/configs/agents/talk2scholars/zotero_agent/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/configs/app/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/configs/app/frontend/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/configs/app/frontend/default.yaml +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/configs/tools/multi_paper_recommendation/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/configs/tools/question_and_answer/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/configs/tools/retrieve_semantic_scholar_paper_id/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/configs/tools/retrieve_semantic_scholar_paper_id/default.yaml +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/configs/tools/search/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/configs/tools/single_paper_recommendation/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/configs/tools/zotero_read/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/state/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/state/state_talk2scholars.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/tests/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/tests/test_llm_main_integration.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/tests/test_pdf_agent.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/tests/test_question_and_answer_tool.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/tests/test_routing_logic.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/tests/test_s2_agent.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/tests/test_state.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/tests/test_zotero_agent.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/tools/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/tools/pdf/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/tools/pdf/question_and_answer.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/tools/s2/__init__.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/tools/s2/display_results.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/tools/s2/query_results.py +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma.egg-info/dependency_links.txt +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma.egg-info/requires.txt +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma.egg-info/top_level.txt +0 -0
- {aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/pyproject.toml +0 -0
- {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.
|
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
|

|
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
|
-
#
|
139
|
-
#
|
140
|
-
#
|
141
|
-
#
|
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
|

|
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
|
-
#
|
74
|
-
#
|
75
|
-
#
|
76
|
-
#
|
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
|
{aiagents4pharma-1.28.0 → aiagents4pharma-1.29.0}/aiagents4pharma/talk2scholars/agents/s2_agent.py
RENAMED
@@ -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
|
-
|
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(
|
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
|
-
|
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(
|
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
|
@@ -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,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
|
+
)
|