aiagents4pharma 0.0.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 +11 -0
- aiagents4pharma/talk2aiagents4pharma/.dockerignore +13 -0
- aiagents4pharma/talk2aiagents4pharma/Dockerfile +133 -0
- aiagents4pharma/talk2aiagents4pharma/README.md +1 -0
- aiagents4pharma/talk2aiagents4pharma/__init__.py +5 -0
- aiagents4pharma/talk2aiagents4pharma/agents/__init__.py +6 -0
- aiagents4pharma/talk2aiagents4pharma/agents/main_agent.py +70 -0
- aiagents4pharma/talk2aiagents4pharma/configs/__init__.py +5 -0
- aiagents4pharma/talk2aiagents4pharma/configs/agents/__init__.py +5 -0
- aiagents4pharma/talk2aiagents4pharma/configs/agents/main_agent/default.yaml +29 -0
- aiagents4pharma/talk2aiagents4pharma/configs/app/__init__.py +0 -0
- aiagents4pharma/talk2aiagents4pharma/configs/app/frontend/__init__.py +0 -0
- aiagents4pharma/talk2aiagents4pharma/configs/app/frontend/default.yaml +102 -0
- aiagents4pharma/talk2aiagents4pharma/configs/config.yaml +4 -0
- 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 +154 -0
- aiagents4pharma/talk2aiagents4pharma/states/__init__.py +5 -0
- aiagents4pharma/talk2aiagents4pharma/states/state_talk2aiagents4pharma.py +18 -0
- aiagents4pharma/talk2aiagents4pharma/tests/__init__.py +3 -0
- aiagents4pharma/talk2aiagents4pharma/tests/test_main_agent.py +312 -0
- aiagents4pharma/talk2biomodels/.dockerignore +13 -0
- aiagents4pharma/talk2biomodels/Dockerfile +104 -0
- aiagents4pharma/talk2biomodels/README.md +1 -0
- aiagents4pharma/talk2biomodels/__init__.py +5 -0
- aiagents4pharma/talk2biomodels/agents/__init__.py +6 -0
- aiagents4pharma/talk2biomodels/agents/t2b_agent.py +104 -0
- aiagents4pharma/talk2biomodels/api/__init__.py +5 -0
- aiagents4pharma/talk2biomodels/api/ols.py +75 -0
- aiagents4pharma/talk2biomodels/api/uniprot.py +36 -0
- aiagents4pharma/talk2biomodels/configs/__init__.py +5 -0
- aiagents4pharma/talk2biomodels/configs/agents/__init__.py +5 -0
- aiagents4pharma/talk2biomodels/configs/agents/t2b_agent/__init__.py +3 -0
- aiagents4pharma/talk2biomodels/configs/agents/t2b_agent/default.yaml +14 -0
- aiagents4pharma/talk2biomodels/configs/app/__init__.py +0 -0
- aiagents4pharma/talk2biomodels/configs/app/frontend/__init__.py +0 -0
- aiagents4pharma/talk2biomodels/configs/app/frontend/default.yaml +72 -0
- aiagents4pharma/talk2biomodels/configs/config.yaml +7 -0
- aiagents4pharma/talk2biomodels/configs/tools/__init__.py +5 -0
- aiagents4pharma/talk2biomodels/configs/tools/ask_question/__init__.py +3 -0
- aiagents4pharma/talk2biomodels/configs/tools/ask_question/default.yaml +30 -0
- aiagents4pharma/talk2biomodels/configs/tools/custom_plotter/__init__.py +3 -0
- aiagents4pharma/talk2biomodels/configs/tools/custom_plotter/default.yaml +8 -0
- aiagents4pharma/talk2biomodels/configs/tools/get_annotation/__init__.py +3 -0
- aiagents4pharma/talk2biomodels/configs/tools/get_annotation/default.yaml +8 -0
- aiagents4pharma/talk2biomodels/install.md +63 -0
- aiagents4pharma/talk2biomodels/models/__init__.py +5 -0
- aiagents4pharma/talk2biomodels/models/basico_model.py +125 -0
- aiagents4pharma/talk2biomodels/models/sys_bio_model.py +60 -0
- aiagents4pharma/talk2biomodels/states/__init__.py +6 -0
- aiagents4pharma/talk2biomodels/states/state_talk2biomodels.py +49 -0
- aiagents4pharma/talk2biomodels/tests/BIOMD0000000449_url.xml +1585 -0
- aiagents4pharma/talk2biomodels/tests/__init__.py +3 -0
- aiagents4pharma/talk2biomodels/tests/article_on_model_537.pdf +0 -0
- aiagents4pharma/talk2biomodels/tests/test_api.py +31 -0
- aiagents4pharma/talk2biomodels/tests/test_ask_question.py +42 -0
- aiagents4pharma/talk2biomodels/tests/test_basico_model.py +67 -0
- aiagents4pharma/talk2biomodels/tests/test_get_annotation.py +190 -0
- aiagents4pharma/talk2biomodels/tests/test_getmodelinfo.py +92 -0
- aiagents4pharma/talk2biomodels/tests/test_integration.py +116 -0
- aiagents4pharma/talk2biomodels/tests/test_load_biomodel.py +35 -0
- aiagents4pharma/talk2biomodels/tests/test_param_scan.py +71 -0
- aiagents4pharma/talk2biomodels/tests/test_query_article.py +184 -0
- aiagents4pharma/talk2biomodels/tests/test_save_model.py +47 -0
- aiagents4pharma/talk2biomodels/tests/test_search_models.py +35 -0
- aiagents4pharma/talk2biomodels/tests/test_simulate_model.py +44 -0
- aiagents4pharma/talk2biomodels/tests/test_steady_state.py +86 -0
- aiagents4pharma/talk2biomodels/tests/test_sys_bio_model.py +67 -0
- aiagents4pharma/talk2biomodels/tools/__init__.py +17 -0
- aiagents4pharma/talk2biomodels/tools/ask_question.py +125 -0
- aiagents4pharma/talk2biomodels/tools/custom_plotter.py +165 -0
- aiagents4pharma/talk2biomodels/tools/get_annotation.py +342 -0
- aiagents4pharma/talk2biomodels/tools/get_modelinfo.py +159 -0
- aiagents4pharma/talk2biomodels/tools/load_arguments.py +134 -0
- aiagents4pharma/talk2biomodels/tools/load_biomodel.py +44 -0
- aiagents4pharma/talk2biomodels/tools/parameter_scan.py +310 -0
- aiagents4pharma/talk2biomodels/tools/query_article.py +64 -0
- aiagents4pharma/talk2biomodels/tools/save_model.py +98 -0
- aiagents4pharma/talk2biomodels/tools/search_models.py +96 -0
- aiagents4pharma/talk2biomodels/tools/simulate_model.py +137 -0
- aiagents4pharma/talk2biomodels/tools/steady_state.py +187 -0
- aiagents4pharma/talk2biomodels/tools/utils.py +23 -0
- aiagents4pharma/talk2cells/README.md +1 -0
- aiagents4pharma/talk2cells/__init__.py +5 -0
- aiagents4pharma/talk2cells/agents/__init__.py +6 -0
- aiagents4pharma/talk2cells/agents/scp_agent.py +87 -0
- aiagents4pharma/talk2cells/states/__init__.py +6 -0
- aiagents4pharma/talk2cells/states/state_talk2cells.py +15 -0
- aiagents4pharma/talk2cells/tests/scp_agent/test_scp_agent.py +22 -0
- aiagents4pharma/talk2cells/tools/__init__.py +6 -0
- aiagents4pharma/talk2cells/tools/scp_agent/__init__.py +6 -0
- aiagents4pharma/talk2cells/tools/scp_agent/display_studies.py +27 -0
- aiagents4pharma/talk2cells/tools/scp_agent/search_studies.py +78 -0
- aiagents4pharma/talk2knowledgegraphs/.dockerignore +13 -0
- aiagents4pharma/talk2knowledgegraphs/Dockerfile +131 -0
- aiagents4pharma/talk2knowledgegraphs/README.md +1 -0
- aiagents4pharma/talk2knowledgegraphs/__init__.py +5 -0
- aiagents4pharma/talk2knowledgegraphs/agents/__init__.py +5 -0
- aiagents4pharma/talk2knowledgegraphs/agents/t2kg_agent.py +99 -0
- aiagents4pharma/talk2knowledgegraphs/configs/__init__.py +5 -0
- aiagents4pharma/talk2knowledgegraphs/configs/agents/t2kg_agent/__init__.py +3 -0
- aiagents4pharma/talk2knowledgegraphs/configs/agents/t2kg_agent/default.yaml +62 -0
- aiagents4pharma/talk2knowledgegraphs/configs/app/__init__.py +5 -0
- aiagents4pharma/talk2knowledgegraphs/configs/app/frontend/__init__.py +3 -0
- aiagents4pharma/talk2knowledgegraphs/configs/app/frontend/default.yaml +79 -0
- aiagents4pharma/talk2knowledgegraphs/configs/config.yaml +13 -0
- aiagents4pharma/talk2knowledgegraphs/configs/tools/__init__.py +5 -0
- aiagents4pharma/talk2knowledgegraphs/configs/tools/graphrag_reasoning/__init__.py +3 -0
- aiagents4pharma/talk2knowledgegraphs/configs/tools/graphrag_reasoning/default.yaml +24 -0
- aiagents4pharma/talk2knowledgegraphs/configs/tools/multimodal_subgraph_extraction/__init__.py +0 -0
- aiagents4pharma/talk2knowledgegraphs/configs/tools/multimodal_subgraph_extraction/default.yaml +33 -0
- aiagents4pharma/talk2knowledgegraphs/configs/tools/subgraph_extraction/__init__.py +3 -0
- aiagents4pharma/talk2knowledgegraphs/configs/tools/subgraph_extraction/default.yaml +43 -0
- aiagents4pharma/talk2knowledgegraphs/configs/tools/subgraph_summarization/__init__.py +3 -0
- aiagents4pharma/talk2knowledgegraphs/configs/tools/subgraph_summarization/default.yaml +9 -0
- aiagents4pharma/talk2knowledgegraphs/configs/utils/database/milvus/__init__.py +3 -0
- aiagents4pharma/talk2knowledgegraphs/configs/utils/database/milvus/default.yaml +61 -0
- aiagents4pharma/talk2knowledgegraphs/configs/utils/enrichments/ols_terms/default.yaml +3 -0
- aiagents4pharma/talk2knowledgegraphs/configs/utils/enrichments/reactome_pathways/default.yaml +3 -0
- aiagents4pharma/talk2knowledgegraphs/configs/utils/enrichments/uniprot_proteins/default.yaml +6 -0
- aiagents4pharma/talk2knowledgegraphs/configs/utils/pubchem_utils/default.yaml +5 -0
- aiagents4pharma/talk2knowledgegraphs/datasets/__init__.py +5 -0
- aiagents4pharma/talk2knowledgegraphs/datasets/biobridge_primekg.py +607 -0
- aiagents4pharma/talk2knowledgegraphs/datasets/dataset.py +25 -0
- aiagents4pharma/talk2knowledgegraphs/datasets/primekg.py +212 -0
- aiagents4pharma/talk2knowledgegraphs/datasets/starkqa_primekg.py +210 -0
- 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 +180 -0
- aiagents4pharma/talk2knowledgegraphs/install.md +165 -0
- aiagents4pharma/talk2knowledgegraphs/milvus_data_dump.py +886 -0
- aiagents4pharma/talk2knowledgegraphs/states/__init__.py +5 -0
- aiagents4pharma/talk2knowledgegraphs/states/state_talk2knowledgegraphs.py +40 -0
- aiagents4pharma/talk2knowledgegraphs/tests/__init__.py +0 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_agents_t2kg_agent.py +318 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_datasets_biobridge_primekg.py +248 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_datasets_dataset.py +33 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_datasets_primekg.py +86 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_datasets_starkqa_primekg.py +125 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_tools_graphrag_reasoning.py +257 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_tools_milvus_multimodal_subgraph_extraction.py +1444 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_tools_multimodal_subgraph_extraction.py +159 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_tools_subgraph_extraction.py +152 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_tools_subgraph_summarization.py +201 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_database_milvus_connection_manager.py +812 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_embeddings_embeddings.py +51 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_embeddings_huggingface.py +49 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_embeddings_nim_molmim.py +59 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_embeddings_ollama.py +63 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_embeddings_sentencetransformer.py +47 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_enrichments.py +40 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_ollama.py +94 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_ols.py +70 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_pubchem.py +45 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_reactome.py +44 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_uniprot.py +48 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_extractions_milvus_multimodal_pcst.py +759 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_kg_utils.py +78 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_pubchem_utils.py +123 -0
- aiagents4pharma/talk2knowledgegraphs/tools/__init__.py +11 -0
- aiagents4pharma/talk2knowledgegraphs/tools/graphrag_reasoning.py +138 -0
- aiagents4pharma/talk2knowledgegraphs/tools/load_arguments.py +22 -0
- aiagents4pharma/talk2knowledgegraphs/tools/milvus_multimodal_subgraph_extraction.py +965 -0
- aiagents4pharma/talk2knowledgegraphs/tools/multimodal_subgraph_extraction.py +374 -0
- aiagents4pharma/talk2knowledgegraphs/tools/subgraph_extraction.py +291 -0
- aiagents4pharma/talk2knowledgegraphs/tools/subgraph_summarization.py +123 -0
- aiagents4pharma/talk2knowledgegraphs/utils/__init__.py +5 -0
- aiagents4pharma/talk2knowledgegraphs/utils/database/__init__.py +5 -0
- aiagents4pharma/talk2knowledgegraphs/utils/database/milvus_connection_manager.py +586 -0
- aiagents4pharma/talk2knowledgegraphs/utils/embeddings/__init__.py +5 -0
- aiagents4pharma/talk2knowledgegraphs/utils/embeddings/embeddings.py +81 -0
- aiagents4pharma/talk2knowledgegraphs/utils/embeddings/huggingface.py +111 -0
- aiagents4pharma/talk2knowledgegraphs/utils/embeddings/nim_molmim.py +54 -0
- aiagents4pharma/talk2knowledgegraphs/utils/embeddings/ollama.py +87 -0
- aiagents4pharma/talk2knowledgegraphs/utils/embeddings/sentence_transformer.py +73 -0
- aiagents4pharma/talk2knowledgegraphs/utils/enrichments/__init__.py +12 -0
- aiagents4pharma/talk2knowledgegraphs/utils/enrichments/enrichments.py +37 -0
- aiagents4pharma/talk2knowledgegraphs/utils/enrichments/ollama.py +129 -0
- aiagents4pharma/talk2knowledgegraphs/utils/enrichments/ols_terms.py +89 -0
- aiagents4pharma/talk2knowledgegraphs/utils/enrichments/pubchem_strings.py +78 -0
- aiagents4pharma/talk2knowledgegraphs/utils/enrichments/reactome_pathways.py +71 -0
- aiagents4pharma/talk2knowledgegraphs/utils/enrichments/uniprot_proteins.py +98 -0
- aiagents4pharma/talk2knowledgegraphs/utils/extractions/__init__.py +5 -0
- aiagents4pharma/talk2knowledgegraphs/utils/extractions/milvus_multimodal_pcst.py +762 -0
- aiagents4pharma/talk2knowledgegraphs/utils/extractions/multimodal_pcst.py +298 -0
- aiagents4pharma/talk2knowledgegraphs/utils/extractions/pcst.py +229 -0
- aiagents4pharma/talk2knowledgegraphs/utils/kg_utils.py +67 -0
- aiagents4pharma/talk2knowledgegraphs/utils/pubchem_utils.py +104 -0
- aiagents4pharma/talk2scholars/.dockerignore +13 -0
- aiagents4pharma/talk2scholars/Dockerfile +104 -0
- aiagents4pharma/talk2scholars/README.md +1 -0
- aiagents4pharma/talk2scholars/__init__.py +7 -0
- aiagents4pharma/talk2scholars/agents/__init__.py +13 -0
- aiagents4pharma/talk2scholars/agents/main_agent.py +89 -0
- aiagents4pharma/talk2scholars/agents/paper_download_agent.py +96 -0
- aiagents4pharma/talk2scholars/agents/pdf_agent.py +101 -0
- aiagents4pharma/talk2scholars/agents/s2_agent.py +135 -0
- aiagents4pharma/talk2scholars/agents/zotero_agent.py +127 -0
- aiagents4pharma/talk2scholars/configs/__init__.py +7 -0
- aiagents4pharma/talk2scholars/configs/agents/__init__.py +7 -0
- aiagents4pharma/talk2scholars/configs/agents/talk2scholars/__init__.py +7 -0
- aiagents4pharma/talk2scholars/configs/agents/talk2scholars/main_agent/__init__.py +3 -0
- aiagents4pharma/talk2scholars/configs/agents/talk2scholars/main_agent/default.yaml +52 -0
- aiagents4pharma/talk2scholars/configs/agents/talk2scholars/paper_download_agent/__init__.py +3 -0
- aiagents4pharma/talk2scholars/configs/agents/talk2scholars/paper_download_agent/default.yaml +19 -0
- aiagents4pharma/talk2scholars/configs/agents/talk2scholars/pdf_agent/__init__.py +3 -0
- aiagents4pharma/talk2scholars/configs/agents/talk2scholars/pdf_agent/default.yaml +19 -0
- aiagents4pharma/talk2scholars/configs/agents/talk2scholars/s2_agent/__init__.py +3 -0
- aiagents4pharma/talk2scholars/configs/agents/talk2scholars/s2_agent/default.yaml +44 -0
- aiagents4pharma/talk2scholars/configs/agents/talk2scholars/zotero_agent/__init__.py +3 -0
- aiagents4pharma/talk2scholars/configs/agents/talk2scholars/zotero_agent/default.yaml +19 -0
- aiagents4pharma/talk2scholars/configs/app/__init__.py +7 -0
- aiagents4pharma/talk2scholars/configs/app/frontend/__init__.py +3 -0
- aiagents4pharma/talk2scholars/configs/app/frontend/default.yaml +72 -0
- aiagents4pharma/talk2scholars/configs/config.yaml +16 -0
- aiagents4pharma/talk2scholars/configs/tools/__init__.py +21 -0
- aiagents4pharma/talk2scholars/configs/tools/multi_paper_recommendation/__init__.py +3 -0
- aiagents4pharma/talk2scholars/configs/tools/multi_paper_recommendation/default.yaml +26 -0
- aiagents4pharma/talk2scholars/configs/tools/paper_download/__init__.py +3 -0
- aiagents4pharma/talk2scholars/configs/tools/paper_download/default.yaml +124 -0
- aiagents4pharma/talk2scholars/configs/tools/question_and_answer/__init__.py +3 -0
- aiagents4pharma/talk2scholars/configs/tools/question_and_answer/default.yaml +62 -0
- aiagents4pharma/talk2scholars/configs/tools/retrieve_semantic_scholar_paper_id/__init__.py +3 -0
- aiagents4pharma/talk2scholars/configs/tools/retrieve_semantic_scholar_paper_id/default.yaml +12 -0
- aiagents4pharma/talk2scholars/configs/tools/search/__init__.py +3 -0
- aiagents4pharma/talk2scholars/configs/tools/search/default.yaml +26 -0
- aiagents4pharma/talk2scholars/configs/tools/single_paper_recommendation/__init__.py +3 -0
- aiagents4pharma/talk2scholars/configs/tools/single_paper_recommendation/default.yaml +26 -0
- aiagents4pharma/talk2scholars/configs/tools/zotero_read/__init__.py +3 -0
- aiagents4pharma/talk2scholars/configs/tools/zotero_read/default.yaml +57 -0
- aiagents4pharma/talk2scholars/configs/tools/zotero_write/__inti__.py +3 -0
- aiagents4pharma/talk2scholars/configs/tools/zotero_write/default.yaml +55 -0
- 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/__init__.py +7 -0
- aiagents4pharma/talk2scholars/state/state_talk2scholars.py +98 -0
- aiagents4pharma/talk2scholars/tests/__init__.py +3 -0
- aiagents4pharma/talk2scholars/tests/test_agents_main_agent.py +256 -0
- aiagents4pharma/talk2scholars/tests/test_agents_paper_agents_download_agent.py +139 -0
- aiagents4pharma/talk2scholars/tests/test_agents_pdf_agent.py +114 -0
- aiagents4pharma/talk2scholars/tests/test_agents_s2_agent.py +198 -0
- aiagents4pharma/talk2scholars/tests/test_agents_zotero_agent.py +160 -0
- aiagents4pharma/talk2scholars/tests/test_s2_tools_display_dataframe.py +91 -0
- aiagents4pharma/talk2scholars/tests/test_s2_tools_query_dataframe.py +191 -0
- aiagents4pharma/talk2scholars/tests/test_states_state.py +38 -0
- aiagents4pharma/talk2scholars/tests/test_tools_paper_downloader.py +507 -0
- aiagents4pharma/talk2scholars/tests/test_tools_question_and_answer_tool.py +105 -0
- aiagents4pharma/talk2scholars/tests/test_tools_s2_multi.py +307 -0
- aiagents4pharma/talk2scholars/tests/test_tools_s2_retrieve.py +67 -0
- aiagents4pharma/talk2scholars/tests/test_tools_s2_search.py +286 -0
- aiagents4pharma/talk2scholars/tests/test_tools_s2_single.py +298 -0
- aiagents4pharma/talk2scholars/tests/test_utils_arxiv_downloader.py +469 -0
- aiagents4pharma/talk2scholars/tests/test_utils_base_paper_downloader.py +598 -0
- aiagents4pharma/talk2scholars/tests/test_utils_biorxiv_downloader.py +669 -0
- aiagents4pharma/talk2scholars/tests/test_utils_medrxiv_downloader.py +500 -0
- aiagents4pharma/talk2scholars/tests/test_utils_nvidia_nim_reranker.py +117 -0
- aiagents4pharma/talk2scholars/tests/test_utils_pdf_answer_formatter.py +67 -0
- aiagents4pharma/talk2scholars/tests/test_utils_pdf_batch_processor.py +92 -0
- aiagents4pharma/talk2scholars/tests/test_utils_pdf_collection_manager.py +173 -0
- aiagents4pharma/talk2scholars/tests/test_utils_pdf_document_processor.py +68 -0
- aiagents4pharma/talk2scholars/tests/test_utils_pdf_generate_answer.py +72 -0
- aiagents4pharma/talk2scholars/tests/test_utils_pdf_gpu_detection.py +129 -0
- aiagents4pharma/talk2scholars/tests/test_utils_pdf_paper_loader.py +116 -0
- aiagents4pharma/talk2scholars/tests/test_utils_pdf_rag_pipeline.py +88 -0
- aiagents4pharma/talk2scholars/tests/test_utils_pdf_retrieve_chunks.py +190 -0
- aiagents4pharma/talk2scholars/tests/test_utils_pdf_singleton_manager.py +159 -0
- aiagents4pharma/talk2scholars/tests/test_utils_pdf_vector_normalization.py +121 -0
- aiagents4pharma/talk2scholars/tests/test_utils_pdf_vector_store.py +406 -0
- aiagents4pharma/talk2scholars/tests/test_utils_pubmed_downloader.py +1007 -0
- aiagents4pharma/talk2scholars/tests/test_utils_read_helper_utils.py +106 -0
- aiagents4pharma/talk2scholars/tests/test_utils_s2_utils_ext_ids.py +403 -0
- aiagents4pharma/talk2scholars/tests/test_utils_tool_helper_utils.py +85 -0
- aiagents4pharma/talk2scholars/tests/test_utils_zotero_human_in_the_loop.py +266 -0
- aiagents4pharma/talk2scholars/tests/test_utils_zotero_path.py +496 -0
- aiagents4pharma/talk2scholars/tests/test_utils_zotero_pdf_downloader_utils.py +46 -0
- aiagents4pharma/talk2scholars/tests/test_utils_zotero_read.py +743 -0
- aiagents4pharma/talk2scholars/tests/test_utils_zotero_write.py +151 -0
- aiagents4pharma/talk2scholars/tools/__init__.py +9 -0
- aiagents4pharma/talk2scholars/tools/paper_download/__init__.py +12 -0
- aiagents4pharma/talk2scholars/tools/paper_download/paper_downloader.py +442 -0
- aiagents4pharma/talk2scholars/tools/paper_download/utils/__init__.py +22 -0
- aiagents4pharma/talk2scholars/tools/paper_download/utils/arxiv_downloader.py +207 -0
- aiagents4pharma/talk2scholars/tools/paper_download/utils/base_paper_downloader.py +336 -0
- aiagents4pharma/talk2scholars/tools/paper_download/utils/biorxiv_downloader.py +313 -0
- aiagents4pharma/talk2scholars/tools/paper_download/utils/medrxiv_downloader.py +196 -0
- aiagents4pharma/talk2scholars/tools/paper_download/utils/pubmed_downloader.py +323 -0
- aiagents4pharma/talk2scholars/tools/pdf/__init__.py +7 -0
- aiagents4pharma/talk2scholars/tools/pdf/question_and_answer.py +170 -0
- aiagents4pharma/talk2scholars/tools/pdf/utils/__init__.py +37 -0
- aiagents4pharma/talk2scholars/tools/pdf/utils/answer_formatter.py +62 -0
- aiagents4pharma/talk2scholars/tools/pdf/utils/batch_processor.py +198 -0
- aiagents4pharma/talk2scholars/tools/pdf/utils/collection_manager.py +172 -0
- aiagents4pharma/talk2scholars/tools/pdf/utils/document_processor.py +76 -0
- aiagents4pharma/talk2scholars/tools/pdf/utils/generate_answer.py +97 -0
- aiagents4pharma/talk2scholars/tools/pdf/utils/get_vectorstore.py +59 -0
- aiagents4pharma/talk2scholars/tools/pdf/utils/gpu_detection.py +150 -0
- aiagents4pharma/talk2scholars/tools/pdf/utils/nvidia_nim_reranker.py +97 -0
- aiagents4pharma/talk2scholars/tools/pdf/utils/paper_loader.py +123 -0
- aiagents4pharma/talk2scholars/tools/pdf/utils/rag_pipeline.py +113 -0
- aiagents4pharma/talk2scholars/tools/pdf/utils/retrieve_chunks.py +197 -0
- aiagents4pharma/talk2scholars/tools/pdf/utils/singleton_manager.py +140 -0
- aiagents4pharma/talk2scholars/tools/pdf/utils/tool_helper.py +86 -0
- aiagents4pharma/talk2scholars/tools/pdf/utils/vector_normalization.py +150 -0
- aiagents4pharma/talk2scholars/tools/pdf/utils/vector_store.py +327 -0
- aiagents4pharma/talk2scholars/tools/s2/__init__.py +21 -0
- aiagents4pharma/talk2scholars/tools/s2/display_dataframe.py +110 -0
- aiagents4pharma/talk2scholars/tools/s2/multi_paper_rec.py +111 -0
- aiagents4pharma/talk2scholars/tools/s2/query_dataframe.py +233 -0
- aiagents4pharma/talk2scholars/tools/s2/retrieve_semantic_scholar_paper_id.py +128 -0
- aiagents4pharma/talk2scholars/tools/s2/search.py +101 -0
- aiagents4pharma/talk2scholars/tools/s2/single_paper_rec.py +102 -0
- aiagents4pharma/talk2scholars/tools/s2/utils/__init__.py +5 -0
- aiagents4pharma/talk2scholars/tools/s2/utils/multi_helper.py +223 -0
- aiagents4pharma/talk2scholars/tools/s2/utils/search_helper.py +205 -0
- aiagents4pharma/talk2scholars/tools/s2/utils/single_helper.py +216 -0
- aiagents4pharma/talk2scholars/tools/zotero/__init__.py +7 -0
- aiagents4pharma/talk2scholars/tools/zotero/utils/__init__.py +7 -0
- aiagents4pharma/talk2scholars/tools/zotero/utils/read_helper.py +270 -0
- aiagents4pharma/talk2scholars/tools/zotero/utils/review_helper.py +74 -0
- aiagents4pharma/talk2scholars/tools/zotero/utils/write_helper.py +194 -0
- aiagents4pharma/talk2scholars/tools/zotero/utils/zotero_path.py +180 -0
- aiagents4pharma/talk2scholars/tools/zotero/utils/zotero_pdf_downloader.py +133 -0
- aiagents4pharma/talk2scholars/tools/zotero/zotero_read.py +105 -0
- aiagents4pharma/talk2scholars/tools/zotero/zotero_review.py +162 -0
- aiagents4pharma/talk2scholars/tools/zotero/zotero_write.py +91 -0
- aiagents4pharma-0.0.0.dist-info/METADATA +335 -0
- aiagents4pharma-0.0.0.dist-info/RECORD +336 -0
- aiagents4pharma-0.0.0.dist-info/WHEEL +4 -0
- aiagents4pharma-0.0.0.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
Tool for searching models based on search query.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import logging
|
|
8
|
+
from typing import Annotated
|
|
9
|
+
|
|
10
|
+
import pandas as pd
|
|
11
|
+
from basico import biomodels
|
|
12
|
+
from langchain_core.messages import ToolMessage
|
|
13
|
+
from langchain_core.tools import BaseTool
|
|
14
|
+
from langchain_core.tools.base import InjectedToolCallId
|
|
15
|
+
from langgraph.types import Command
|
|
16
|
+
from pydantic import BaseModel, Field
|
|
17
|
+
|
|
18
|
+
# Initialize logger
|
|
19
|
+
logging.basicConfig(level=logging.INFO)
|
|
20
|
+
logger = logging.getLogger(__name__)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class SearchModelsInput(BaseModel):
|
|
24
|
+
"""
|
|
25
|
+
Input schema for the search models tool.
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
query: str = Field(description="Search models query", default=None)
|
|
29
|
+
num_query: int = Field(description="Top number of models to search", default=10, le=100)
|
|
30
|
+
tool_call_id: Annotated[str, InjectedToolCallId]
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
# Note: It's important that every field has type hints. BaseTool is a
|
|
34
|
+
# Pydantic class and not having type hints can lead to unexpected behavior.
|
|
35
|
+
class SearchModelsTool(BaseTool):
|
|
36
|
+
"""
|
|
37
|
+
Tool for returning the search results based on the search query.
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
name: str = "search_models"
|
|
41
|
+
description: str = "Search for only manually curated models in "
|
|
42
|
+
"the BioMmodels database based on keywords."
|
|
43
|
+
args_schema: type[BaseModel] = SearchModelsInput
|
|
44
|
+
return_direct: bool = False
|
|
45
|
+
|
|
46
|
+
def _run(
|
|
47
|
+
self,
|
|
48
|
+
tool_call_id: Annotated[str, InjectedToolCallId],
|
|
49
|
+
query: str = None,
|
|
50
|
+
num_query: int = 10,
|
|
51
|
+
) -> dict:
|
|
52
|
+
"""
|
|
53
|
+
Run the tool.
|
|
54
|
+
|
|
55
|
+
Args:
|
|
56
|
+
query (str): The search query.
|
|
57
|
+
num_query (int): The number of models to search.
|
|
58
|
+
tool_call_id (str): The tool call ID.
|
|
59
|
+
|
|
60
|
+
Returns:
|
|
61
|
+
dict: The answer to the question in the form of a dictionary.
|
|
62
|
+
"""
|
|
63
|
+
logger.log(
|
|
64
|
+
logging.INFO,
|
|
65
|
+
"Searching models with the query and number %s, %s",
|
|
66
|
+
query,
|
|
67
|
+
num_query,
|
|
68
|
+
)
|
|
69
|
+
# Search for models based on the query
|
|
70
|
+
search_results = biomodels.search_for_model(query, num_results=num_query)
|
|
71
|
+
# Convert the search results to a pandas DataFrame
|
|
72
|
+
df = pd.DataFrame(search_results)
|
|
73
|
+
# Prepare a message to return
|
|
74
|
+
first_n = min(3, len(search_results))
|
|
75
|
+
content = f"Found {len(search_results)} manually curated models"
|
|
76
|
+
content += f" for the query: {query}."
|
|
77
|
+
# Pass the first 3 models to the LLM
|
|
78
|
+
# to avoid hallucinations
|
|
79
|
+
content += f" Here is the summary of the first {first_n} models:"
|
|
80
|
+
for i in range(first_n):
|
|
81
|
+
content += (
|
|
82
|
+
f"\nModel {i + 1}: {search_results[i]['name']} (ID: {search_results[i]['id']})"
|
|
83
|
+
)
|
|
84
|
+
# Return the updated state of the tool
|
|
85
|
+
return Command(
|
|
86
|
+
update={
|
|
87
|
+
# update the message history
|
|
88
|
+
"messages": [
|
|
89
|
+
ToolMessage(
|
|
90
|
+
content=content,
|
|
91
|
+
tool_call_id=tool_call_id,
|
|
92
|
+
artifact={"dic_data": df.to_dict(orient="records")},
|
|
93
|
+
)
|
|
94
|
+
],
|
|
95
|
+
}
|
|
96
|
+
)
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
Tool for simulating a model.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import logging
|
|
8
|
+
from typing import Annotated
|
|
9
|
+
|
|
10
|
+
import basico
|
|
11
|
+
from langchain_core.messages import ToolMessage
|
|
12
|
+
from langchain_core.tools import BaseTool
|
|
13
|
+
from langchain_core.tools.base import InjectedToolCallId
|
|
14
|
+
from langgraph.prebuilt import InjectedState
|
|
15
|
+
from langgraph.types import Command
|
|
16
|
+
from pydantic import BaseModel, Field
|
|
17
|
+
|
|
18
|
+
from .load_arguments import ArgumentData, add_rec_events
|
|
19
|
+
from .load_biomodel import ModelData, load_biomodel
|
|
20
|
+
from .utils import get_model_units
|
|
21
|
+
|
|
22
|
+
# Initialize logger
|
|
23
|
+
logging.basicConfig(level=logging.INFO)
|
|
24
|
+
logger = logging.getLogger(__name__)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class SimulateModelInput(BaseModel):
|
|
28
|
+
"""
|
|
29
|
+
Input schema for the SimulateModel tool.
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
sys_bio_model: ModelData = Field(description="model data", default=None)
|
|
33
|
+
arg_data: ArgumentData = Field(
|
|
34
|
+
description="""time, species, and reocurring data
|
|
35
|
+
as well as the simulation name""",
|
|
36
|
+
default=None,
|
|
37
|
+
)
|
|
38
|
+
tool_call_id: Annotated[str, InjectedToolCallId]
|
|
39
|
+
state: Annotated[dict, InjectedState]
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
# Note: It's important that every field has type hints. BaseTool is a
|
|
43
|
+
# Pydantic class and not having type hints can lead to unexpected behavior.
|
|
44
|
+
class SimulateModelTool(BaseTool):
|
|
45
|
+
"""
|
|
46
|
+
Tool for simulating a model.
|
|
47
|
+
"""
|
|
48
|
+
|
|
49
|
+
name: str = "simulate_model"
|
|
50
|
+
description: str = "A tool to simulate a biomodel"
|
|
51
|
+
args_schema: type[BaseModel] = SimulateModelInput
|
|
52
|
+
|
|
53
|
+
def _run(
|
|
54
|
+
self,
|
|
55
|
+
tool_call_id: Annotated[str, InjectedToolCallId],
|
|
56
|
+
state: Annotated[dict, InjectedState],
|
|
57
|
+
sys_bio_model: ModelData = None,
|
|
58
|
+
arg_data: ArgumentData = None,
|
|
59
|
+
) -> Command:
|
|
60
|
+
"""
|
|
61
|
+
Run the tool.
|
|
62
|
+
|
|
63
|
+
Args:
|
|
64
|
+
tool_call_id (str): The tool call ID. This is injected by the system.
|
|
65
|
+
state (dict): The state of the tool.
|
|
66
|
+
sys_bio_model (ModelData): The model data.
|
|
67
|
+
arg_data (ArgumentData): The argument data.
|
|
68
|
+
|
|
69
|
+
Returns:
|
|
70
|
+
str: The result of the simulation.
|
|
71
|
+
"""
|
|
72
|
+
logger.log(logging.INFO, "Calling simulate_model tool %s, %s", sys_bio_model, arg_data)
|
|
73
|
+
sbml_file_path = state["sbml_file_path"][-1] if len(state["sbml_file_path"]) > 0 else None
|
|
74
|
+
model_object = load_biomodel(sys_bio_model, sbml_file_path=sbml_file_path)
|
|
75
|
+
# Prepare the dictionary of species data
|
|
76
|
+
# that will be passed to the simulate method
|
|
77
|
+
# of the BasicoModel class
|
|
78
|
+
duration = 100.0
|
|
79
|
+
interval = 10
|
|
80
|
+
dic_species_to_be_analyzed_before_experiment = {}
|
|
81
|
+
if arg_data:
|
|
82
|
+
# Prepare the dictionary of species data
|
|
83
|
+
if arg_data.species_to_be_analyzed_before_experiment is not None:
|
|
84
|
+
dic_species_to_be_analyzed_before_experiment = dict(
|
|
85
|
+
zip(
|
|
86
|
+
arg_data.species_to_be_analyzed_before_experiment.species_name,
|
|
87
|
+
arg_data.species_to_be_analyzed_before_experiment.species_concentration,
|
|
88
|
+
strict=False,
|
|
89
|
+
)
|
|
90
|
+
)
|
|
91
|
+
# Add reocurring events (if any) to the model
|
|
92
|
+
if arg_data.reocurring_data is not None:
|
|
93
|
+
add_rec_events(model_object, arg_data.reocurring_data)
|
|
94
|
+
# Set the duration and interval
|
|
95
|
+
if arg_data.time_data is not None:
|
|
96
|
+
duration = arg_data.time_data.duration
|
|
97
|
+
interval = arg_data.time_data.interval
|
|
98
|
+
# Update the model parameters
|
|
99
|
+
model_object.update_parameters(dic_species_to_be_analyzed_before_experiment)
|
|
100
|
+
logger.log(
|
|
101
|
+
logging.INFO,
|
|
102
|
+
"Following species/parameters updated in the model %s",
|
|
103
|
+
dic_species_to_be_analyzed_before_experiment,
|
|
104
|
+
)
|
|
105
|
+
# Simulate the model
|
|
106
|
+
df = model_object.simulate(duration=duration, interval=interval)
|
|
107
|
+
logger.log(logging.INFO, "Simulation results ready with shape %s", df.shape)
|
|
108
|
+
dic_simulated_data = {
|
|
109
|
+
"name": arg_data.experiment_name,
|
|
110
|
+
"source": (sys_bio_model.biomodel_id if sys_bio_model.biomodel_id else "upload"),
|
|
111
|
+
"tool_call_id": tool_call_id,
|
|
112
|
+
"data": df.to_dict(),
|
|
113
|
+
}
|
|
114
|
+
# Prepare the dictionary of updated state
|
|
115
|
+
dic_updated_state_for_model = {}
|
|
116
|
+
for key, value in {
|
|
117
|
+
"model_id": [sys_bio_model.biomodel_id],
|
|
118
|
+
"sbml_file_path": [sbml_file_path],
|
|
119
|
+
"dic_simulated_data": [dic_simulated_data],
|
|
120
|
+
"model_as_string": [basico.model_io.save_model_to_string()],
|
|
121
|
+
}.items():
|
|
122
|
+
if value:
|
|
123
|
+
dic_updated_state_for_model[key] = value
|
|
124
|
+
# Return the updated state of the tool
|
|
125
|
+
return Command(
|
|
126
|
+
update=dic_updated_state_for_model
|
|
127
|
+
| {
|
|
128
|
+
# update the message history
|
|
129
|
+
"messages": [
|
|
130
|
+
ToolMessage(
|
|
131
|
+
content=f"Simulation results of {arg_data.experiment_name}",
|
|
132
|
+
tool_call_id=tool_call_id,
|
|
133
|
+
artifact=get_model_units(model_object),
|
|
134
|
+
)
|
|
135
|
+
],
|
|
136
|
+
}
|
|
137
|
+
)
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
Tool for parameter scan.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import logging
|
|
8
|
+
from typing import Annotated
|
|
9
|
+
|
|
10
|
+
import basico
|
|
11
|
+
from langchain_core.messages import ToolMessage
|
|
12
|
+
from langchain_core.tools import BaseTool
|
|
13
|
+
from langchain_core.tools.base import InjectedToolCallId
|
|
14
|
+
from langgraph.prebuilt import InjectedState
|
|
15
|
+
from langgraph.types import Command
|
|
16
|
+
from pydantic import BaseModel, Field
|
|
17
|
+
|
|
18
|
+
from .load_arguments import ArgumentData, add_rec_events
|
|
19
|
+
from .load_biomodel import ModelData, load_biomodel
|
|
20
|
+
|
|
21
|
+
# Initialize logger
|
|
22
|
+
logging.basicConfig(level=logging.INFO)
|
|
23
|
+
logger = logging.getLogger(__name__)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def run_steady_state(model_object, dic_species_to_be_analyzed_before_experiment):
|
|
27
|
+
"""
|
|
28
|
+
Run the steady state analysis.
|
|
29
|
+
|
|
30
|
+
Args:
|
|
31
|
+
model_object: The model object.
|
|
32
|
+
dic_species_to_be_analyzed_before_experiment: Dictionary of species data.
|
|
33
|
+
|
|
34
|
+
Returns:
|
|
35
|
+
DataFrame: The results of the steady state analysis.
|
|
36
|
+
"""
|
|
37
|
+
# Update the fixed model species and parameters
|
|
38
|
+
# These are the initial conditions of the model
|
|
39
|
+
# set by the user
|
|
40
|
+
model_object.update_parameters(dic_species_to_be_analyzed_before_experiment)
|
|
41
|
+
logger.log(logging.INFO, "Running steady state analysis")
|
|
42
|
+
# Run the steady state analysis
|
|
43
|
+
output = basico.task_steadystate.run_steadystate(model=model_object.copasi_model)
|
|
44
|
+
if output == 0:
|
|
45
|
+
logger.error("Steady state analysis failed")
|
|
46
|
+
raise ValueError("A steady state was not found")
|
|
47
|
+
logger.log(logging.INFO, "Steady state analysis successful")
|
|
48
|
+
# Store the steady state results in a DataFrame
|
|
49
|
+
df_steady_state = basico.model_info.get_species(model=model_object.copasi_model).reset_index()
|
|
50
|
+
# print (df_steady_state)
|
|
51
|
+
# Rename the column name to species_name
|
|
52
|
+
df_steady_state.rename(columns={"name": "species_name"}, inplace=True)
|
|
53
|
+
# Rename the column concentration to steady_state_concentration
|
|
54
|
+
df_steady_state.rename(columns={"concentration": "steady_state_concentration"}, inplace=True)
|
|
55
|
+
# Rename the column transition_time to steady_state_transition_time
|
|
56
|
+
df_steady_state.rename(
|
|
57
|
+
columns={"transition_time": "steady_state_transition_time"}, inplace=True
|
|
58
|
+
)
|
|
59
|
+
# Drop some columns
|
|
60
|
+
df_steady_state.drop(
|
|
61
|
+
columns=[
|
|
62
|
+
"initial_particle_number",
|
|
63
|
+
"initial_expression",
|
|
64
|
+
"expression",
|
|
65
|
+
"particle_number",
|
|
66
|
+
"type",
|
|
67
|
+
"particle_number_rate",
|
|
68
|
+
"key",
|
|
69
|
+
"sbml_id",
|
|
70
|
+
"display_name",
|
|
71
|
+
],
|
|
72
|
+
inplace=True,
|
|
73
|
+
)
|
|
74
|
+
logger.log(logging.INFO, "Steady state results with shape %s", df_steady_state.shape)
|
|
75
|
+
return df_steady_state
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
class SteadyStateInput(BaseModel):
|
|
79
|
+
"""
|
|
80
|
+
Input schema for the steady state tool.
|
|
81
|
+
"""
|
|
82
|
+
|
|
83
|
+
sys_bio_model: ModelData = Field(description="model data", default=None)
|
|
84
|
+
arg_data: ArgumentData = Field(
|
|
85
|
+
description="time, species, and reocurring data"
|
|
86
|
+
" that must be set before the steady state analysis"
|
|
87
|
+
" as well as the experiment name",
|
|
88
|
+
default=None,
|
|
89
|
+
)
|
|
90
|
+
tool_call_id: Annotated[str, InjectedToolCallId]
|
|
91
|
+
state: Annotated[dict, InjectedState]
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
# Note: It's important that every field has type hints. BaseTool is a
|
|
95
|
+
# Pydantic class and not having type hints can lead to unexpected behavior.
|
|
96
|
+
class SteadyStateTool(BaseTool):
|
|
97
|
+
"""
|
|
98
|
+
Tool to bring a model to steady state.
|
|
99
|
+
"""
|
|
100
|
+
|
|
101
|
+
name: str = "steady_state"
|
|
102
|
+
description: str = "A tool to bring a model to steady state."
|
|
103
|
+
args_schema: type[BaseModel] = SteadyStateInput
|
|
104
|
+
|
|
105
|
+
def _run(
|
|
106
|
+
self,
|
|
107
|
+
tool_call_id: Annotated[str, InjectedToolCallId],
|
|
108
|
+
state: Annotated[dict, InjectedState],
|
|
109
|
+
sys_bio_model: ModelData = None,
|
|
110
|
+
arg_data: ArgumentData = None,
|
|
111
|
+
) -> Command:
|
|
112
|
+
"""
|
|
113
|
+
Run the tool.
|
|
114
|
+
|
|
115
|
+
Args:
|
|
116
|
+
tool_call_id (str): The tool call ID. This is injected by the system.
|
|
117
|
+
state (dict): The state of the tool.
|
|
118
|
+
sys_bio_model (ModelData): The model data.
|
|
119
|
+
arg_data (ArgumentData): The argument data.
|
|
120
|
+
|
|
121
|
+
Returns:
|
|
122
|
+
Command: The updated state of the tool.
|
|
123
|
+
"""
|
|
124
|
+
logger.log(
|
|
125
|
+
logging.INFO,
|
|
126
|
+
"Calling the steady_state tool %s, %s",
|
|
127
|
+
sys_bio_model,
|
|
128
|
+
arg_data,
|
|
129
|
+
)
|
|
130
|
+
# print (f'Calling steady_state tool {sys_bio_model}, {arg_data}, {tool_call_id}')
|
|
131
|
+
sbml_file_path = state["sbml_file_path"][-1] if len(state["sbml_file_path"]) > 0 else None
|
|
132
|
+
model_object = load_biomodel(sys_bio_model, sbml_file_path=sbml_file_path)
|
|
133
|
+
# Prepare the dictionary of species data
|
|
134
|
+
# that will be passed to the simulate method
|
|
135
|
+
# of the BasicoModel class
|
|
136
|
+
dic_species_to_be_analyzed_before_experiment = {}
|
|
137
|
+
if arg_data:
|
|
138
|
+
# Prepare the dictionary of species data
|
|
139
|
+
if arg_data.species_to_be_analyzed_before_experiment is not None:
|
|
140
|
+
dic_species_to_be_analyzed_before_experiment = dict(
|
|
141
|
+
zip(
|
|
142
|
+
arg_data.species_to_be_analyzed_before_experiment.species_name,
|
|
143
|
+
arg_data.species_to_be_analyzed_before_experiment.species_concentration,
|
|
144
|
+
strict=False,
|
|
145
|
+
)
|
|
146
|
+
)
|
|
147
|
+
# Add reocurring events (if any) to the model
|
|
148
|
+
if arg_data.reocurring_data is not None:
|
|
149
|
+
add_rec_events(model_object, arg_data.reocurring_data)
|
|
150
|
+
# Run the parameter scan
|
|
151
|
+
df_steady_state = run_steady_state(
|
|
152
|
+
model_object, dic_species_to_be_analyzed_before_experiment
|
|
153
|
+
)
|
|
154
|
+
print(df_steady_state)
|
|
155
|
+
# Prepare the dictionary of scanned data
|
|
156
|
+
# that will be passed to the state of the graph
|
|
157
|
+
dic_steady_state_data = {
|
|
158
|
+
"name": arg_data.experiment_name,
|
|
159
|
+
"source": (sys_bio_model.biomodel_id if sys_bio_model.biomodel_id else "upload"),
|
|
160
|
+
"tool_call_id": tool_call_id,
|
|
161
|
+
"data": df_steady_state.to_dict(orient="records"),
|
|
162
|
+
}
|
|
163
|
+
# Prepare the dictionary of updated state for the model
|
|
164
|
+
dic_updated_state_for_model = {}
|
|
165
|
+
for key, value in {
|
|
166
|
+
"model_id": [sys_bio_model.biomodel_id],
|
|
167
|
+
"sbml_file_path": [sbml_file_path],
|
|
168
|
+
"dic_steady_state_data": [dic_steady_state_data],
|
|
169
|
+
}.items():
|
|
170
|
+
if value:
|
|
171
|
+
dic_updated_state_for_model[key] = value
|
|
172
|
+
# Return the updated state
|
|
173
|
+
return Command(
|
|
174
|
+
update=dic_updated_state_for_model
|
|
175
|
+
| {
|
|
176
|
+
# Update the message history
|
|
177
|
+
"messages": [
|
|
178
|
+
ToolMessage(
|
|
179
|
+
content=f"Steady state analysis of"
|
|
180
|
+
f" {arg_data.experiment_name}"
|
|
181
|
+
" was successful.",
|
|
182
|
+
tool_call_id=tool_call_id,
|
|
183
|
+
artifact={"dic_data": df_steady_state.to_dict(orient="records")},
|
|
184
|
+
)
|
|
185
|
+
],
|
|
186
|
+
}
|
|
187
|
+
)
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
Utility functions for T2B tools.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import basico
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def get_model_units(model_object):
|
|
11
|
+
"""
|
|
12
|
+
Get the units of the model.
|
|
13
|
+
|
|
14
|
+
Args:
|
|
15
|
+
model_object: The model object.
|
|
16
|
+
|
|
17
|
+
Returns:
|
|
18
|
+
dict: The units of the model.
|
|
19
|
+
"""
|
|
20
|
+
model_units = basico.model_info.get_model_units(model=model_object.copasi_model)
|
|
21
|
+
model_units_y = model_units["quantity_unit"]
|
|
22
|
+
model_units_x = model_units["time_unit"]
|
|
23
|
+
return {"y_axis_label": model_units_y, "x_axis_label": model_units_x}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Please check out the README file in the root folder for more information.
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# /usr/bin/env python3
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
This is the agent file for the Talk2Cells graph.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import logging
|
|
8
|
+
import os
|
|
9
|
+
|
|
10
|
+
from langchain_openai import ChatOpenAI
|
|
11
|
+
from langgraph.checkpoint.memory import MemorySaver
|
|
12
|
+
from langgraph.graph import START, StateGraph
|
|
13
|
+
from langgraph.prebuilt import ToolNode, create_react_agent
|
|
14
|
+
|
|
15
|
+
from ..states.state_talk2cells import Talk2Cells
|
|
16
|
+
from ..tools.scp_agent.display_studies import display_studies
|
|
17
|
+
from ..tools.scp_agent.search_studies import search_studies
|
|
18
|
+
|
|
19
|
+
# Initialize logger
|
|
20
|
+
logging.basicConfig(level=logging.INFO)
|
|
21
|
+
logger = logging.getLogger(__name__)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def get_app(uniq_id):
|
|
25
|
+
"""
|
|
26
|
+
This function returns the langraph app.
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
def agent_scp_node(state: Talk2Cells):
|
|
30
|
+
"""
|
|
31
|
+
This function calls the model.
|
|
32
|
+
"""
|
|
33
|
+
logger.log(logging.INFO, "Creating SCP_Agent node with thread_id %s", uniq_id)
|
|
34
|
+
# Get the messages from the state
|
|
35
|
+
# messages = state['messages']
|
|
36
|
+
# Call the model
|
|
37
|
+
# inputs = {'messages': messages}
|
|
38
|
+
response = model.invoke(state, {"configurable": {"thread_id": uniq_id}})
|
|
39
|
+
# The response is a list of messages and may contain `tool calls`
|
|
40
|
+
# We return a list, because this will get added to the existing list
|
|
41
|
+
# return {"messages": [response]}
|
|
42
|
+
return response
|
|
43
|
+
|
|
44
|
+
# Define the tools
|
|
45
|
+
# tools = [search_studies, display_studies]
|
|
46
|
+
tools = ToolNode([search_studies, display_studies])
|
|
47
|
+
|
|
48
|
+
# Create the LLM
|
|
49
|
+
# And bind the tools to it
|
|
50
|
+
# model = ChatOpenAI(model="gpt-4o-mini", temperature=0).bind_tools(tools)
|
|
51
|
+
|
|
52
|
+
# Create an environment variable to store the LLM model
|
|
53
|
+
# Check if the environment variable AIAGENTS4PHARMA_LLM_MODEL is set
|
|
54
|
+
# If not, set it to 'gpt-4o-mini'
|
|
55
|
+
llm_model = os.getenv("AIAGENTS4PHARMA_LLM_MODEL", "gpt-4o-mini")
|
|
56
|
+
# print (f'LLM model: {llm_model}')
|
|
57
|
+
# llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
|
|
58
|
+
llm = ChatOpenAI(model=llm_model, temperature=0)
|
|
59
|
+
model = create_react_agent(
|
|
60
|
+
llm,
|
|
61
|
+
tools=tools,
|
|
62
|
+
state_schema=Talk2Cells,
|
|
63
|
+
state_modifier=("You are Talk2Cells agent."),
|
|
64
|
+
checkpointer=MemorySaver(),
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
# Define a new graph
|
|
68
|
+
workflow = StateGraph(Talk2Cells)
|
|
69
|
+
|
|
70
|
+
# Define the two nodes we will cycle between
|
|
71
|
+
workflow.add_node("agent_scp", agent_scp_node)
|
|
72
|
+
|
|
73
|
+
# Set the entrypoint as `agent`
|
|
74
|
+
# This means that this node is the first one called
|
|
75
|
+
workflow.add_edge(START, "agent_scp")
|
|
76
|
+
|
|
77
|
+
# Initialize memory to persist state between graph runs
|
|
78
|
+
checkpointer = MemorySaver()
|
|
79
|
+
|
|
80
|
+
# Finally, we compile it!
|
|
81
|
+
# This compiles it into a LangChain Runnable,
|
|
82
|
+
# meaning you can use it as you would any other runnable.
|
|
83
|
+
# Note that we're (optionally) passing the memory when compiling the graph
|
|
84
|
+
app = workflow.compile(checkpointer=checkpointer)
|
|
85
|
+
logger.log(logging.INFO, "Compiled the graph")
|
|
86
|
+
|
|
87
|
+
return app
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
This is the state file for the Talk2Cells agent.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from langgraph.prebuilt.chat_agent_executor import AgentState
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class Talk2Cells(AgentState):
|
|
11
|
+
"""
|
|
12
|
+
The state for the Talk2Cells agent.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
search_table: str
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Test cases for the search_studies
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
# from ..tools.search_studies import search_studies
|
|
6
|
+
from langchain_core.messages import HumanMessage
|
|
7
|
+
|
|
8
|
+
from aiagents4pharma.talk2cells.agents.scp_agent import get_app
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def test_agent_scp():
|
|
12
|
+
"""
|
|
13
|
+
Test the agent_scp.
|
|
14
|
+
"""
|
|
15
|
+
unique_id = 12345
|
|
16
|
+
app = get_app(unique_id)
|
|
17
|
+
config = {"configurable": {"thread_id": unique_id}}
|
|
18
|
+
prompt = "Search for studies on Crohns Disease."
|
|
19
|
+
response = app.invoke({"messages": [HumanMessage(content=prompt)]}, config=config)
|
|
20
|
+
assistant_msg = response["messages"][-1].content
|
|
21
|
+
# Check if the assistant message is a string
|
|
22
|
+
assert isinstance(assistant_msg, str)
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
This tool is used to display the table of studies.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import logging
|
|
8
|
+
from typing import Annotated
|
|
9
|
+
|
|
10
|
+
from langchain_core.tools import tool
|
|
11
|
+
from langgraph.prebuilt import InjectedState
|
|
12
|
+
|
|
13
|
+
# Initialize logger
|
|
14
|
+
logging.basicConfig(level=logging.INFO)
|
|
15
|
+
logger = logging.getLogger(__name__)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@tool("display_studies")
|
|
19
|
+
def display_studies(state: Annotated[dict, InjectedState]):
|
|
20
|
+
"""
|
|
21
|
+
Display the table of studies.
|
|
22
|
+
|
|
23
|
+
Args:
|
|
24
|
+
state (dict): The state of the agent.
|
|
25
|
+
"""
|
|
26
|
+
logger.log(logging.INFO, "Calling the tool display_studies")
|
|
27
|
+
return state["search_table"]
|