aiagents4pharma 1.43.0__py3-none-any.whl → 1.45.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- aiagents4pharma/__init__.py +2 -2
- aiagents4pharma/talk2aiagents4pharma/.dockerignore +13 -0
- aiagents4pharma/talk2aiagents4pharma/Dockerfile +105 -0
- aiagents4pharma/talk2aiagents4pharma/README.md +1 -0
- aiagents4pharma/talk2aiagents4pharma/__init__.py +4 -5
- aiagents4pharma/talk2aiagents4pharma/agents/__init__.py +3 -2
- aiagents4pharma/talk2aiagents4pharma/agents/main_agent.py +24 -23
- aiagents4pharma/talk2aiagents4pharma/configs/__init__.py +2 -2
- aiagents4pharma/talk2aiagents4pharma/configs/agents/__init__.py +2 -2
- aiagents4pharma/talk2aiagents4pharma/configs/agents/main_agent/default.yaml +2 -2
- aiagents4pharma/talk2aiagents4pharma/configs/config.yaml +1 -1
- aiagents4pharma/talk2aiagents4pharma/docker-compose/cpu/.env.example +23 -0
- aiagents4pharma/talk2aiagents4pharma/docker-compose/cpu/docker-compose.yml +93 -0
- aiagents4pharma/talk2aiagents4pharma/docker-compose/gpu/.env.example +23 -0
- aiagents4pharma/talk2aiagents4pharma/docker-compose/gpu/docker-compose.yml +108 -0
- aiagents4pharma/talk2aiagents4pharma/install.md +127 -0
- aiagents4pharma/talk2aiagents4pharma/states/__init__.py +3 -2
- aiagents4pharma/talk2aiagents4pharma/states/state_talk2aiagents4pharma.py +5 -3
- aiagents4pharma/talk2aiagents4pharma/tests/__init__.py +2 -2
- aiagents4pharma/talk2aiagents4pharma/tests/test_main_agent.py +72 -50
- aiagents4pharma/talk2biomodels/.dockerignore +13 -0
- aiagents4pharma/talk2biomodels/Dockerfile +104 -0
- aiagents4pharma/talk2biomodels/README.md +1 -0
- aiagents4pharma/talk2biomodels/__init__.py +4 -8
- aiagents4pharma/talk2biomodels/agents/__init__.py +3 -2
- aiagents4pharma/talk2biomodels/agents/t2b_agent.py +47 -42
- aiagents4pharma/talk2biomodels/api/__init__.py +4 -5
- aiagents4pharma/talk2biomodels/api/kegg.py +14 -10
- aiagents4pharma/talk2biomodels/api/ols.py +13 -10
- aiagents4pharma/talk2biomodels/api/uniprot.py +7 -6
- aiagents4pharma/talk2biomodels/configs/__init__.py +3 -4
- aiagents4pharma/talk2biomodels/configs/agents/__init__.py +2 -2
- aiagents4pharma/talk2biomodels/configs/agents/t2b_agent/__init__.py +2 -2
- aiagents4pharma/talk2biomodels/configs/agents/t2b_agent/default.yaml +1 -1
- aiagents4pharma/talk2biomodels/configs/config.yaml +1 -1
- aiagents4pharma/talk2biomodels/configs/tools/__init__.py +4 -5
- aiagents4pharma/talk2biomodels/configs/tools/ask_question/__init__.py +2 -2
- aiagents4pharma/talk2biomodels/configs/tools/ask_question/default.yaml +1 -2
- aiagents4pharma/talk2biomodels/configs/tools/custom_plotter/__init__.py +2 -2
- aiagents4pharma/talk2biomodels/configs/tools/custom_plotter/default.yaml +1 -1
- aiagents4pharma/talk2biomodels/configs/tools/get_annotation/__init__.py +2 -2
- aiagents4pharma/talk2biomodels/configs/tools/get_annotation/default.yaml +1 -1
- aiagents4pharma/talk2biomodels/install.md +63 -0
- aiagents4pharma/talk2biomodels/models/__init__.py +4 -4
- aiagents4pharma/talk2biomodels/models/basico_model.py +36 -28
- aiagents4pharma/talk2biomodels/models/sys_bio_model.py +13 -10
- aiagents4pharma/talk2biomodels/states/__init__.py +3 -2
- aiagents4pharma/talk2biomodels/states/state_talk2biomodels.py +12 -8
- aiagents4pharma/talk2biomodels/tests/BIOMD0000000449_url.xml +1585 -0
- aiagents4pharma/talk2biomodels/tests/__init__.py +2 -2
- aiagents4pharma/talk2biomodels/tests/article_on_model_537.pdf +0 -0
- aiagents4pharma/talk2biomodels/tests/test_api.py +18 -14
- aiagents4pharma/talk2biomodels/tests/test_ask_question.py +8 -9
- aiagents4pharma/talk2biomodels/tests/test_basico_model.py +15 -9
- aiagents4pharma/talk2biomodels/tests/test_get_annotation.py +54 -55
- aiagents4pharma/talk2biomodels/tests/test_getmodelinfo.py +28 -27
- aiagents4pharma/talk2biomodels/tests/test_integration.py +21 -33
- aiagents4pharma/talk2biomodels/tests/test_load_biomodel.py +14 -11
- aiagents4pharma/talk2biomodels/tests/test_param_scan.py +21 -20
- aiagents4pharma/talk2biomodels/tests/test_query_article.py +129 -29
- aiagents4pharma/talk2biomodels/tests/test_search_models.py +9 -13
- aiagents4pharma/talk2biomodels/tests/test_simulate_model.py +16 -15
- aiagents4pharma/talk2biomodels/tests/test_steady_state.py +12 -22
- aiagents4pharma/talk2biomodels/tests/test_sys_bio_model.py +33 -29
- aiagents4pharma/talk2biomodels/tools/__init__.py +15 -12
- aiagents4pharma/talk2biomodels/tools/ask_question.py +42 -32
- aiagents4pharma/talk2biomodels/tools/custom_plotter.py +51 -43
- aiagents4pharma/talk2biomodels/tools/get_annotation.py +99 -75
- aiagents4pharma/talk2biomodels/tools/get_modelinfo.py +57 -51
- aiagents4pharma/talk2biomodels/tools/load_arguments.py +52 -32
- aiagents4pharma/talk2biomodels/tools/load_biomodel.py +8 -2
- aiagents4pharma/talk2biomodels/tools/parameter_scan.py +107 -90
- aiagents4pharma/talk2biomodels/tools/query_article.py +14 -13
- aiagents4pharma/talk2biomodels/tools/search_models.py +37 -26
- aiagents4pharma/talk2biomodels/tools/simulate_model.py +47 -37
- aiagents4pharma/talk2biomodels/tools/steady_state.py +76 -58
- aiagents4pharma/talk2biomodels/tools/utils.py +4 -3
- aiagents4pharma/talk2cells/README.md +1 -0
- aiagents4pharma/talk2cells/__init__.py +4 -5
- aiagents4pharma/talk2cells/agents/__init__.py +3 -2
- aiagents4pharma/talk2cells/agents/scp_agent.py +21 -19
- aiagents4pharma/talk2cells/states/__init__.py +3 -2
- aiagents4pharma/talk2cells/states/state_talk2cells.py +4 -2
- aiagents4pharma/talk2cells/tests/scp_agent/test_scp_agent.py +8 -9
- aiagents4pharma/talk2cells/tools/__init__.py +3 -2
- aiagents4pharma/talk2cells/tools/scp_agent/__init__.py +4 -4
- aiagents4pharma/talk2cells/tools/scp_agent/display_studies.py +5 -3
- aiagents4pharma/talk2cells/tools/scp_agent/search_studies.py +21 -22
- aiagents4pharma/talk2knowledgegraphs/.dockerignore +13 -0
- aiagents4pharma/talk2knowledgegraphs/Dockerfile +103 -0
- aiagents4pharma/talk2knowledgegraphs/README.md +1 -0
- aiagents4pharma/talk2knowledgegraphs/__init__.py +4 -7
- aiagents4pharma/talk2knowledgegraphs/agents/__init__.py +3 -2
- aiagents4pharma/talk2knowledgegraphs/agents/t2kg_agent.py +40 -30
- aiagents4pharma/talk2knowledgegraphs/configs/__init__.py +3 -6
- aiagents4pharma/talk2knowledgegraphs/configs/agents/t2kg_agent/__init__.py +2 -2
- aiagents4pharma/talk2knowledgegraphs/configs/agents/t2kg_agent/default.yaml +8 -8
- aiagents4pharma/talk2knowledgegraphs/configs/app/__init__.py +3 -2
- aiagents4pharma/talk2knowledgegraphs/configs/app/frontend/__init__.py +2 -2
- aiagents4pharma/talk2knowledgegraphs/configs/app/frontend/default.yaml +1 -1
- aiagents4pharma/talk2knowledgegraphs/configs/config.yaml +1 -1
- aiagents4pharma/talk2knowledgegraphs/configs/tools/__init__.py +4 -5
- aiagents4pharma/talk2knowledgegraphs/configs/tools/graphrag_reasoning/__init__.py +2 -2
- aiagents4pharma/talk2knowledgegraphs/configs/tools/graphrag_reasoning/default.yaml +1 -1
- aiagents4pharma/talk2knowledgegraphs/configs/tools/multimodal_subgraph_extraction/default.yaml +17 -2
- aiagents4pharma/talk2knowledgegraphs/configs/tools/subgraph_extraction/__init__.py +2 -2
- aiagents4pharma/talk2knowledgegraphs/configs/tools/subgraph_extraction/default.yaml +1 -1
- aiagents4pharma/talk2knowledgegraphs/configs/tools/subgraph_summarization/__init__.py +2 -2
- aiagents4pharma/talk2knowledgegraphs/configs/tools/subgraph_summarization/default.yaml +1 -1
- aiagents4pharma/talk2knowledgegraphs/configs/utils/enrichments/ols_terms/default.yaml +1 -1
- aiagents4pharma/talk2knowledgegraphs/configs/utils/enrichments/reactome_pathways/default.yaml +1 -1
- aiagents4pharma/talk2knowledgegraphs/configs/utils/enrichments/uniprot_proteins/default.yaml +1 -1
- aiagents4pharma/talk2knowledgegraphs/configs/utils/pubchem_utils/default.yaml +1 -1
- aiagents4pharma/talk2knowledgegraphs/datasets/__init__.py +4 -6
- aiagents4pharma/talk2knowledgegraphs/datasets/biobridge_primekg.py +115 -67
- aiagents4pharma/talk2knowledgegraphs/datasets/dataset.py +2 -0
- aiagents4pharma/talk2knowledgegraphs/datasets/primekg.py +35 -24
- aiagents4pharma/talk2knowledgegraphs/datasets/starkqa_primekg.py +29 -21
- aiagents4pharma/talk2knowledgegraphs/docker-compose/cpu/.env.example +23 -0
- aiagents4pharma/talk2knowledgegraphs/docker-compose/cpu/docker-compose.yml +93 -0
- aiagents4pharma/talk2knowledgegraphs/docker-compose/gpu/.env.example +23 -0
- aiagents4pharma/talk2knowledgegraphs/docker-compose/gpu/docker-compose.yml +108 -0
- aiagents4pharma/talk2knowledgegraphs/entrypoint.sh +190 -0
- aiagents4pharma/talk2knowledgegraphs/install.md +140 -0
- aiagents4pharma/talk2knowledgegraphs/milvus_data_dump.py +31 -65
- aiagents4pharma/talk2knowledgegraphs/states/__init__.py +3 -2
- aiagents4pharma/talk2knowledgegraphs/states/state_talk2knowledgegraphs.py +1 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_agents_t2kg_agent.py +65 -40
- aiagents4pharma/talk2knowledgegraphs/tests/test_datasets_biobridge_primekg.py +54 -48
- aiagents4pharma/talk2knowledgegraphs/tests/test_datasets_dataset.py +4 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_datasets_primekg.py +17 -4
- aiagents4pharma/talk2knowledgegraphs/tests/test_datasets_starkqa_primekg.py +33 -24
- aiagents4pharma/talk2knowledgegraphs/tests/test_tools_graphrag_reasoning.py +116 -69
- aiagents4pharma/talk2knowledgegraphs/tests/test_tools_milvus_multimodal_subgraph_extraction.py +736 -413
- aiagents4pharma/talk2knowledgegraphs/tests/test_tools_multimodal_subgraph_extraction.py +22 -15
- aiagents4pharma/talk2knowledgegraphs/tests/test_tools_subgraph_extraction.py +19 -12
- aiagents4pharma/talk2knowledgegraphs/tests/test_tools_subgraph_summarization.py +95 -48
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_embeddings_embeddings.py +4 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_embeddings_huggingface.py +5 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_embeddings_nim_molmim.py +13 -18
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_embeddings_ollama.py +10 -3
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_enrichments.py +4 -3
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_ollama.py +3 -2
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_ols.py +1 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_pubchem.py +9 -4
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_reactome.py +6 -6
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_uniprot.py +4 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_extractions_milvus_multimodal_pcst.py +442 -42
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_kg_utils.py +3 -4
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_pubchem_utils.py +10 -6
- aiagents4pharma/talk2knowledgegraphs/tools/__init__.py +10 -7
- aiagents4pharma/talk2knowledgegraphs/tools/graphrag_reasoning.py +15 -20
- aiagents4pharma/talk2knowledgegraphs/tools/milvus_multimodal_subgraph_extraction.py +245 -205
- aiagents4pharma/talk2knowledgegraphs/tools/multimodal_subgraph_extraction.py +92 -90
- aiagents4pharma/talk2knowledgegraphs/tools/subgraph_extraction.py +25 -37
- aiagents4pharma/talk2knowledgegraphs/tools/subgraph_summarization.py +10 -13
- aiagents4pharma/talk2knowledgegraphs/utils/__init__.py +4 -7
- aiagents4pharma/talk2knowledgegraphs/utils/embeddings/__init__.py +4 -7
- aiagents4pharma/talk2knowledgegraphs/utils/embeddings/embeddings.py +4 -0
- aiagents4pharma/talk2knowledgegraphs/utils/embeddings/huggingface.py +11 -14
- aiagents4pharma/talk2knowledgegraphs/utils/embeddings/nim_molmim.py +7 -7
- aiagents4pharma/talk2knowledgegraphs/utils/embeddings/ollama.py +12 -6
- aiagents4pharma/talk2knowledgegraphs/utils/embeddings/sentence_transformer.py +8 -6
- aiagents4pharma/talk2knowledgegraphs/utils/enrichments/__init__.py +9 -6
- aiagents4pharma/talk2knowledgegraphs/utils/enrichments/enrichments.py +1 -0
- aiagents4pharma/talk2knowledgegraphs/utils/enrichments/ollama.py +15 -9
- aiagents4pharma/talk2knowledgegraphs/utils/enrichments/ols_terms.py +23 -20
- aiagents4pharma/talk2knowledgegraphs/utils/enrichments/pubchem_strings.py +12 -10
- aiagents4pharma/talk2knowledgegraphs/utils/enrichments/reactome_pathways.py +16 -10
- aiagents4pharma/talk2knowledgegraphs/utils/enrichments/uniprot_proteins.py +26 -18
- aiagents4pharma/talk2knowledgegraphs/utils/extractions/__init__.py +4 -5
- aiagents4pharma/talk2knowledgegraphs/utils/extractions/milvus_multimodal_pcst.py +218 -81
- aiagents4pharma/talk2knowledgegraphs/utils/extractions/multimodal_pcst.py +53 -47
- aiagents4pharma/talk2knowledgegraphs/utils/extractions/pcst.py +18 -14
- aiagents4pharma/talk2knowledgegraphs/utils/kg_utils.py +22 -23
- aiagents4pharma/talk2knowledgegraphs/utils/pubchem_utils.py +11 -10
- aiagents4pharma/talk2scholars/.dockerignore +13 -0
- aiagents4pharma/talk2scholars/Dockerfile +104 -0
- aiagents4pharma/talk2scholars/README.md +1 -0
- aiagents4pharma/talk2scholars/agents/__init__.py +1 -5
- aiagents4pharma/talk2scholars/agents/main_agent.py +6 -4
- aiagents4pharma/talk2scholars/agents/paper_download_agent.py +5 -4
- aiagents4pharma/talk2scholars/agents/pdf_agent.py +4 -2
- aiagents4pharma/talk2scholars/agents/s2_agent.py +2 -2
- aiagents4pharma/talk2scholars/agents/zotero_agent.py +10 -11
- aiagents4pharma/talk2scholars/configs/__init__.py +1 -3
- aiagents4pharma/talk2scholars/configs/agents/talk2scholars/__init__.py +1 -4
- aiagents4pharma/talk2scholars/configs/agents/talk2scholars/main_agent/default.yaml +1 -1
- aiagents4pharma/talk2scholars/configs/agents/talk2scholars/pdf_agent/default.yaml +1 -1
- aiagents4pharma/talk2scholars/configs/agents/talk2scholars/s2_agent/default.yaml +8 -8
- aiagents4pharma/talk2scholars/configs/agents/talk2scholars/zotero_agent/default.yaml +7 -7
- aiagents4pharma/talk2scholars/configs/tools/__init__.py +8 -6
- aiagents4pharma/talk2scholars/docker-compose/cpu/.env.example +21 -0
- aiagents4pharma/talk2scholars/docker-compose/cpu/docker-compose.yml +90 -0
- aiagents4pharma/talk2scholars/docker-compose/gpu/.env.example +21 -0
- aiagents4pharma/talk2scholars/docker-compose/gpu/docker-compose.yml +105 -0
- aiagents4pharma/talk2scholars/install.md +122 -0
- aiagents4pharma/talk2scholars/state/state_talk2scholars.py +8 -8
- aiagents4pharma/talk2scholars/tests/{test_main_agent.py → test_agents_main_agent.py} +41 -23
- aiagents4pharma/talk2scholars/tests/{test_paper_download_agent.py → test_agents_paper_agents_download_agent.py} +10 -16
- aiagents4pharma/talk2scholars/tests/{test_pdf_agent.py → test_agents_pdf_agent.py} +6 -10
- aiagents4pharma/talk2scholars/tests/{test_s2_agent.py → test_agents_s2_agent.py} +8 -16
- aiagents4pharma/talk2scholars/tests/{test_zotero_agent.py → test_agents_zotero_agent.py} +5 -7
- aiagents4pharma/talk2scholars/tests/{test_s2_display_dataframe.py → test_s2_tools_display_dataframe.py} +6 -7
- aiagents4pharma/talk2scholars/tests/{test_s2_query_dataframe.py → test_s2_tools_query_dataframe.py} +5 -15
- aiagents4pharma/talk2scholars/tests/{test_paper_downloader.py → test_tools_paper_downloader.py} +25 -63
- aiagents4pharma/talk2scholars/tests/{test_question_and_answer_tool.py → test_tools_question_and_answer_tool.py} +2 -6
- aiagents4pharma/talk2scholars/tests/{test_s2_multi.py → test_tools_s2_multi.py} +5 -5
- aiagents4pharma/talk2scholars/tests/{test_s2_retrieve.py → test_tools_s2_retrieve.py} +2 -1
- aiagents4pharma/talk2scholars/tests/{test_s2_search.py → test_tools_s2_search.py} +5 -5
- aiagents4pharma/talk2scholars/tests/{test_s2_single.py → test_tools_s2_single.py} +5 -5
- aiagents4pharma/talk2scholars/tests/{test_arxiv_downloader.py → test_utils_arxiv_downloader.py} +16 -25
- aiagents4pharma/talk2scholars/tests/{test_base_paper_downloader.py → test_utils_base_paper_downloader.py} +25 -47
- aiagents4pharma/talk2scholars/tests/{test_biorxiv_downloader.py → test_utils_biorxiv_downloader.py} +14 -42
- aiagents4pharma/talk2scholars/tests/{test_medrxiv_downloader.py → test_utils_medrxiv_downloader.py} +15 -49
- aiagents4pharma/talk2scholars/tests/{test_nvidia_nim_reranker.py → test_utils_nvidia_nim_reranker.py} +6 -16
- aiagents4pharma/talk2scholars/tests/{test_pdf_answer_formatter.py → test_utils_pdf_answer_formatter.py} +1 -0
- aiagents4pharma/talk2scholars/tests/{test_pdf_batch_processor.py → test_utils_pdf_batch_processor.py} +6 -15
- aiagents4pharma/talk2scholars/tests/{test_pdf_collection_manager.py → test_utils_pdf_collection_manager.py} +34 -11
- aiagents4pharma/talk2scholars/tests/{test_pdf_document_processor.py → test_utils_pdf_document_processor.py} +2 -3
- aiagents4pharma/talk2scholars/tests/{test_pdf_generate_answer.py → test_utils_pdf_generate_answer.py} +3 -6
- aiagents4pharma/talk2scholars/tests/{test_pdf_gpu_detection.py → test_utils_pdf_gpu_detection.py} +5 -16
- aiagents4pharma/talk2scholars/tests/{test_pdf_rag_pipeline.py → test_utils_pdf_rag_pipeline.py} +7 -17
- aiagents4pharma/talk2scholars/tests/{test_pdf_retrieve_chunks.py → test_utils_pdf_retrieve_chunks.py} +4 -11
- aiagents4pharma/talk2scholars/tests/{test_pdf_singleton_manager.py → test_utils_pdf_singleton_manager.py} +26 -23
- aiagents4pharma/talk2scholars/tests/{test_pdf_vector_normalization.py → test_utils_pdf_vector_normalization.py} +1 -1
- aiagents4pharma/talk2scholars/tests/{test_pdf_vector_store.py → test_utils_pdf_vector_store.py} +27 -55
- aiagents4pharma/talk2scholars/tests/{test_pubmed_downloader.py → test_utils_pubmed_downloader.py} +31 -91
- aiagents4pharma/talk2scholars/tests/{test_read_helper_utils.py → test_utils_read_helper_utils.py} +2 -6
- aiagents4pharma/talk2scholars/tests/{test_s2_utils_ext_ids.py → test_utils_s2_utils_ext_ids.py} +5 -15
- aiagents4pharma/talk2scholars/tests/{test_zotero_human_in_the_loop.py → test_utils_zotero_human_in_the_loop.py} +6 -13
- aiagents4pharma/talk2scholars/tests/{test_zotero_path.py → test_utils_zotero_path.py} +53 -45
- aiagents4pharma/talk2scholars/tests/{test_zotero_read.py → test_utils_zotero_read.py} +30 -91
- aiagents4pharma/talk2scholars/tests/{test_zotero_write.py → test_utils_zotero_write.py} +6 -16
- aiagents4pharma/talk2scholars/tools/__init__.py +1 -4
- aiagents4pharma/talk2scholars/tools/paper_download/paper_downloader.py +20 -35
- aiagents4pharma/talk2scholars/tools/paper_download/utils/__init__.py +7 -5
- aiagents4pharma/talk2scholars/tools/paper_download/utils/arxiv_downloader.py +9 -11
- aiagents4pharma/talk2scholars/tools/paper_download/utils/base_paper_downloader.py +14 -21
- aiagents4pharma/talk2scholars/tools/paper_download/utils/biorxiv_downloader.py +14 -22
- aiagents4pharma/talk2scholars/tools/paper_download/utils/medrxiv_downloader.py +11 -13
- aiagents4pharma/talk2scholars/tools/paper_download/utils/pubmed_downloader.py +14 -28
- aiagents4pharma/talk2scholars/tools/pdf/question_and_answer.py +4 -8
- aiagents4pharma/talk2scholars/tools/pdf/utils/__init__.py +16 -14
- aiagents4pharma/talk2scholars/tools/pdf/utils/answer_formatter.py +4 -4
- aiagents4pharma/talk2scholars/tools/pdf/utils/batch_processor.py +15 -17
- aiagents4pharma/talk2scholars/tools/pdf/utils/collection_manager.py +2 -2
- aiagents4pharma/talk2scholars/tools/pdf/utils/document_processor.py +5 -5
- aiagents4pharma/talk2scholars/tools/pdf/utils/generate_answer.py +4 -4
- aiagents4pharma/talk2scholars/tools/pdf/utils/get_vectorstore.py +2 -6
- aiagents4pharma/talk2scholars/tools/pdf/utils/gpu_detection.py +5 -9
- aiagents4pharma/talk2scholars/tools/pdf/utils/nvidia_nim_reranker.py +4 -4
- aiagents4pharma/talk2scholars/tools/pdf/utils/paper_loader.py +2 -2
- aiagents4pharma/talk2scholars/tools/pdf/utils/rag_pipeline.py +6 -15
- aiagents4pharma/talk2scholars/tools/pdf/utils/retrieve_chunks.py +7 -15
- aiagents4pharma/talk2scholars/tools/pdf/utils/singleton_manager.py +2 -2
- aiagents4pharma/talk2scholars/tools/pdf/utils/tool_helper.py +3 -4
- aiagents4pharma/talk2scholars/tools/pdf/utils/vector_normalization.py +8 -17
- aiagents4pharma/talk2scholars/tools/pdf/utils/vector_store.py +17 -33
- aiagents4pharma/talk2scholars/tools/s2/__init__.py +8 -6
- aiagents4pharma/talk2scholars/tools/s2/display_dataframe.py +3 -7
- aiagents4pharma/talk2scholars/tools/s2/multi_paper_rec.py +7 -6
- aiagents4pharma/talk2scholars/tools/s2/query_dataframe.py +5 -12
- aiagents4pharma/talk2scholars/tools/s2/retrieve_semantic_scholar_paper_id.py +2 -4
- aiagents4pharma/talk2scholars/tools/s2/search.py +6 -6
- aiagents4pharma/talk2scholars/tools/s2/single_paper_rec.py +5 -3
- aiagents4pharma/talk2scholars/tools/s2/utils/__init__.py +1 -3
- aiagents4pharma/talk2scholars/tools/s2/utils/multi_helper.py +12 -18
- aiagents4pharma/talk2scholars/tools/s2/utils/search_helper.py +11 -18
- aiagents4pharma/talk2scholars/tools/s2/utils/single_helper.py +11 -16
- aiagents4pharma/talk2scholars/tools/zotero/__init__.py +1 -4
- aiagents4pharma/talk2scholars/tools/zotero/utils/__init__.py +1 -4
- aiagents4pharma/talk2scholars/tools/zotero/utils/read_helper.py +21 -39
- aiagents4pharma/talk2scholars/tools/zotero/utils/review_helper.py +2 -6
- aiagents4pharma/talk2scholars/tools/zotero/utils/write_helper.py +8 -11
- aiagents4pharma/talk2scholars/tools/zotero/utils/zotero_path.py +4 -12
- aiagents4pharma/talk2scholars/tools/zotero/utils/zotero_pdf_downloader.py +13 -27
- aiagents4pharma/talk2scholars/tools/zotero/zotero_read.py +4 -7
- aiagents4pharma/talk2scholars/tools/zotero/zotero_review.py +8 -10
- aiagents4pharma/talk2scholars/tools/zotero/zotero_write.py +3 -2
- {aiagents4pharma-1.43.0.dist-info → aiagents4pharma-1.45.0.dist-info}/METADATA +115 -50
- aiagents4pharma-1.45.0.dist-info/RECORD +324 -0
- {aiagents4pharma-1.43.0.dist-info → aiagents4pharma-1.45.0.dist-info}/WHEEL +1 -2
- aiagents4pharma-1.43.0.dist-info/RECORD +0 -293
- aiagents4pharma-1.43.0.dist-info/top_level.txt +0 -1
- /aiagents4pharma/talk2scholars/tests/{test_state.py → test_states_state.py} +0 -0
- /aiagents4pharma/talk2scholars/tests/{test_pdf_paper_loader.py → test_utils_pdf_paper_loader.py} +0 -0
- /aiagents4pharma/talk2scholars/tests/{test_tool_helper_utils.py → test_utils_tool_helper_utils.py} +0 -0
- /aiagents4pharma/talk2scholars/tests/{test_zotero_pdf_downloader_utils.py → test_utils_zotero_pdf_downloader_utils.py} +0 -0
- {aiagents4pharma-1.43.0.dist-info → aiagents4pharma-1.45.0.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,90 @@
|
|
1
|
+
version: "1.0.0"
|
2
|
+
|
3
|
+
services:
|
4
|
+
# talk2scholars
|
5
|
+
talk2scholars:
|
6
|
+
container_name: talk2scholars
|
7
|
+
image: vpatientengine/talk2scholars:latest
|
8
|
+
platform: linux/amd64
|
9
|
+
ports:
|
10
|
+
- "8501:8501"
|
11
|
+
environment:
|
12
|
+
- MILVUS_HOST=milvus-standalone
|
13
|
+
- MILVUS_PORT=19530
|
14
|
+
env_file:
|
15
|
+
- .env
|
16
|
+
healthcheck:
|
17
|
+
test: ["CMD", "curl", "-f", "http://localhost:8501/health"]
|
18
|
+
interval: 30s
|
19
|
+
timeout: 10s
|
20
|
+
retries: 3
|
21
|
+
start_period: 30s
|
22
|
+
depends_on:
|
23
|
+
milvus-standalone:
|
24
|
+
condition: service_healthy
|
25
|
+
|
26
|
+
# Milvus Dependencies
|
27
|
+
etcd:
|
28
|
+
container_name: milvus-etcd
|
29
|
+
image: quay.io/coreos/etcd:v3.5.18
|
30
|
+
environment:
|
31
|
+
- ETCD_AUTO_COMPACTION_MODE=revision
|
32
|
+
- ETCD_AUTO_COMPACTION_RETENTION=1000
|
33
|
+
- ETCD_QUOTA_BACKEND_BYTES=4294967296
|
34
|
+
- ETCD_SNAPSHOT_COUNT=50000
|
35
|
+
volumes:
|
36
|
+
- ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/etcd:/etcd
|
37
|
+
command: etcd -advertise-client-urls=http://etcd:2379 -listen-client-urls http://0.0.0.0:2379 --data-dir /etcd
|
38
|
+
healthcheck:
|
39
|
+
test: ["CMD", "etcdctl", "endpoint", "health"]
|
40
|
+
interval: 30s
|
41
|
+
timeout: 20s
|
42
|
+
retries: 3
|
43
|
+
|
44
|
+
minio:
|
45
|
+
container_name: milvus-minio
|
46
|
+
image: minio/minio:RELEASE.2024-05-28T17-19-04Z
|
47
|
+
environment:
|
48
|
+
MINIO_ACCESS_KEY: minioadmin
|
49
|
+
MINIO_SECRET_KEY: minioadmin
|
50
|
+
ports:
|
51
|
+
- "9001:9001"
|
52
|
+
- "9000:9000"
|
53
|
+
volumes:
|
54
|
+
- ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/minio:/minio_data
|
55
|
+
command: minio server /minio_data --console-address ":9001"
|
56
|
+
healthcheck:
|
57
|
+
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
|
58
|
+
interval: 30s
|
59
|
+
timeout: 20s
|
60
|
+
retries: 3
|
61
|
+
|
62
|
+
# Milvus Vector Database (CPU-only)
|
63
|
+
milvus-standalone:
|
64
|
+
container_name: milvus-standalone
|
65
|
+
image: milvusdb/milvus:v2.5.14
|
66
|
+
command: ["milvus", "run", "standalone"]
|
67
|
+
security_opt:
|
68
|
+
- seccomp:unconfined
|
69
|
+
environment:
|
70
|
+
MINIO_REGION: us-east-1
|
71
|
+
ETCD_ENDPOINTS: etcd:2379
|
72
|
+
MINIO_ADDRESS: minio:9000
|
73
|
+
volumes:
|
74
|
+
- ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus
|
75
|
+
ports:
|
76
|
+
- "19530:19530"
|
77
|
+
- "9091:9091"
|
78
|
+
healthcheck:
|
79
|
+
test: ["CMD", "curl", "-f", "http://localhost:9091/healthz"]
|
80
|
+
interval: 30s
|
81
|
+
start_period: 90s
|
82
|
+
timeout: 20s
|
83
|
+
retries: 3
|
84
|
+
depends_on:
|
85
|
+
- "etcd"
|
86
|
+
- "minio"
|
87
|
+
|
88
|
+
networks:
|
89
|
+
milvus:
|
90
|
+
name: milvus
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# .env.example (DO NOT put actual API keys here, read the README.md)
|
2
|
+
|
3
|
+
# OPENAI API KEY
|
4
|
+
OPENAI_API_KEY=your_openai_api_key_here
|
5
|
+
|
6
|
+
# LangSmith API KEY
|
7
|
+
LANGCHAIN_TRACING_V2=true
|
8
|
+
LANGCHAIN_API_KEY=your_langchain_api_key_heres
|
9
|
+
|
10
|
+
# NVIDIA API KEY
|
11
|
+
NVIDIA_API_KEY=your_nvidia_api_key_here
|
12
|
+
|
13
|
+
# ZOTERO API KEY
|
14
|
+
ZOTERO_API_KEY=your_zotero_api_key_here
|
15
|
+
ZOTERO_USER_ID=your_zotero_user_id_here
|
16
|
+
|
17
|
+
# Set environment variables for data loader
|
18
|
+
MILVUS_HOST=milvus-standalone
|
19
|
+
MILVUS_PORT=19530
|
20
|
+
MILVUS_DB_NAME=pdf_rag_db
|
21
|
+
MILVUS_COLLECTION_NAME=pdf_rag_documents
|
@@ -0,0 +1,105 @@
|
|
1
|
+
version: "1.0.0"
|
2
|
+
|
3
|
+
services:
|
4
|
+
# talk2scholars
|
5
|
+
talk2scholars:
|
6
|
+
container_name: talk2scholars
|
7
|
+
image: vpatientengine/talk2scholars:latest
|
8
|
+
platform: linux/amd64
|
9
|
+
ports:
|
10
|
+
- "8501:8501"
|
11
|
+
deploy:
|
12
|
+
resources:
|
13
|
+
reservations:
|
14
|
+
devices:
|
15
|
+
- driver: nvidia
|
16
|
+
capabilities: ["gpu"]
|
17
|
+
device_ids: ["0"]
|
18
|
+
environment:
|
19
|
+
- MILVUS_HOST=milvus-standalone
|
20
|
+
- MILVUS_PORT=19530
|
21
|
+
env_file:
|
22
|
+
- .env
|
23
|
+
healthcheck:
|
24
|
+
test: ["CMD", "curl", "-f", "http://localhost:8501/health"]
|
25
|
+
interval: 30s
|
26
|
+
timeout: 10s
|
27
|
+
retries: 3
|
28
|
+
start_period: 30s
|
29
|
+
depends_on:
|
30
|
+
milvus-standalone:
|
31
|
+
condition: service_healthy
|
32
|
+
|
33
|
+
# Milvus Dependencies
|
34
|
+
etcd:
|
35
|
+
container_name: milvus-etcd
|
36
|
+
image: quay.io/coreos/etcd:v3.5.18
|
37
|
+
environment:
|
38
|
+
- ETCD_AUTO_COMPACTION_MODE=revision
|
39
|
+
- ETCD_AUTO_COMPACTION_RETENTION=1000
|
40
|
+
- ETCD_QUOTA_BACKEND_BYTES=4294967296
|
41
|
+
- ETCD_SNAPSHOT_COUNT=50000
|
42
|
+
volumes:
|
43
|
+
- ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/etcd:/etcd
|
44
|
+
command: etcd -advertise-client-urls=http://etcd:2379 -listen-client-urls http://0.0.0.0:2379 --data-dir /etcd
|
45
|
+
healthcheck:
|
46
|
+
test: ["CMD", "etcdctl", "endpoint", "health"]
|
47
|
+
interval: 30s
|
48
|
+
timeout: 20s
|
49
|
+
retries: 3
|
50
|
+
|
51
|
+
minio:
|
52
|
+
container_name: milvus-minio
|
53
|
+
image: minio/minio:RELEASE.2023-03-20T20-16-18Z
|
54
|
+
environment:
|
55
|
+
MINIO_ACCESS_KEY: minioadmin
|
56
|
+
MINIO_SECRET_KEY: minioadmin
|
57
|
+
ports:
|
58
|
+
- "9001:9001"
|
59
|
+
- "9000:9000"
|
60
|
+
volumes:
|
61
|
+
- ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/minio:/minio_data
|
62
|
+
command: minio server /minio_data --console-address ":9001"
|
63
|
+
healthcheck:
|
64
|
+
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
|
65
|
+
interval: 30s
|
66
|
+
timeout: 20s
|
67
|
+
retries: 3
|
68
|
+
|
69
|
+
# Milvus Vector Database (GPU-enabled)
|
70
|
+
milvus-standalone:
|
71
|
+
container_name: milvus-standalone
|
72
|
+
image: milvusdb/milvus:v2.6.0-rc1-gpu
|
73
|
+
command: ["milvus", "run", "standalone"]
|
74
|
+
security_opt:
|
75
|
+
- seccomp:unconfined
|
76
|
+
environment:
|
77
|
+
MINIO_REGION: us-east-1
|
78
|
+
ETCD_ENDPOINTS: etcd:2379
|
79
|
+
MINIO_ADDRESS: minio:9000
|
80
|
+
MQ_TYPE: woodpecker
|
81
|
+
volumes:
|
82
|
+
- ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus
|
83
|
+
ports:
|
84
|
+
- "19530:19530"
|
85
|
+
- "9091:9091"
|
86
|
+
deploy:
|
87
|
+
resources:
|
88
|
+
reservations:
|
89
|
+
devices:
|
90
|
+
- driver: nvidia
|
91
|
+
capabilities: ["gpu"]
|
92
|
+
device_ids: ["0"]
|
93
|
+
healthcheck:
|
94
|
+
test: ["CMD", "curl", "-f", "http://localhost:9091/healthz"]
|
95
|
+
interval: 30s
|
96
|
+
start_period: 90s
|
97
|
+
timeout: 20s
|
98
|
+
retries: 3
|
99
|
+
depends_on:
|
100
|
+
- "etcd"
|
101
|
+
- "minio"
|
102
|
+
|
103
|
+
networks:
|
104
|
+
milvus:
|
105
|
+
name: milvus
|
@@ -0,0 +1,122 @@
|
|
1
|
+
# Talk2Scholars
|
2
|
+
|
3
|
+
## Installation
|
4
|
+
|
5
|
+
- [nvidia-cuda-toolkit](https://developer.nvidia.com/cuda-toolkit)
|
6
|
+
- [nvidia-container-toolkit](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/1.17.8/install-guide.html) (required for GPU support with Docker; enables containers to access NVIDIA GPUs for accelerated computing). After installing `nvidia-container-toolkit`, please restart Docker to ensure GPU support is enabled.
|
7
|
+
|
8
|
+
### Docker (stable-release)
|
9
|
+
|
10
|
+
**Prerequisites**
|
11
|
+
|
12
|
+
- [Milvus](https://milvus.io) (for a vector database)
|
13
|
+
|
14
|
+
---
|
15
|
+
|
16
|
+
#### 1. Download files
|
17
|
+
|
18
|
+
Choose the appropriate version of the `docker-compose.yml` file based on your system:
|
19
|
+
|
20
|
+
**For GPU:**
|
21
|
+
|
22
|
+
```sh
|
23
|
+
wget https://raw.githubusercontent.com/VirtualPatientEngine/AIAgents4Pharma/main/aiagents4pharma/talk2scholars/docker-compose/gpu/docker-compose.yml \
|
24
|
+
https://raw.githubusercontent.com/VirtualPatientEngine/AIAgents4Pharma/main/aiagents4pharma/talk2scholars/docker-compose/gpu/.env.example
|
25
|
+
```
|
26
|
+
|
27
|
+
**For CPU:**
|
28
|
+
|
29
|
+
```sh
|
30
|
+
wget https://raw.githubusercontent.com/VirtualPatientEngine/AIAgents4Pharma/main/aiagents4pharma/talk2scholars/docker-compose/cpu/docker-compose.yml \
|
31
|
+
https://raw.githubusercontent.com/VirtualPatientEngine/AIAgents4Pharma/main/aiagents4pharma/talk2scholars/docker-compose/cpu/.env.example
|
32
|
+
```
|
33
|
+
|
34
|
+
#### 2. Setup environment variables
|
35
|
+
|
36
|
+
```sh
|
37
|
+
cp .env.example .env
|
38
|
+
```
|
39
|
+
|
40
|
+
Edit `.env` with your API keys:
|
41
|
+
|
42
|
+
```env
|
43
|
+
# .env.example (DO NOT put actual API keys here, read the README.md)
|
44
|
+
|
45
|
+
# OPENAI API KEY
|
46
|
+
OPENAI_API_KEY=your_openai_api_key_here
|
47
|
+
|
48
|
+
# LangSmith API KEY
|
49
|
+
LANGCHAIN_TRACING_V2=true
|
50
|
+
LANGCHAIN_API_KEY=your_langchain_api_key_heres
|
51
|
+
|
52
|
+
# NVIDIA API KEY
|
53
|
+
NVIDIA_API_KEY=your_nvidia_api_key_here
|
54
|
+
|
55
|
+
# ZOTERO API KEY
|
56
|
+
ZOTERO_API_KEY=your_zotero_api_key_here
|
57
|
+
ZOTERO_USER_ID=your_zotero_user_id_here
|
58
|
+
|
59
|
+
# Set environment variables for data loader
|
60
|
+
MILVUS_HOST=milvus-standalone
|
61
|
+
MILVUS_PORT=19530
|
62
|
+
MILVUS_DB_NAME=pdf_rag_db
|
63
|
+
MILVUS_COLLECTION_NAME=pdf_rag_documents
|
64
|
+
```
|
65
|
+
|
66
|
+
---
|
67
|
+
|
68
|
+
#### 3. Start the agent
|
69
|
+
|
70
|
+
```sh
|
71
|
+
docker compose up -d
|
72
|
+
```
|
73
|
+
|
74
|
+
---
|
75
|
+
|
76
|
+
### Access the Web UI
|
77
|
+
|
78
|
+
Once started, open:
|
79
|
+
|
80
|
+
```
|
81
|
+
http://localhost:8501
|
82
|
+
```
|
83
|
+
|
84
|
+
> In the background, the BioBridge multimodal embeddings will be inserted into the Milvus database, and the `talk2scholars` service will start. Once the data is fully inserted, the application will be in a healthy state and accessible at the above address.
|
85
|
+
>
|
86
|
+
> You can monitor the process using:
|
87
|
+
>
|
88
|
+
> ```sh
|
89
|
+
> docker logs -f talk2scholars
|
90
|
+
> ```
|
91
|
+
|
92
|
+
---
|
93
|
+
|
94
|
+
## Get Key
|
95
|
+
|
96
|
+
- `NVIDIA_API_KEY` – required (obtain a free key at [https://build.nvidia.com/explore/discover](https://build.nvidia.com/explore/discover))
|
97
|
+
- `ZOTERO_API_KEY` – required (generate at [https://www.zotero.org/user/login#applications](https://www.zotero.org/user/login#applications))
|
98
|
+
|
99
|
+
**LangSmith** support is optional. To enable it, create an API key [here](https://docs.smith.langchain.com/administration/how_to_guides/organization_management/create_account_api_key).
|
100
|
+
|
101
|
+
_Please note that this will create a new tracing project in your Langsmith
|
102
|
+
account with the name `T2X-xxxx`, where `X` can be `KG` (KnowledgeGraphs).
|
103
|
+
If you skip the previous step, it will default to the name `default`.
|
104
|
+
`xxxx` will be the 4-digit ID created for the session._
|
105
|
+
|
106
|
+
---
|
107
|
+
|
108
|
+
## Notes for Windows Users
|
109
|
+
|
110
|
+
If you are using Windows, it is recommended to install [**Git Bash**](https://git-scm.com/downloads) for a smoother experience when running the bash commands in this guide.
|
111
|
+
|
112
|
+
- For applications that use **Docker Compose**, Git Bash is **required**.
|
113
|
+
- For applications that use **docker run** manually, Git Bash is **optional**, but recommended for consistency.
|
114
|
+
|
115
|
+
You can download Git Bash here: [Git for Windows](https://git-scm.com/downloads).
|
116
|
+
|
117
|
+
When using Docker on Windows, make sure you **run Docker with administrative privileges** if you face permission issues.
|
118
|
+
|
119
|
+
To resolve permission issues, you can:
|
120
|
+
|
121
|
+
- Review the official Docker documentation on [Windows permission requirements](https://docs.docker.com/desktop/setup/install/windows-permission-requirements/).
|
122
|
+
- Alternatively, follow the community discussion and solutions on [Docker Community Forums](https://forums.docker.com/t/error-when-trying-to-run-windows-containers-docker-client-must-be-run-with-elevated-privileges/136619).
|
@@ -8,7 +8,7 @@ across agent interactions.
|
|
8
8
|
|
9
9
|
import logging
|
10
10
|
from collections.abc import Mapping
|
11
|
-
from typing import Annotated, Any
|
11
|
+
from typing import Annotated, Any
|
12
12
|
|
13
13
|
from langchain_core.embeddings import Embeddings
|
14
14
|
from langchain_core.language_models import BaseChatModel
|
@@ -19,7 +19,7 @@ logging.basicConfig(level=logging.INFO)
|
|
19
19
|
logger = logging.getLogger(__name__)
|
20
20
|
|
21
21
|
|
22
|
-
def merge_dict(existing:
|
22
|
+
def merge_dict(existing: dict[str, Any], new: dict[str, Any]) -> dict[str, Any]:
|
23
23
|
"""
|
24
24
|
Merges the existing dictionary with a new dictionary.
|
25
25
|
|
@@ -36,7 +36,7 @@ def merge_dict(existing: Dict[str, Any], new: Dict[str, Any]) -> Dict[str, Any]:
|
|
36
36
|
return merged
|
37
37
|
|
38
38
|
|
39
|
-
def replace_dict(existing:
|
39
|
+
def replace_dict(existing: dict[str, Any], new: Any) -> Any:
|
40
40
|
"""
|
41
41
|
Replaces the existing dictionary with a new dictionary.
|
42
42
|
|
@@ -87,12 +87,12 @@ class Talk2Scholars(AgentState):
|
|
87
87
|
# Agent state fields
|
88
88
|
# Key controlling UI display: always replace to reference latest output
|
89
89
|
# Stores the most recently displayed papers metadata
|
90
|
-
last_displayed_papers: Annotated[
|
90
|
+
last_displayed_papers: Annotated[dict[str, Any], replace_dict]
|
91
91
|
# Accumulative keys: merge new entries into existing state
|
92
|
-
papers: Annotated[
|
93
|
-
multi_papers: Annotated[
|
94
|
-
article_data: Annotated[
|
92
|
+
papers: Annotated[dict[str, Any], merge_dict]
|
93
|
+
multi_papers: Annotated[dict[str, Any], merge_dict]
|
94
|
+
article_data: Annotated[dict[str, Any], merge_dict]
|
95
95
|
# Approval status: always replace to reflect latest operation
|
96
|
-
zotero_write_approval_status: Annotated[
|
96
|
+
zotero_write_approval_status: Annotated[dict[str, Any], replace_dict]
|
97
97
|
llm_model: BaseChatModel
|
98
98
|
text_embedding_model: Embeddings
|
@@ -4,11 +4,15 @@ Tests the supervisor agent's routing logic and state management.
|
|
4
4
|
"""
|
5
5
|
|
6
6
|
from types import SimpleNamespace
|
7
|
-
|
7
|
+
|
8
8
|
import hydra
|
9
|
+
import pytest
|
9
10
|
from langchain_core.language_models.chat_models import BaseChatModel
|
11
|
+
from langchain_core.messages import AIMessage, HumanMessage
|
12
|
+
from langchain_core.outputs import ChatGeneration, ChatResult
|
10
13
|
from langchain_openai import ChatOpenAI
|
11
14
|
from pydantic import Field
|
15
|
+
|
12
16
|
from aiagents4pharma.talk2scholars.agents.main_agent import get_app
|
13
17
|
|
14
18
|
# --- Dummy LLM Implementation ---
|
@@ -19,16 +23,23 @@ class DummyLLM(BaseChatModel):
|
|
19
23
|
|
20
24
|
model_name: str = Field(...)
|
21
25
|
|
22
|
-
def _generate(self,
|
23
|
-
"""
|
24
|
-
DummyLLM.called_prompt =
|
25
|
-
|
26
|
+
def _generate(self, messages, stop=None, run_manager=None, **kwargs):
|
27
|
+
"""generate a dummy response based on the input messages."""
|
28
|
+
DummyLLM.called_prompt = messages[0].content
|
29
|
+
message = AIMessage(content="dummy output")
|
30
|
+
generation = ChatGeneration(message=message)
|
31
|
+
return ChatResult(generations=[generation])
|
26
32
|
|
27
33
|
@property
|
28
34
|
def _llm_type(self):
|
29
35
|
"""Return the type of the language model."""
|
30
36
|
return "dummy"
|
31
37
|
|
38
|
+
# NEW: public shim to avoid protected access in tests
|
39
|
+
def public_llm_type(self) -> str:
|
40
|
+
"""public method to access the LLM type."""
|
41
|
+
return self._llm_type
|
42
|
+
|
32
43
|
|
33
44
|
# --- Dummy Workflow and Sub-agent Functions ---
|
34
45
|
|
@@ -105,17 +116,12 @@ class DummyHydraContext:
|
|
105
116
|
def dict_to_namespace(d):
|
106
117
|
"""Convert a dictionary to a SimpleNamespace object."""
|
107
118
|
return SimpleNamespace(
|
108
|
-
**{
|
109
|
-
key: dict_to_namespace(val) if isinstance(val, dict) else val
|
110
|
-
for key, val in d.items()
|
111
|
-
}
|
119
|
+
**{key: dict_to_namespace(val) if isinstance(val, dict) else val for key, val in d.items()}
|
112
120
|
)
|
113
121
|
|
114
122
|
|
115
123
|
dummy_config = {
|
116
|
-
"agents": {
|
117
|
-
"talk2scholars": {"main_agent": {"system_prompt": "Dummy system prompt"}}
|
118
|
-
}
|
124
|
+
"agents": {"talk2scholars": {"main_agent": {"system_prompt": "Dummy system prompt"}}}
|
119
125
|
}
|
120
126
|
|
121
127
|
|
@@ -141,9 +147,7 @@ class DummyHydraCompose:
|
|
141
147
|
@pytest.fixture(autouse=True)
|
142
148
|
def patch_hydra(monkeypatch):
|
143
149
|
"""Patch the hydra.initialize and hydra.compose functions to return dummy objects."""
|
144
|
-
monkeypatch.setattr(
|
145
|
-
hydra, "initialize", lambda version_base, config_path: DummyHydraContext()
|
146
|
-
)
|
150
|
+
monkeypatch.setattr(hydra, "initialize", lambda version_base, config_path: DummyHydraContext())
|
147
151
|
monkeypatch.setattr(
|
148
152
|
hydra, "compose", lambda config_name, overrides: DummyHydraCompose(dummy_config)
|
149
153
|
)
|
@@ -153,9 +157,7 @@ def dummy_paper_download_agent(uniq_id, llm_model):
|
|
153
157
|
"""Return a DummyWorkflow for the paper download agent."""
|
154
158
|
dummy_paper_download_agent.called_uniq_id = uniq_id
|
155
159
|
dummy_paper_download_agent.called_llm_model = llm_model
|
156
|
-
return DummyWorkflow(
|
157
|
-
supervisor_args={"agent": "paper_download", "uniq_id": uniq_id}
|
158
|
-
)
|
160
|
+
return DummyWorkflow(supervisor_args={"agent": "paper_download", "uniq_id": uniq_id})
|
159
161
|
|
160
162
|
|
161
163
|
@pytest.fixture(autouse=True)
|
@@ -186,16 +188,30 @@ def patch_sub_agents_and_supervisor(monkeypatch):
|
|
186
188
|
|
187
189
|
|
188
190
|
def test_dummy_llm_generate():
|
189
|
-
"""Test the dummy LLM's generate function."""
|
191
|
+
"""Test the dummy LLM's generate function through public interface."""
|
190
192
|
dummy = DummyLLM(model_name="test-model")
|
191
|
-
|
192
|
-
assert
|
193
|
+
# Test that the dummy LLM can be used (testing the class works)
|
194
|
+
assert dummy.model_name == "test-model"
|
195
|
+
# Test through public interface that internally calls _generate (covers lines 26-27)
|
196
|
+
# Use invoke which internally calls _generate
|
197
|
+
messages = [HumanMessage(content="test prompt")]
|
198
|
+
result = dummy.invoke(messages)
|
199
|
+
# Verify the internal state was set
|
200
|
+
assert hasattr(DummyLLM, "called_prompt")
|
201
|
+
assert result is not None
|
202
|
+
assert DummyLLM.called_prompt == "test prompt"
|
193
203
|
|
194
204
|
|
195
205
|
def test_dummy_llm_llm_type():
|
196
|
-
"""Test the dummy LLM's
|
206
|
+
"""Test the dummy LLM's type identification."""
|
197
207
|
dummy = DummyLLM(model_name="test-model")
|
198
|
-
|
208
|
+
|
209
|
+
# Use public shim instead of protected attribute access
|
210
|
+
llm_type = dummy.public_llm_type()
|
211
|
+
assert llm_type == "dummy"
|
212
|
+
|
213
|
+
# Also test the public string representation
|
214
|
+
assert "DummyLLM" in str(dummy.__class__.__name__)
|
199
215
|
|
200
216
|
|
201
217
|
def test_get_app_with_gpt4o_mini():
|
@@ -225,12 +241,14 @@ def test_get_app_with_other_model():
|
|
225
241
|
assert supervisor_args.get("prompt") == "Dummy system prompt"
|
226
242
|
assert getattr(app, "name", "") == "Talk2Scholars_MainAgent"
|
227
243
|
|
244
|
+
|
228
245
|
def test_dummy_workflow_get_supervisor_args():
|
229
246
|
"""Test that DummyWorkflow.get_supervisor_args returns the stored args."""
|
230
247
|
dummy_args = {"agent": "test", "uniq_id": "id123"}
|
231
248
|
wf = DummyWorkflow(supervisor_args=dummy_args)
|
232
249
|
assert wf.get_supervisor_args() is dummy_args
|
233
250
|
|
251
|
+
|
234
252
|
def test_dummy_hydra_compose_get_config():
|
235
253
|
"""Test that DummyHydraCompose.get_config returns the raw config."""
|
236
254
|
config_dict = {"agents": {"test": {"key": "value"}}}
|
@@ -1,9 +1,11 @@
|
|
1
1
|
"""Unit tests for the paper download agent in Talk2Scholars."""
|
2
2
|
|
3
3
|
from unittest import mock
|
4
|
+
|
4
5
|
import pytest
|
5
|
-
from langchain_core.messages import HumanMessage, AIMessage
|
6
6
|
from langchain_core.language_models.chat_models import BaseChatModel
|
7
|
+
from langchain_core.messages import AIMessage, HumanMessage
|
8
|
+
|
7
9
|
from ..agents.paper_download_agent import get_app
|
8
10
|
from ..state.state_talk2scholars import Talk2Scholars
|
9
11
|
|
@@ -13,9 +15,7 @@ def mock_hydra_fixture():
|
|
13
15
|
"""Mocks Hydra configuration for tests."""
|
14
16
|
with mock.patch("hydra.initialize"), mock.patch("hydra.compose") as mock_compose:
|
15
17
|
cfg_mock = mock.MagicMock()
|
16
|
-
cfg_mock.agents.talk2scholars.paper_download_agent.paper_download_agent =
|
17
|
-
"Test prompt"
|
18
|
-
)
|
18
|
+
cfg_mock.agents.talk2scholars.paper_download_agent.paper_download_agent = "Test prompt"
|
19
19
|
mock_compose.return_value = cfg_mock
|
20
20
|
yield mock_compose
|
21
21
|
|
@@ -26,9 +26,7 @@ def mock_tools_fixture():
|
|
26
26
|
with mock.patch(
|
27
27
|
"aiagents4pharma.talk2scholars.tools.paper_download.paper_downloader.download_papers"
|
28
28
|
) as mock_download_papers:
|
29
|
-
mock_download_papers.return_value = {
|
30
|
-
"article_data": {"dummy_key": "dummy_value"}
|
31
|
-
}
|
29
|
+
mock_download_papers.return_value = {"article_data": {"dummy_key": "dummy_value"}}
|
32
30
|
yield [mock_download_papers]
|
33
31
|
|
34
32
|
|
@@ -52,9 +50,7 @@ def test_paper_download_agent_invocation():
|
|
52
50
|
"""Verifies agent processes queries and updates state correctly."""
|
53
51
|
_ = mock_tools_fixture # Prevents unused-argument warning
|
54
52
|
thread_id = "test_thread_paper_dl"
|
55
|
-
mock_state = Talk2Scholars(
|
56
|
-
messages=[HumanMessage(content="Download paper 1234.5678")]
|
57
|
-
)
|
53
|
+
mock_state = Talk2Scholars(messages=[HumanMessage(content="Download paper 1234.5678")])
|
58
54
|
llm_mock = mock.Mock(spec=BaseChatModel)
|
59
55
|
|
60
56
|
with mock.patch(
|
@@ -108,9 +104,7 @@ def test_paper_download_agent_tools_assignment(
|
|
108
104
|
# Verify ToolNode was called with download_papers function
|
109
105
|
assert mock_toolnode.called
|
110
106
|
# Check that ToolNode was called with a list containing the download_papers tool
|
111
|
-
call_args = mock_toolnode.call_args[0][
|
112
|
-
0
|
113
|
-
] # Get first positional argument (the tools list)
|
107
|
+
call_args = mock_toolnode.call_args[0][0] # Get first positional argument (the tools list)
|
114
108
|
assert len(call_args) == 1
|
115
109
|
# The tool should be a StructuredTool with name 'download_papers'
|
116
110
|
tool = call_args[0]
|
@@ -140,6 +134,6 @@ def test_paper_download_agent_model_failure():
|
|
140
134
|
):
|
141
135
|
with pytest.raises(Exception) as exc_info:
|
142
136
|
get_app(thread_id, llm_mock)
|
143
|
-
assert "Mock model failure" in str(
|
144
|
-
|
145
|
-
)
|
137
|
+
assert "Mock model failure" in str(exc_info.value), (
|
138
|
+
"Model initialization failure should raise an exception."
|
139
|
+
)
|
@@ -3,8 +3,10 @@ Unit Tests for the PDF agent.
|
|
3
3
|
"""
|
4
4
|
|
5
5
|
from unittest import mock
|
6
|
+
|
6
7
|
import pytest
|
7
|
-
from langchain_core.messages import
|
8
|
+
from langchain_core.messages import AIMessage, HumanMessage
|
9
|
+
|
8
10
|
from ..agents.pdf_agent import get_app
|
9
11
|
from ..state.state_talk2scholars import Talk2Scholars
|
10
12
|
|
@@ -29,9 +31,7 @@ def mock_tools_fixture():
|
|
29
31
|
"aiagents4pharma.talk2scholars.agents.pdf_agent.question_and_answer"
|
30
32
|
) as mock_question_and_answer,
|
31
33
|
):
|
32
|
-
mock_question_and_answer.return_value = {
|
33
|
-
"result": "Mock Question and Answer Result"
|
34
|
-
}
|
34
|
+
mock_question_and_answer.return_value = {"result": "Mock Question and Answer Result"}
|
35
35
|
yield [mock_question_and_answer]
|
36
36
|
|
37
37
|
|
@@ -58,9 +58,7 @@ def test_pdf_agent_invocation(mock_llm):
|
|
58
58
|
"""Test that the PDF agent processes user input and returns a valid response."""
|
59
59
|
thread_id = "test_thread"
|
60
60
|
# Create a sample state with a human message.
|
61
|
-
mock_state = Talk2Scholars(
|
62
|
-
messages=[HumanMessage(content="Extract key data from PDF")]
|
63
|
-
)
|
61
|
+
mock_state = Talk2Scholars(messages=[HumanMessage(content="Extract key data from PDF")])
|
64
62
|
with mock.patch(
|
65
63
|
"aiagents4pharma.talk2scholars.agents.pdf_agent.create_react_agent"
|
66
64
|
) as mock_create:
|
@@ -95,9 +93,7 @@ def test_pdf_agent_tools_assignment(request, mock_llm):
|
|
95
93
|
mock.patch(
|
96
94
|
"aiagents4pharma.talk2scholars.agents.pdf_agent.create_react_agent"
|
97
95
|
) as mock_create,
|
98
|
-
mock.patch(
|
99
|
-
"aiagents4pharma.talk2scholars.agents.pdf_agent.ToolNode"
|
100
|
-
) as mock_toolnode,
|
96
|
+
mock.patch("aiagents4pharma.talk2scholars.agents.pdf_agent.ToolNode") as mock_toolnode,
|
101
97
|
):
|
102
98
|
mock_agent = mock.Mock()
|
103
99
|
mock_create.return_value = mock_agent
|