aiagents4pharma 1.44.0__py3-none-any.whl → 1.45.1__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/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 +334 -216
- 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 +160 -97
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_kg_utils.py +3 -4
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_pubchem_utils.py +87 -13
- aiagents4pharma/talk2knowledgegraphs/tools/__init__.py +10 -7
- aiagents4pharma/talk2knowledgegraphs/tools/graphrag_reasoning.py +15 -20
- aiagents4pharma/talk2knowledgegraphs/tools/milvus_multimodal_subgraph_extraction.py +145 -142
- 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 +14 -34
- 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.44.0.dist-info → aiagents4pharma-1.45.1.dist-info}/METADATA +115 -51
- aiagents4pharma-1.45.1.dist-info/RECORD +324 -0
- {aiagents4pharma-1.44.0.dist-info → aiagents4pharma-1.45.1.dist-info}/WHEEL +1 -2
- aiagents4pharma-1.44.0.dist-info/RECORD +0 -293
- aiagents4pharma-1.44.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.44.0.dist-info → aiagents4pharma-1.45.1.dist-info}/licenses/LICENSE +0 -0
@@ -5,22 +5,23 @@ Agent for interacting with Zotero with human-in-the-loop features
|
|
5
5
|
"""
|
6
6
|
|
7
7
|
import logging
|
8
|
-
from typing import Any
|
9
|
-
import hydra
|
8
|
+
from typing import Any
|
10
9
|
|
10
|
+
import hydra
|
11
11
|
from langchain_core.language_models.chat_models import BaseChatModel
|
12
|
-
from langgraph.graph import START, StateGraph
|
13
|
-
from langgraph.prebuilt import create_react_agent, ToolNode
|
14
12
|
from langgraph.checkpoint.memory import MemorySaver
|
13
|
+
from langgraph.graph import START, StateGraph
|
14
|
+
from langgraph.prebuilt import ToolNode, create_react_agent
|
15
|
+
|
15
16
|
from ..state.state_talk2scholars import Talk2Scholars
|
16
|
-
from ..tools.zotero.zotero_read import zotero_read
|
17
|
-
from ..tools.zotero.zotero_review import zotero_review
|
18
|
-
from ..tools.zotero.zotero_write import zotero_write
|
19
17
|
from ..tools.s2.display_dataframe import display_dataframe
|
20
18
|
from ..tools.s2.query_dataframe import query_dataframe
|
21
19
|
from ..tools.s2.retrieve_semantic_scholar_paper_id import (
|
22
20
|
retrieve_semantic_scholar_paper_id,
|
23
21
|
)
|
22
|
+
from ..tools.zotero.zotero_read import zotero_read
|
23
|
+
from ..tools.zotero.zotero_review import zotero_review
|
24
|
+
from ..tools.zotero.zotero_write import zotero_write
|
24
25
|
|
25
26
|
# Initialize logger
|
26
27
|
logging.basicConfig(level=logging.INFO)
|
@@ -49,7 +50,7 @@ def get_app(uniq_id, llm_model: BaseChatModel):
|
|
49
50
|
>>> result = app.invoke(initial_state)
|
50
51
|
"""
|
51
52
|
|
52
|
-
def zotero_agent_node(state: Talk2Scholars) ->
|
53
|
+
def zotero_agent_node(state: Talk2Scholars) -> dict[str, Any]:
|
53
54
|
"""
|
54
55
|
Processes the user query and retrieves relevant research papers from Zotero.
|
55
56
|
|
@@ -68,9 +69,7 @@ def get_app(uniq_id, llm_model: BaseChatModel):
|
|
68
69
|
>>> result = zotero_agent_node(current_state)
|
69
70
|
>>> papers = result.get("papers", [])
|
70
71
|
"""
|
71
|
-
logger.log(
|
72
|
-
logging.INFO, "Creating Agent_Zotero node with thread_id %s", uniq_id
|
73
|
-
)
|
72
|
+
logger.log(logging.INFO, "Creating Agent_Zotero node with thread_id %s", uniq_id)
|
74
73
|
result = model.invoke(state, {"configurable": {"thread_id": uniq_id}})
|
75
74
|
|
76
75
|
return result
|
@@ -2,9 +2,6 @@
|
|
2
2
|
Import all the modules in the package
|
3
3
|
"""
|
4
4
|
|
5
|
-
from . import s2_agent
|
6
|
-
from . import main_agent
|
7
|
-
from . import pdf_agent
|
8
|
-
from . import zotero_agent
|
5
|
+
from . import main_agent, pdf_agent, s2_agent, zotero_agent
|
9
6
|
|
10
7
|
__all__ = ["s2_agent", "main_agent", "pdf_agent", "zotero_agent"]
|
@@ -26,7 +26,7 @@ system_prompt: |
|
|
26
26
|
|
27
27
|
**IMPORTANT – Q&A Disambiguation (Pause Before Acting):**
|
28
28
|
- When the user asks a question like “Tell me more about X”, “What does the first article say?”, or similar:
|
29
|
-
1) **Pause and ask**:
|
29
|
+
1) **Pause and ask**:
|
30
30
|
“Do you want me to answer using the **PDF content** (full text), or using the **last displayed table** (metadata only)?”
|
31
31
|
- Accept synonyms: *PDF, full text, paper text* → **PDF content**.
|
32
32
|
- Accept synonyms: *last displayed table, table above, results table, search results* → **metadata/table**.
|
@@ -2,7 +2,7 @@ _target_: agents.pdf_agent.get_app
|
|
2
2
|
pdf_agent: |
|
3
3
|
You are the **PDF Agent**.
|
4
4
|
|
5
|
-
**Primary Role:**
|
5
|
+
**Primary Role:**
|
6
6
|
Perform question-and-answer tasks on the **full text** of papers, articles, or PDFs that are already available
|
7
7
|
(downloaded locally, uploaded by the user, or stored in the user's Zotero library).
|
8
8
|
|
@@ -2,12 +2,12 @@ _target_: agents.s2_agent.get_app
|
|
2
2
|
s2_agent: |
|
3
3
|
You are the **S2 Agent**.
|
4
4
|
|
5
|
-
**Primary Role:**
|
6
|
-
- Search for academic papers.
|
7
|
-
- Provide recommendations **only when explicitly requested** by the user.
|
5
|
+
**Primary Role:**
|
6
|
+
- Search for academic papers.
|
7
|
+
- Provide recommendations **only when explicitly requested** by the user.
|
8
8
|
- Display results using the `display_dataframe` tool.
|
9
9
|
|
10
|
-
**Additional Capability – Metadata Queries:**
|
10
|
+
**Additional Capability – Metadata Queries:**
|
11
11
|
- You can query the last displayed results table using the `query_dataframe` tool to filter, sort, or extract metadata (including paper IDs).
|
12
12
|
- Use this tool only for **metadata-level** questions (not full PDF content).
|
13
13
|
|
@@ -22,10 +22,10 @@ s2_agent: |
|
|
22
22
|
END
|
23
23
|
---
|
24
24
|
3) Do **not** call any other S2 tools (e.g., `retrieve_semantic_scholar_paper_id`, `get_single_paper_recommendations`, `get_multi_paper_recommendations`) in this mode.
|
25
|
-
4) If no last displayed table exists, reply:
|
26
|
-
`IDS: NONE`
|
27
|
-
`SOURCE: none (no results table available)`
|
28
|
-
`END`
|
25
|
+
4) If no last displayed table exists, reply:
|
26
|
+
`IDS: NONE`
|
27
|
+
`SOURCE: none (no results table available)`
|
28
|
+
`END`
|
29
29
|
and stop.
|
30
30
|
|
31
31
|
**Tool-Selection Policy (default mode):**
|
@@ -2,18 +2,18 @@ _target_: agents.zotero_agent.get_app
|
|
2
2
|
zotero_agent: |
|
3
3
|
You are the **Zotero Agent**.
|
4
4
|
|
5
|
-
**Primary Role:**
|
6
|
-
- Read from the user's Zotero library (list items, retrieve metadata, check existing entries).
|
7
|
-
- Write to the user's Zotero library (save new papers, update existing records) — only with explicit user approval.
|
5
|
+
**Primary Role:**
|
6
|
+
- Read from the user's Zotero library (list items, retrieve metadata, check existing entries).
|
7
|
+
- Write to the user's Zotero library (save new papers, update existing records) — only with explicit user approval.
|
8
8
|
- Display Zotero query results using "display_dataframe" tool.
|
9
9
|
|
10
|
-
**Rules & Boundaries:**
|
10
|
+
**Rules & Boundaries:**
|
11
11
|
- Never save papers to Zotero without **explicit human approval**. If approval is denied, do not retry unless the user changes their decision.
|
12
12
|
- Do not search for papers on the web — that is the `s2_agent`’s role.
|
13
13
|
- Do not perform PDF content analysis — that is the `pdf_agent`’s role.
|
14
14
|
- Do not download PDFs directly — that is the `paper_download_agent`’s role.
|
15
15
|
|
16
|
-
**Examples:**
|
17
|
-
- “Show me all papers I saved last month.”
|
18
|
-
- “Check if I already have this paper in Zotero.”
|
16
|
+
**Examples:**
|
17
|
+
- “Show me all papers I saved last month.”
|
18
|
+
- “Check if I already have this paper in Zotero.”
|
19
19
|
- “Save this paper to Zotero” → Ask for explicit approval before saving.
|
@@ -2,12 +2,14 @@
|
|
2
2
|
Import all the modules in the package
|
3
3
|
"""
|
4
4
|
|
5
|
-
from . import
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
5
|
+
from . import (
|
6
|
+
multi_paper_recommendation,
|
7
|
+
question_and_answer,
|
8
|
+
search,
|
9
|
+
single_paper_recommendation,
|
10
|
+
zotero_read,
|
11
|
+
zotero_write,
|
12
|
+
)
|
11
13
|
|
12
14
|
__all__ = [
|
13
15
|
"search",
|
@@ -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,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
|