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
@@ -3,10 +3,12 @@ This is the state file for the Talk2AIAgents4Pharma agent.
|
|
3
3
|
"""
|
4
4
|
|
5
5
|
from ...talk2biomodels.states.state_talk2biomodels import Talk2Biomodels
|
6
|
-
from ...talk2knowledgegraphs.states.state_talk2knowledgegraphs import
|
6
|
+
from ...talk2knowledgegraphs.states.state_talk2knowledgegraphs import (
|
7
|
+
Talk2KnowledgeGraphs,
|
8
|
+
)
|
7
9
|
|
8
|
-
|
9
|
-
|
10
|
+
|
11
|
+
class Talk2AIAgents4Pharma(Talk2Biomodels, Talk2KnowledgeGraphs):
|
10
12
|
"""
|
11
13
|
The state for the Talk2AIAgents4Pharma agent.
|
12
14
|
|
@@ -1,3 +1,3 @@
|
|
1
|
-
|
1
|
+
"""
|
2
2
|
This module contains the test cases.
|
3
|
-
|
3
|
+
"""
|
@@ -1,17 +1,21 @@
|
|
1
|
-
|
1
|
+
"""
|
2
2
|
Test Talk2AIAgents4Pharma supervisor agent.
|
3
|
-
|
4
|
-
|
3
|
+
"""
|
4
|
+
|
5
|
+
from unittest.mock import MagicMock, patch
|
6
|
+
|
7
|
+
import pandas as pd
|
5
8
|
import pytest
|
6
9
|
from langchain_core.messages import HumanMessage
|
7
10
|
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
|
8
|
-
|
11
|
+
|
9
12
|
from ..agents.main_agent import get_app
|
10
13
|
|
11
14
|
# Define the data path for the test files of Talk2KnowledgeGraphs agent
|
12
15
|
DATA_PATH = "aiagents4pharma/talk2knowledgegraphs/tests/files"
|
13
16
|
LLM_MODEL = ChatOpenAI(model="gpt-4o-mini", temperature=0.0)
|
14
17
|
|
18
|
+
|
15
19
|
@pytest.fixture(name="input_dict")
|
16
20
|
def input_dict_fixture():
|
17
21
|
"""
|
@@ -27,7 +31,7 @@ def input_dict_fixture():
|
|
27
31
|
"cellular_component": [],
|
28
32
|
"biological_process": [],
|
29
33
|
"drug": [],
|
30
|
-
"disease": []
|
34
|
+
"disease": [],
|
31
35
|
},
|
32
36
|
"uploaded_files": [],
|
33
37
|
"dic_source_graph": [
|
@@ -37,43 +41,54 @@ def input_dict_fixture():
|
|
37
41
|
"kg_text_path": f"{DATA_PATH}/biobridge_multimodal_text_graph.pkl",
|
38
42
|
}
|
39
43
|
],
|
40
|
-
"dic_extracted_graph": []
|
44
|
+
"dic_extracted_graph": [],
|
41
45
|
}
|
42
46
|
|
43
47
|
return input_dict
|
44
48
|
|
49
|
+
|
45
50
|
def mock_milvus_collection(name):
|
46
51
|
"""
|
47
52
|
Mock Milvus collection for testing.
|
48
53
|
"""
|
49
54
|
nodes = MagicMock()
|
50
55
|
nodes.query.return_value = [
|
51
|
-
{
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
56
|
+
{
|
57
|
+
"node_index": 0,
|
58
|
+
"node_id": "id1",
|
59
|
+
"node_name": "Adalimumab",
|
60
|
+
"node_type": "drug",
|
61
|
+
"feat": "featA",
|
62
|
+
"feat_emb": [0.1, 0.2, 0.3],
|
63
|
+
"desc": "descA",
|
64
|
+
"desc_emb": [0.1, 0.2, 0.3],
|
65
|
+
},
|
66
|
+
{
|
67
|
+
"node_index": 1,
|
68
|
+
"node_id": "id2",
|
69
|
+
"node_name": "TNF",
|
70
|
+
"node_type": "gene/protein",
|
71
|
+
"feat": "featB",
|
72
|
+
"feat_emb": [0.4, 0.5, 0.6],
|
73
|
+
"desc": "descB",
|
74
|
+
"desc_emb": [0.4, 0.5, 0.6],
|
75
|
+
},
|
63
76
|
]
|
64
77
|
nodes.load.return_value = None
|
65
78
|
|
66
79
|
edges = MagicMock()
|
67
80
|
edges.query.return_value = [
|
68
|
-
{
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
81
|
+
{
|
82
|
+
"triplet_index": 0,
|
83
|
+
"head_id": "id1",
|
84
|
+
"head_index": 0,
|
85
|
+
"tail_id": "id2",
|
86
|
+
"tail_index": 1,
|
87
|
+
"edge_type": "drug,acts_on,gene/protein",
|
88
|
+
"display_relation": "acts_on",
|
89
|
+
"feat": "featC",
|
90
|
+
"feat_emb": [0.7, 0.8, 0.9],
|
91
|
+
}
|
77
92
|
]
|
78
93
|
edges.load.return_value = None
|
79
94
|
|
@@ -83,6 +98,7 @@ def mock_milvus_collection(name):
|
|
83
98
|
return edges
|
84
99
|
return None
|
85
100
|
|
101
|
+
|
86
102
|
def test_main_agent_invokes_t2kg(input_dict):
|
87
103
|
"""
|
88
104
|
In the following test, we will ask the main agent (supervisor)
|
@@ -109,21 +125,31 @@ def test_main_agent_invokes_t2kg(input_dict):
|
|
109
125
|
)
|
110
126
|
prompt = "List drugs that target the gene Interleukin-6"
|
111
127
|
|
112
|
-
with
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
128
|
+
with (
|
129
|
+
patch(
|
130
|
+
"aiagents4pharma.talk2knowledgegraphs.tools."
|
131
|
+
"milvus_multimodal_subgraph_extraction.Collection",
|
132
|
+
side_effect=mock_milvus_collection,
|
133
|
+
),
|
134
|
+
patch(
|
135
|
+
"aiagents4pharma.talk2knowledgegraphs.tools."
|
136
|
+
"milvus_multimodal_subgraph_extraction.MultimodalPCSTPruning"
|
137
|
+
) as mock_pcst,
|
138
|
+
patch("pymilvus.connections") as mock_connections,
|
139
|
+
patch(
|
140
|
+
"aiagents4pharma.talk2knowledgegraphs.tools."
|
141
|
+
"milvus_multimodal_subgraph_extraction.hydra.initialize"
|
142
|
+
),
|
143
|
+
patch(
|
144
|
+
"aiagents4pharma.talk2knowledgegraphs.tools."
|
145
|
+
"milvus_multimodal_subgraph_extraction.hydra.compose"
|
146
|
+
) as mock_compose,
|
147
|
+
):
|
122
148
|
mock_connections.has_connection.return_value = True
|
123
149
|
mock_pcst_instance = MagicMock()
|
124
150
|
mock_pcst_instance.extract_subgraph.return_value = {
|
125
151
|
"nodes": pd.Series([0, 1]),
|
126
|
-
"edges": pd.Series([0])
|
152
|
+
"edges": pd.Series([0]),
|
127
153
|
}
|
128
154
|
mock_pcst.return_value = mock_pcst_instance
|
129
155
|
mock_cfg = MagicMock()
|
@@ -137,14 +163,12 @@ def test_main_agent_invokes_t2kg(input_dict):
|
|
137
163
|
mock_cfg.node_colors_dict = {"drug": "blue", "gene/protein": "red"}
|
138
164
|
mock_compose.return_value = MagicMock()
|
139
165
|
mock_compose.return_value.tools.multimodal_subgraph_extraction = mock_cfg
|
140
|
-
mock_compose.return_value.tools.subgraph_summarization
|
141
|
-
prompt_subgraph_summarization = (
|
166
|
+
mock_compose.return_value.tools.subgraph_summarization.prompt_subgraph_summarization = (
|
142
167
|
"Summarize the following subgraph: {textualized_subgraph}"
|
143
168
|
)
|
144
169
|
|
145
170
|
# Invoke the agent
|
146
|
-
response = app.invoke({"messages": [HumanMessage(content=prompt)]},
|
147
|
-
config=config)
|
171
|
+
response = app.invoke({"messages": [HumanMessage(content=prompt)]}, config=config)
|
148
172
|
|
149
173
|
# Check assistant message
|
150
174
|
assistant_msg = response["messages"][-1].content
|
@@ -168,23 +192,21 @@ def test_main_agent_invokes_t2kg(input_dict):
|
|
168
192
|
result = mock_milvus_collection("unknown")
|
169
193
|
assert result is None
|
170
194
|
|
195
|
+
|
171
196
|
def test_main_agent_invokes_t2b():
|
172
|
-
|
197
|
+
"""
|
173
198
|
In the following test, we will ask the main agent (supervisor)
|
174
199
|
to simulate a model. And we will check if the Talk2BioModels
|
175
200
|
agent is invoked. We will do so by checking the state of the
|
176
201
|
Talk2AIAgents4Pharma agent, which is partly inherited from the
|
177
202
|
Talk2BioModels agent.
|
178
|
-
|
203
|
+
"""
|
179
204
|
unique_id = 123
|
180
205
|
app = get_app(unique_id, llm_model=LLM_MODEL)
|
181
206
|
config = {"configurable": {"thread_id": unique_id}}
|
182
207
|
prompt = "Simulate model 64"
|
183
208
|
# Invoke the agent
|
184
|
-
app.invoke(
|
185
|
-
{"messages": [HumanMessage(content=prompt)]},
|
186
|
-
config=config
|
187
|
-
)
|
209
|
+
app.invoke({"messages": [HumanMessage(content=prompt)]}, config=config)
|
188
210
|
# Get the state of the Talk2AIAgents4Pharma agent
|
189
211
|
current_state = app.get_state(config)
|
190
212
|
# Check if the dic_simulated_data is in the state
|
@@ -194,7 +216,7 @@ def test_main_agent_invokes_t2b():
|
|
194
216
|
# Check if the length of the dic_simulated_data is 1
|
195
217
|
assert len(dic_simulated_data) == 1
|
196
218
|
# Check if the source of the model is 64
|
197
|
-
assert dic_simulated_data[0][
|
219
|
+
assert dic_simulated_data[0]["source"] == 64
|
198
220
|
# Check if the data of the model contains
|
199
221
|
# '1,3-bisphosphoglycerate'
|
200
|
-
assert
|
222
|
+
assert "1,3-bisphosphoglycerate" in dic_simulated_data[0]["data"]
|
@@ -0,0 +1,104 @@
|
|
1
|
+
# syntax=docker/dockerfile:1
|
2
|
+
|
3
|
+
# Dockerfile for the talk2biomodels application
|
4
|
+
# Multi-stage build for optimized image size with UV package manager
|
5
|
+
|
6
|
+
ARG BASE_IMAGE=ubuntu:24.04
|
7
|
+
ARG PYTHON_VERSION=3.12
|
8
|
+
|
9
|
+
FROM ${BASE_IMAGE} AS dev-base
|
10
|
+
RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
|
11
|
+
build-essential \
|
12
|
+
ca-certificates \
|
13
|
+
cmake \
|
14
|
+
curl \
|
15
|
+
g++ \
|
16
|
+
libopenblas-dev \
|
17
|
+
libomp-dev \
|
18
|
+
ninja-build \
|
19
|
+
wget \
|
20
|
+
&& rm -rf /var/lib/apt/lists/*
|
21
|
+
|
22
|
+
FROM dev-base AS python-install
|
23
|
+
ARG PYTHON_VERSION=3.12
|
24
|
+
|
25
|
+
# Install Python (available in Ubuntu 24.04 default repos)
|
26
|
+
RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
|
27
|
+
python${PYTHON_VERSION} \
|
28
|
+
python${PYTHON_VERSION}-dev \
|
29
|
+
python${PYTHON_VERSION}-venv \
|
30
|
+
python3-pip \
|
31
|
+
&& rm -rf /var/lib/apt/lists/* \
|
32
|
+
&& update-alternatives --install /usr/bin/python3 python3 /usr/bin/python${PYTHON_VERSION} 1 \
|
33
|
+
&& update-alternatives --install /usr/bin/python python /usr/bin/python${PYTHON_VERSION} 1
|
34
|
+
|
35
|
+
FROM python-install AS uv-install
|
36
|
+
WORKDIR /app
|
37
|
+
|
38
|
+
# Install UV package manager and dependencies
|
39
|
+
COPY pyproject.toml uv.lock* ./
|
40
|
+
RUN curl -LsSf https://astral.sh/uv/install.sh | sh && \
|
41
|
+
export PATH="/root/.local/bin:$PATH" && \
|
42
|
+
export UV_PROJECT_ENVIRONMENT="/opt/venv" && \
|
43
|
+
uv sync --frozen --extra dev --no-install-project --python python${PYTHON_VERSION} && \
|
44
|
+
. /opt/venv/bin/activate && \
|
45
|
+
# RAPIDS packages (commented out - will be added in future if needed)
|
46
|
+
# uv pip install \
|
47
|
+
# --extra-index-url=https://pypi.nvidia.com \
|
48
|
+
# --index-strategy unsafe-best-match \
|
49
|
+
# cudf-cu12 dask-cudf-cu12 && \
|
50
|
+
uv cache clean
|
51
|
+
|
52
|
+
FROM ${BASE_IMAGE} AS runtime
|
53
|
+
ARG PYTHON_VERSION=3.12
|
54
|
+
LABEL maintainer="talk2biomodels"
|
55
|
+
LABEL version="1.0.0"
|
56
|
+
LABEL description="AI Agents for Pharma - Biomodels Application"
|
57
|
+
|
58
|
+
# Install runtime dependencies
|
59
|
+
RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
|
60
|
+
ca-certificates \
|
61
|
+
curl \
|
62
|
+
libmagic1 \
|
63
|
+
libopenblas0 \
|
64
|
+
libomp5 \
|
65
|
+
python${PYTHON_VERSION} \
|
66
|
+
&& rm -rf /var/lib/apt/lists/* \
|
67
|
+
&& update-alternatives --install /usr/bin/python3 python3 /usr/bin/python${PYTHON_VERSION} 1 \
|
68
|
+
&& update-alternatives --install /usr/bin/python python /usr/bin/python${PYTHON_VERSION} 1
|
69
|
+
|
70
|
+
# Copy UV virtual environment from build stage
|
71
|
+
COPY --from=uv-install /opt/venv /opt/venv
|
72
|
+
|
73
|
+
# Set environment variables
|
74
|
+
ENV PATH="/opt/venv/bin:$PATH"
|
75
|
+
ENV PYTHONPATH="/app"
|
76
|
+
ENV PYTHONUNBUFFERED=1
|
77
|
+
ENV PYTHONDONTWRITEBYTECODE=1
|
78
|
+
ENV STREAMLIT_SERVER_HEADLESS=true
|
79
|
+
ENV STREAMLIT_SERVER_ENABLE_CORS=false
|
80
|
+
|
81
|
+
# Set working directory and create necessary directories
|
82
|
+
WORKDIR /app
|
83
|
+
|
84
|
+
# Copy application code
|
85
|
+
COPY aiagents4pharma/talk2biomodels /app/aiagents4pharma/talk2biomodels
|
86
|
+
COPY docs /app/docs
|
87
|
+
COPY app /app/app
|
88
|
+
|
89
|
+
# Copy and set up the entrypoint script (commented out - will be added in future if needed)
|
90
|
+
# COPY aiagents4pharma/talk2knowledgegraphs/entrypoint.sh /usr/local/bin/entrypoint.sh
|
91
|
+
# RUN chmod +x /usr/local/bin/entrypoint.sh
|
92
|
+
|
93
|
+
# Health check for production monitoring
|
94
|
+
HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
|
95
|
+
CMD curl -f http://localhost:8501/health || exit 1
|
96
|
+
|
97
|
+
# Expose the default Streamlit port
|
98
|
+
EXPOSE 8501
|
99
|
+
|
100
|
+
# Set the entrypoint (commented out - will be added in future if needed)
|
101
|
+
# ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
|
102
|
+
|
103
|
+
# Default command (can be overridden)
|
104
|
+
CMD ["streamlit", "run", "/app/app/frontend/streamlit_app_talk2biomodels.py", "--server.port=8501", "--server.address=0.0.0.0"]
|
@@ -0,0 +1 @@
|
|
1
|
+
Please check out the README file in the root folder for more information.
|
@@ -1,9 +1,5 @@
|
|
1
|
-
|
1
|
+
"""
|
2
2
|
This file is used to import the models and tools.
|
3
|
-
|
4
|
-
|
5
|
-
from . import tools
|
6
|
-
from . import agents
|
7
|
-
from . import states
|
8
|
-
from . import api
|
9
|
-
from . import configs
|
3
|
+
"""
|
4
|
+
|
5
|
+
from . import agents, api, configs, models, states, tools
|
@@ -1,73 +1,77 @@
|
|
1
|
-
|
1
|
+
# /usr/bin/env python3
|
2
2
|
|
3
|
-
|
3
|
+
"""
|
4
4
|
This is the agent file for the Talk2BioModels agent.
|
5
|
-
|
5
|
+
"""
|
6
6
|
|
7
7
|
import logging
|
8
8
|
from typing import Annotated
|
9
|
+
|
9
10
|
import hydra
|
10
11
|
from langchain_core.language_models.chat_models import BaseChatModel
|
11
12
|
from langgraph.checkpoint.memory import MemorySaver
|
12
13
|
from langgraph.graph import START, StateGraph
|
13
|
-
from langgraph.prebuilt import
|
14
|
-
|
15
|
-
from ..
|
16
|
-
from ..tools.
|
14
|
+
from langgraph.prebuilt import InjectedState, ToolNode, create_react_agent
|
15
|
+
|
16
|
+
from ..states.state_talk2biomodels import Talk2Biomodels
|
17
|
+
from ..tools.ask_question import AskQuestionTool
|
17
18
|
from ..tools.custom_plotter import CustomPlotterTool
|
18
19
|
from ..tools.get_annotation import GetAnnotationTool
|
19
|
-
from ..tools.
|
20
|
+
from ..tools.get_modelinfo import GetModelInfoTool
|
20
21
|
from ..tools.parameter_scan import ParameterScanTool
|
21
|
-
from ..tools.steady_state import SteadyStateTool
|
22
22
|
from ..tools.query_article import QueryArticle
|
23
|
-
from ..
|
23
|
+
from ..tools.search_models import SearchModelsTool
|
24
|
+
from ..tools.simulate_model import SimulateModelTool
|
25
|
+
from ..tools.steady_state import SteadyStateTool
|
24
26
|
|
25
27
|
# Initialize logger
|
26
28
|
logging.basicConfig(level=logging.INFO)
|
27
29
|
logger = logging.getLogger(__name__)
|
28
30
|
|
29
|
-
|
30
|
-
|
31
|
-
|
31
|
+
|
32
|
+
def get_app(uniq_id, llm_model: BaseChatModel):
|
33
|
+
"""
|
32
34
|
This function returns the langraph app.
|
33
|
-
|
35
|
+
"""
|
36
|
+
|
34
37
|
def agent_t2b_node(state: Annotated[dict, InjectedState]):
|
35
|
-
|
38
|
+
"""
|
36
39
|
This function calls the model.
|
37
|
-
|
40
|
+
"""
|
38
41
|
logger.log(logging.INFO, "Calling t2b_agent node with thread_id %s", uniq_id)
|
39
42
|
response = model.invoke(state, {"configurable": {"thread_id": uniq_id}})
|
40
43
|
return response
|
41
44
|
|
42
45
|
# Define the tools
|
43
|
-
tools = ToolNode(
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
46
|
+
tools = ToolNode(
|
47
|
+
[
|
48
|
+
SimulateModelTool(),
|
49
|
+
AskQuestionTool(),
|
50
|
+
CustomPlotterTool(),
|
51
|
+
SearchModelsTool(),
|
52
|
+
GetModelInfoTool(),
|
53
|
+
SteadyStateTool(),
|
54
|
+
ParameterScanTool(),
|
55
|
+
GetAnnotationTool(),
|
56
|
+
QueryArticle(),
|
57
|
+
]
|
58
|
+
)
|
54
59
|
|
55
60
|
# Load hydra configuration
|
56
61
|
logger.log(logging.INFO, "Load Hydra configuration for Talk2BioModels agent.")
|
57
62
|
with hydra.initialize(version_base=None, config_path="../configs"):
|
58
|
-
cfg = hydra.compose(config_name=
|
59
|
-
overrides=['agents/t2b_agent=default'])
|
63
|
+
cfg = hydra.compose(config_name="config", overrides=["agents/t2b_agent=default"])
|
60
64
|
cfg = cfg.agents.t2b_agent
|
61
65
|
logger.log(logging.INFO, "state_modifier: %s", cfg.state_modifier)
|
62
66
|
# Create the agent
|
63
67
|
model = create_react_agent(
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
68
|
+
llm_model,
|
69
|
+
tools=tools,
|
70
|
+
state_schema=Talk2Biomodels,
|
71
|
+
prompt=cfg.state_modifier,
|
72
|
+
version="v2",
|
73
|
+
checkpointer=MemorySaver(),
|
74
|
+
)
|
71
75
|
|
72
76
|
# Define a new graph
|
73
77
|
workflow = StateGraph(Talk2Biomodels)
|
@@ -87,11 +91,12 @@ def get_app(uniq_id,
|
|
87
91
|
# meaning you can use it as you would any other runnable.
|
88
92
|
# Note that we're (optionally) passing the memory
|
89
93
|
# when compiling the graph
|
90
|
-
app = workflow.compile(checkpointer=checkpointer,
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
94
|
+
app = workflow.compile(checkpointer=checkpointer, name="T2B_Agent")
|
95
|
+
logger.log(
|
96
|
+
logging.INFO,
|
97
|
+
"Compiled the graph with thread_id %s and llm_model %s",
|
98
|
+
uniq_id,
|
99
|
+
llm_model,
|
100
|
+
)
|
96
101
|
|
97
102
|
return app
|
@@ -1,10 +1,12 @@
|
|
1
1
|
"""
|
2
2
|
This module contains the API for fetching Kegg database
|
3
3
|
"""
|
4
|
+
|
4
5
|
import re
|
5
|
-
|
6
|
+
|
6
7
|
import requests
|
7
8
|
|
9
|
+
|
8
10
|
def fetch_from_api(base_url: str, query: str) -> str:
|
9
11
|
"""Fetch data from the given API endpoint."""
|
10
12
|
try:
|
@@ -15,7 +17,8 @@ def fetch_from_api(base_url: str, query: str) -> str:
|
|
15
17
|
print(f"Error fetching data for query {query}: {e}")
|
16
18
|
return ""
|
17
19
|
|
18
|
-
|
20
|
+
|
21
|
+
def fetch_kegg_names(ids: list[str], batch_size: int = 10) -> dict[str, str]:
|
19
22
|
"""
|
20
23
|
Fetch the names of multiple KEGG entries using the KEGG REST API in batches.
|
21
24
|
|
@@ -34,7 +37,7 @@ def fetch_kegg_names(ids: List[str], batch_size: int = 10) -> Dict[str, str]:
|
|
34
37
|
|
35
38
|
# Process IDs in batches
|
36
39
|
for i in range(0, len(ids), batch_size):
|
37
|
-
batch = ids[i:i + batch_size]
|
40
|
+
batch = ids[i : i + batch_size]
|
38
41
|
query = "+".join(batch)
|
39
42
|
entry_data = fetch_from_api(base_url, query)
|
40
43
|
|
@@ -45,17 +48,15 @@ def fetch_kegg_names(ids: List[str], batch_size: int = 10) -> Dict[str, str]:
|
|
45
48
|
if not entry.strip():
|
46
49
|
continue
|
47
50
|
lines = entry.strip().split("\n")
|
48
|
-
entry_line = next((line for line in lines
|
49
|
-
|
50
|
-
name_line = next((line for line in lines
|
51
|
-
if line.startswith("NAME")), None)
|
51
|
+
entry_line = next((line for line in lines if line.startswith("ENTRY")), None)
|
52
|
+
name_line = next((line for line in lines if line.startswith("NAME")), None)
|
52
53
|
|
53
54
|
# if not entry_line and not name_line:
|
54
55
|
# continue
|
55
56
|
entry_id = entry_line.split()[1]
|
56
57
|
# Split multiple names in the NAME field and clean them
|
57
58
|
names = [
|
58
|
-
re.sub(r
|
59
|
+
re.sub(r"[^a-zA-Z0-9\s]", "", name).strip()
|
59
60
|
for name in name_line.replace("NAME", "").strip().split(";")
|
60
61
|
]
|
61
62
|
# Join cleaned names into a single string
|
@@ -63,8 +64,10 @@ def fetch_kegg_names(ids: List[str], batch_size: int = 10) -> Dict[str, str]:
|
|
63
64
|
|
64
65
|
return entry_name_map
|
65
66
|
|
66
|
-
|
67
|
-
|
67
|
+
|
68
|
+
def fetch_kegg_annotations(
|
69
|
+
data: list[dict[str, str]], batch_size: int = 10
|
70
|
+
) -> dict[str, dict[str, str]]:
|
68
71
|
"""Fetch KEGG entry descriptions grouped by database type."""
|
69
72
|
grouped_data = {}
|
70
73
|
for entry in data:
|
@@ -77,6 +80,7 @@ def fetch_kegg_annotations(data: List[Dict[str, str]],
|
|
77
80
|
|
78
81
|
return results
|
79
82
|
|
83
|
+
|
80
84
|
# def get_protein_name_or_label(data: List[Dict[str, str]],
|
81
85
|
# batch_size: int = 10) -> Dict[str, Dict[str, str]]:
|
82
86
|
# """Fetch descriptions for KEGG-related identifiers."""
|
@@ -1,9 +1,10 @@
|
|
1
1
|
"""
|
2
2
|
This module contains the API for fetching ols database
|
3
3
|
"""
|
4
|
-
|
4
|
+
|
5
5
|
import requests
|
6
6
|
|
7
|
+
|
7
8
|
def fetch_from_ols(term: str) -> str:
|
8
9
|
"""
|
9
10
|
Fetch the label for a single term from OLS.
|
@@ -19,23 +20,24 @@ def fetch_from_ols(term: str) -> str:
|
|
19
20
|
base_url = f"https://www.ebi.ac.uk/ols4/api/ontologies/{ontology.lower()}/terms"
|
20
21
|
params = {"obo_id": term}
|
21
22
|
response = requests.get(
|
22
|
-
base_url,
|
23
|
-
params=params,
|
24
|
-
headers={"Accept": "application/json"},
|
25
|
-
timeout=10
|
23
|
+
base_url, params=params, headers={"Accept": "application/json"}, timeout=10
|
26
24
|
)
|
27
25
|
response.raise_for_status()
|
28
26
|
data = response.json()
|
29
|
-
label =
|
27
|
+
label = "-"
|
30
28
|
# Extract and return the label
|
31
|
-
if
|
32
|
-
|
29
|
+
if (
|
30
|
+
"_embedded" in data
|
31
|
+
and "terms" in data["_embedded"]
|
32
|
+
and len(data["_embedded"]["terms"]) > 0
|
33
|
+
):
|
33
34
|
label = data["_embedded"]["terms"][0].get("label", "Label not found")
|
34
35
|
return label
|
35
36
|
except (requests.exceptions.RequestException, KeyError, IndexError) as e:
|
36
37
|
return f"Error: {str(e)}"
|
37
38
|
|
38
|
-
|
39
|
+
|
40
|
+
def fetch_ols_labels(terms: list[str]) -> dict[str, str]:
|
39
41
|
"""
|
40
42
|
Fetch labels for multiple terms from OLS.
|
41
43
|
|
@@ -50,7 +52,8 @@ def fetch_ols_labels(terms: List[str]) -> Dict[str, str]:
|
|
50
52
|
results[term] = fetch_from_ols(term)
|
51
53
|
return results
|
52
54
|
|
53
|
-
|
55
|
+
|
56
|
+
def search_ols_labels(data: list[dict[str, str]]) -> dict[str, dict[str, str]]:
|
54
57
|
"""
|
55
58
|
Fetch OLS annotations grouped by ontology type.
|
56
59
|
|