aiagents4pharma 1.43.0__py3-none-any.whl → 1.45.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- aiagents4pharma/__init__.py +2 -2
- aiagents4pharma/talk2aiagents4pharma/.dockerignore +13 -0
- aiagents4pharma/talk2aiagents4pharma/Dockerfile +105 -0
- aiagents4pharma/talk2aiagents4pharma/README.md +1 -0
- aiagents4pharma/talk2aiagents4pharma/__init__.py +4 -5
- aiagents4pharma/talk2aiagents4pharma/agents/__init__.py +3 -2
- aiagents4pharma/talk2aiagents4pharma/agents/main_agent.py +24 -23
- aiagents4pharma/talk2aiagents4pharma/configs/__init__.py +2 -2
- aiagents4pharma/talk2aiagents4pharma/configs/agents/__init__.py +2 -2
- aiagents4pharma/talk2aiagents4pharma/configs/agents/main_agent/default.yaml +2 -2
- aiagents4pharma/talk2aiagents4pharma/configs/config.yaml +1 -1
- aiagents4pharma/talk2aiagents4pharma/docker-compose/cpu/.env.example +23 -0
- aiagents4pharma/talk2aiagents4pharma/docker-compose/cpu/docker-compose.yml +93 -0
- aiagents4pharma/talk2aiagents4pharma/docker-compose/gpu/.env.example +23 -0
- aiagents4pharma/talk2aiagents4pharma/docker-compose/gpu/docker-compose.yml +108 -0
- aiagents4pharma/talk2aiagents4pharma/install.md +127 -0
- aiagents4pharma/talk2aiagents4pharma/states/__init__.py +3 -2
- aiagents4pharma/talk2aiagents4pharma/states/state_talk2aiagents4pharma.py +5 -3
- aiagents4pharma/talk2aiagents4pharma/tests/__init__.py +2 -2
- aiagents4pharma/talk2aiagents4pharma/tests/test_main_agent.py +72 -50
- aiagents4pharma/talk2biomodels/.dockerignore +13 -0
- aiagents4pharma/talk2biomodels/Dockerfile +104 -0
- aiagents4pharma/talk2biomodels/README.md +1 -0
- aiagents4pharma/talk2biomodels/__init__.py +4 -8
- aiagents4pharma/talk2biomodels/agents/__init__.py +3 -2
- aiagents4pharma/talk2biomodels/agents/t2b_agent.py +47 -42
- aiagents4pharma/talk2biomodels/api/__init__.py +4 -5
- aiagents4pharma/talk2biomodels/api/kegg.py +14 -10
- aiagents4pharma/talk2biomodels/api/ols.py +13 -10
- aiagents4pharma/talk2biomodels/api/uniprot.py +7 -6
- aiagents4pharma/talk2biomodels/configs/__init__.py +3 -4
- aiagents4pharma/talk2biomodels/configs/agents/__init__.py +2 -2
- aiagents4pharma/talk2biomodels/configs/agents/t2b_agent/__init__.py +2 -2
- aiagents4pharma/talk2biomodels/configs/agents/t2b_agent/default.yaml +1 -1
- aiagents4pharma/talk2biomodels/configs/config.yaml +1 -1
- aiagents4pharma/talk2biomodels/configs/tools/__init__.py +4 -5
- aiagents4pharma/talk2biomodels/configs/tools/ask_question/__init__.py +2 -2
- aiagents4pharma/talk2biomodels/configs/tools/ask_question/default.yaml +1 -2
- aiagents4pharma/talk2biomodels/configs/tools/custom_plotter/__init__.py +2 -2
- aiagents4pharma/talk2biomodels/configs/tools/custom_plotter/default.yaml +1 -1
- aiagents4pharma/talk2biomodels/configs/tools/get_annotation/__init__.py +2 -2
- aiagents4pharma/talk2biomodels/configs/tools/get_annotation/default.yaml +1 -1
- aiagents4pharma/talk2biomodels/install.md +63 -0
- aiagents4pharma/talk2biomodels/models/__init__.py +4 -4
- aiagents4pharma/talk2biomodels/models/basico_model.py +36 -28
- aiagents4pharma/talk2biomodels/models/sys_bio_model.py +13 -10
- aiagents4pharma/talk2biomodels/states/__init__.py +3 -2
- aiagents4pharma/talk2biomodels/states/state_talk2biomodels.py +12 -8
- aiagents4pharma/talk2biomodels/tests/BIOMD0000000449_url.xml +1585 -0
- aiagents4pharma/talk2biomodels/tests/__init__.py +2 -2
- aiagents4pharma/talk2biomodels/tests/article_on_model_537.pdf +0 -0
- aiagents4pharma/talk2biomodels/tests/test_api.py +18 -14
- aiagents4pharma/talk2biomodels/tests/test_ask_question.py +8 -9
- aiagents4pharma/talk2biomodels/tests/test_basico_model.py +15 -9
- aiagents4pharma/talk2biomodels/tests/test_get_annotation.py +54 -55
- aiagents4pharma/talk2biomodels/tests/test_getmodelinfo.py +28 -27
- aiagents4pharma/talk2biomodels/tests/test_integration.py +21 -33
- aiagents4pharma/talk2biomodels/tests/test_load_biomodel.py +14 -11
- aiagents4pharma/talk2biomodels/tests/test_param_scan.py +21 -20
- aiagents4pharma/talk2biomodels/tests/test_query_article.py +129 -29
- aiagents4pharma/talk2biomodels/tests/test_search_models.py +9 -13
- aiagents4pharma/talk2biomodels/tests/test_simulate_model.py +16 -15
- aiagents4pharma/talk2biomodels/tests/test_steady_state.py +12 -22
- aiagents4pharma/talk2biomodels/tests/test_sys_bio_model.py +33 -29
- aiagents4pharma/talk2biomodels/tools/__init__.py +15 -12
- aiagents4pharma/talk2biomodels/tools/ask_question.py +42 -32
- aiagents4pharma/talk2biomodels/tools/custom_plotter.py +51 -43
- aiagents4pharma/talk2biomodels/tools/get_annotation.py +99 -75
- aiagents4pharma/talk2biomodels/tools/get_modelinfo.py +57 -51
- aiagents4pharma/talk2biomodels/tools/load_arguments.py +52 -32
- aiagents4pharma/talk2biomodels/tools/load_biomodel.py +8 -2
- aiagents4pharma/talk2biomodels/tools/parameter_scan.py +107 -90
- aiagents4pharma/talk2biomodels/tools/query_article.py +14 -13
- aiagents4pharma/talk2biomodels/tools/search_models.py +37 -26
- aiagents4pharma/talk2biomodels/tools/simulate_model.py +47 -37
- aiagents4pharma/talk2biomodels/tools/steady_state.py +76 -58
- aiagents4pharma/talk2biomodels/tools/utils.py +4 -3
- aiagents4pharma/talk2cells/README.md +1 -0
- aiagents4pharma/talk2cells/__init__.py +4 -5
- aiagents4pharma/talk2cells/agents/__init__.py +3 -2
- aiagents4pharma/talk2cells/agents/scp_agent.py +21 -19
- aiagents4pharma/talk2cells/states/__init__.py +3 -2
- aiagents4pharma/talk2cells/states/state_talk2cells.py +4 -2
- aiagents4pharma/talk2cells/tests/scp_agent/test_scp_agent.py +8 -9
- aiagents4pharma/talk2cells/tools/__init__.py +3 -2
- aiagents4pharma/talk2cells/tools/scp_agent/__init__.py +4 -4
- aiagents4pharma/talk2cells/tools/scp_agent/display_studies.py +5 -3
- aiagents4pharma/talk2cells/tools/scp_agent/search_studies.py +21 -22
- aiagents4pharma/talk2knowledgegraphs/.dockerignore +13 -0
- aiagents4pharma/talk2knowledgegraphs/Dockerfile +103 -0
- aiagents4pharma/talk2knowledgegraphs/README.md +1 -0
- aiagents4pharma/talk2knowledgegraphs/__init__.py +4 -7
- aiagents4pharma/talk2knowledgegraphs/agents/__init__.py +3 -2
- aiagents4pharma/talk2knowledgegraphs/agents/t2kg_agent.py +40 -30
- aiagents4pharma/talk2knowledgegraphs/configs/__init__.py +3 -6
- aiagents4pharma/talk2knowledgegraphs/configs/agents/t2kg_agent/__init__.py +2 -2
- aiagents4pharma/talk2knowledgegraphs/configs/agents/t2kg_agent/default.yaml +8 -8
- aiagents4pharma/talk2knowledgegraphs/configs/app/__init__.py +3 -2
- aiagents4pharma/talk2knowledgegraphs/configs/app/frontend/__init__.py +2 -2
- aiagents4pharma/talk2knowledgegraphs/configs/app/frontend/default.yaml +1 -1
- aiagents4pharma/talk2knowledgegraphs/configs/config.yaml +1 -1
- aiagents4pharma/talk2knowledgegraphs/configs/tools/__init__.py +4 -5
- aiagents4pharma/talk2knowledgegraphs/configs/tools/graphrag_reasoning/__init__.py +2 -2
- aiagents4pharma/talk2knowledgegraphs/configs/tools/graphrag_reasoning/default.yaml +1 -1
- aiagents4pharma/talk2knowledgegraphs/configs/tools/multimodal_subgraph_extraction/default.yaml +17 -2
- aiagents4pharma/talk2knowledgegraphs/configs/tools/subgraph_extraction/__init__.py +2 -2
- aiagents4pharma/talk2knowledgegraphs/configs/tools/subgraph_extraction/default.yaml +1 -1
- aiagents4pharma/talk2knowledgegraphs/configs/tools/subgraph_summarization/__init__.py +2 -2
- aiagents4pharma/talk2knowledgegraphs/configs/tools/subgraph_summarization/default.yaml +1 -1
- aiagents4pharma/talk2knowledgegraphs/configs/utils/enrichments/ols_terms/default.yaml +1 -1
- aiagents4pharma/talk2knowledgegraphs/configs/utils/enrichments/reactome_pathways/default.yaml +1 -1
- aiagents4pharma/talk2knowledgegraphs/configs/utils/enrichments/uniprot_proteins/default.yaml +1 -1
- aiagents4pharma/talk2knowledgegraphs/configs/utils/pubchem_utils/default.yaml +1 -1
- aiagents4pharma/talk2knowledgegraphs/datasets/__init__.py +4 -6
- aiagents4pharma/talk2knowledgegraphs/datasets/biobridge_primekg.py +115 -67
- aiagents4pharma/talk2knowledgegraphs/datasets/dataset.py +2 -0
- aiagents4pharma/talk2knowledgegraphs/datasets/primekg.py +35 -24
- aiagents4pharma/talk2knowledgegraphs/datasets/starkqa_primekg.py +29 -21
- aiagents4pharma/talk2knowledgegraphs/docker-compose/cpu/.env.example +23 -0
- aiagents4pharma/talk2knowledgegraphs/docker-compose/cpu/docker-compose.yml +93 -0
- aiagents4pharma/talk2knowledgegraphs/docker-compose/gpu/.env.example +23 -0
- aiagents4pharma/talk2knowledgegraphs/docker-compose/gpu/docker-compose.yml +108 -0
- aiagents4pharma/talk2knowledgegraphs/entrypoint.sh +190 -0
- aiagents4pharma/talk2knowledgegraphs/install.md +140 -0
- aiagents4pharma/talk2knowledgegraphs/milvus_data_dump.py +31 -65
- aiagents4pharma/talk2knowledgegraphs/states/__init__.py +3 -2
- aiagents4pharma/talk2knowledgegraphs/states/state_talk2knowledgegraphs.py +1 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_agents_t2kg_agent.py +65 -40
- aiagents4pharma/talk2knowledgegraphs/tests/test_datasets_biobridge_primekg.py +54 -48
- aiagents4pharma/talk2knowledgegraphs/tests/test_datasets_dataset.py +4 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_datasets_primekg.py +17 -4
- aiagents4pharma/talk2knowledgegraphs/tests/test_datasets_starkqa_primekg.py +33 -24
- aiagents4pharma/talk2knowledgegraphs/tests/test_tools_graphrag_reasoning.py +116 -69
- aiagents4pharma/talk2knowledgegraphs/tests/test_tools_milvus_multimodal_subgraph_extraction.py +736 -413
- aiagents4pharma/talk2knowledgegraphs/tests/test_tools_multimodal_subgraph_extraction.py +22 -15
- aiagents4pharma/talk2knowledgegraphs/tests/test_tools_subgraph_extraction.py +19 -12
- aiagents4pharma/talk2knowledgegraphs/tests/test_tools_subgraph_summarization.py +95 -48
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_embeddings_embeddings.py +4 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_embeddings_huggingface.py +5 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_embeddings_nim_molmim.py +13 -18
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_embeddings_ollama.py +10 -3
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_enrichments.py +4 -3
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_ollama.py +3 -2
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_ols.py +1 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_pubchem.py +9 -4
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_reactome.py +6 -6
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_uniprot.py +4 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_extractions_milvus_multimodal_pcst.py +442 -42
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_kg_utils.py +3 -4
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_pubchem_utils.py +10 -6
- aiagents4pharma/talk2knowledgegraphs/tools/__init__.py +10 -7
- aiagents4pharma/talk2knowledgegraphs/tools/graphrag_reasoning.py +15 -20
- aiagents4pharma/talk2knowledgegraphs/tools/milvus_multimodal_subgraph_extraction.py +245 -205
- aiagents4pharma/talk2knowledgegraphs/tools/multimodal_subgraph_extraction.py +92 -90
- aiagents4pharma/talk2knowledgegraphs/tools/subgraph_extraction.py +25 -37
- aiagents4pharma/talk2knowledgegraphs/tools/subgraph_summarization.py +10 -13
- aiagents4pharma/talk2knowledgegraphs/utils/__init__.py +4 -7
- aiagents4pharma/talk2knowledgegraphs/utils/embeddings/__init__.py +4 -7
- aiagents4pharma/talk2knowledgegraphs/utils/embeddings/embeddings.py +4 -0
- aiagents4pharma/talk2knowledgegraphs/utils/embeddings/huggingface.py +11 -14
- aiagents4pharma/talk2knowledgegraphs/utils/embeddings/nim_molmim.py +7 -7
- aiagents4pharma/talk2knowledgegraphs/utils/embeddings/ollama.py +12 -6
- aiagents4pharma/talk2knowledgegraphs/utils/embeddings/sentence_transformer.py +8 -6
- aiagents4pharma/talk2knowledgegraphs/utils/enrichments/__init__.py +9 -6
- aiagents4pharma/talk2knowledgegraphs/utils/enrichments/enrichments.py +1 -0
- aiagents4pharma/talk2knowledgegraphs/utils/enrichments/ollama.py +15 -9
- aiagents4pharma/talk2knowledgegraphs/utils/enrichments/ols_terms.py +23 -20
- aiagents4pharma/talk2knowledgegraphs/utils/enrichments/pubchem_strings.py +12 -10
- aiagents4pharma/talk2knowledgegraphs/utils/enrichments/reactome_pathways.py +16 -10
- aiagents4pharma/talk2knowledgegraphs/utils/enrichments/uniprot_proteins.py +26 -18
- aiagents4pharma/talk2knowledgegraphs/utils/extractions/__init__.py +4 -5
- aiagents4pharma/talk2knowledgegraphs/utils/extractions/milvus_multimodal_pcst.py +218 -81
- aiagents4pharma/talk2knowledgegraphs/utils/extractions/multimodal_pcst.py +53 -47
- aiagents4pharma/talk2knowledgegraphs/utils/extractions/pcst.py +18 -14
- aiagents4pharma/talk2knowledgegraphs/utils/kg_utils.py +22 -23
- aiagents4pharma/talk2knowledgegraphs/utils/pubchem_utils.py +11 -10
- aiagents4pharma/talk2scholars/.dockerignore +13 -0
- aiagents4pharma/talk2scholars/Dockerfile +104 -0
- aiagents4pharma/talk2scholars/README.md +1 -0
- aiagents4pharma/talk2scholars/agents/__init__.py +1 -5
- aiagents4pharma/talk2scholars/agents/main_agent.py +6 -4
- aiagents4pharma/talk2scholars/agents/paper_download_agent.py +5 -4
- aiagents4pharma/talk2scholars/agents/pdf_agent.py +4 -2
- aiagents4pharma/talk2scholars/agents/s2_agent.py +2 -2
- aiagents4pharma/talk2scholars/agents/zotero_agent.py +10 -11
- aiagents4pharma/talk2scholars/configs/__init__.py +1 -3
- aiagents4pharma/talk2scholars/configs/agents/talk2scholars/__init__.py +1 -4
- aiagents4pharma/talk2scholars/configs/agents/talk2scholars/main_agent/default.yaml +1 -1
- aiagents4pharma/talk2scholars/configs/agents/talk2scholars/pdf_agent/default.yaml +1 -1
- aiagents4pharma/talk2scholars/configs/agents/talk2scholars/s2_agent/default.yaml +8 -8
- aiagents4pharma/talk2scholars/configs/agents/talk2scholars/zotero_agent/default.yaml +7 -7
- aiagents4pharma/talk2scholars/configs/tools/__init__.py +8 -6
- aiagents4pharma/talk2scholars/docker-compose/cpu/.env.example +21 -0
- aiagents4pharma/talk2scholars/docker-compose/cpu/docker-compose.yml +90 -0
- aiagents4pharma/talk2scholars/docker-compose/gpu/.env.example +21 -0
- aiagents4pharma/talk2scholars/docker-compose/gpu/docker-compose.yml +105 -0
- aiagents4pharma/talk2scholars/install.md +122 -0
- aiagents4pharma/talk2scholars/state/state_talk2scholars.py +8 -8
- aiagents4pharma/talk2scholars/tests/{test_main_agent.py → test_agents_main_agent.py} +41 -23
- aiagents4pharma/talk2scholars/tests/{test_paper_download_agent.py → test_agents_paper_agents_download_agent.py} +10 -16
- aiagents4pharma/talk2scholars/tests/{test_pdf_agent.py → test_agents_pdf_agent.py} +6 -10
- aiagents4pharma/talk2scholars/tests/{test_s2_agent.py → test_agents_s2_agent.py} +8 -16
- aiagents4pharma/talk2scholars/tests/{test_zotero_agent.py → test_agents_zotero_agent.py} +5 -7
- aiagents4pharma/talk2scholars/tests/{test_s2_display_dataframe.py → test_s2_tools_display_dataframe.py} +6 -7
- aiagents4pharma/talk2scholars/tests/{test_s2_query_dataframe.py → test_s2_tools_query_dataframe.py} +5 -15
- aiagents4pharma/talk2scholars/tests/{test_paper_downloader.py → test_tools_paper_downloader.py} +25 -63
- aiagents4pharma/talk2scholars/tests/{test_question_and_answer_tool.py → test_tools_question_and_answer_tool.py} +2 -6
- aiagents4pharma/talk2scholars/tests/{test_s2_multi.py → test_tools_s2_multi.py} +5 -5
- aiagents4pharma/talk2scholars/tests/{test_s2_retrieve.py → test_tools_s2_retrieve.py} +2 -1
- aiagents4pharma/talk2scholars/tests/{test_s2_search.py → test_tools_s2_search.py} +5 -5
- aiagents4pharma/talk2scholars/tests/{test_s2_single.py → test_tools_s2_single.py} +5 -5
- aiagents4pharma/talk2scholars/tests/{test_arxiv_downloader.py → test_utils_arxiv_downloader.py} +16 -25
- aiagents4pharma/talk2scholars/tests/{test_base_paper_downloader.py → test_utils_base_paper_downloader.py} +25 -47
- aiagents4pharma/talk2scholars/tests/{test_biorxiv_downloader.py → test_utils_biorxiv_downloader.py} +14 -42
- aiagents4pharma/talk2scholars/tests/{test_medrxiv_downloader.py → test_utils_medrxiv_downloader.py} +15 -49
- aiagents4pharma/talk2scholars/tests/{test_nvidia_nim_reranker.py → test_utils_nvidia_nim_reranker.py} +6 -16
- aiagents4pharma/talk2scholars/tests/{test_pdf_answer_formatter.py → test_utils_pdf_answer_formatter.py} +1 -0
- aiagents4pharma/talk2scholars/tests/{test_pdf_batch_processor.py → test_utils_pdf_batch_processor.py} +6 -15
- aiagents4pharma/talk2scholars/tests/{test_pdf_collection_manager.py → test_utils_pdf_collection_manager.py} +34 -11
- aiagents4pharma/talk2scholars/tests/{test_pdf_document_processor.py → test_utils_pdf_document_processor.py} +2 -3
- aiagents4pharma/talk2scholars/tests/{test_pdf_generate_answer.py → test_utils_pdf_generate_answer.py} +3 -6
- aiagents4pharma/talk2scholars/tests/{test_pdf_gpu_detection.py → test_utils_pdf_gpu_detection.py} +5 -16
- aiagents4pharma/talk2scholars/tests/{test_pdf_rag_pipeline.py → test_utils_pdf_rag_pipeline.py} +7 -17
- aiagents4pharma/talk2scholars/tests/{test_pdf_retrieve_chunks.py → test_utils_pdf_retrieve_chunks.py} +4 -11
- aiagents4pharma/talk2scholars/tests/{test_pdf_singleton_manager.py → test_utils_pdf_singleton_manager.py} +26 -23
- aiagents4pharma/talk2scholars/tests/{test_pdf_vector_normalization.py → test_utils_pdf_vector_normalization.py} +1 -1
- aiagents4pharma/talk2scholars/tests/{test_pdf_vector_store.py → test_utils_pdf_vector_store.py} +27 -55
- aiagents4pharma/talk2scholars/tests/{test_pubmed_downloader.py → test_utils_pubmed_downloader.py} +31 -91
- aiagents4pharma/talk2scholars/tests/{test_read_helper_utils.py → test_utils_read_helper_utils.py} +2 -6
- aiagents4pharma/talk2scholars/tests/{test_s2_utils_ext_ids.py → test_utils_s2_utils_ext_ids.py} +5 -15
- aiagents4pharma/talk2scholars/tests/{test_zotero_human_in_the_loop.py → test_utils_zotero_human_in_the_loop.py} +6 -13
- aiagents4pharma/talk2scholars/tests/{test_zotero_path.py → test_utils_zotero_path.py} +53 -45
- aiagents4pharma/talk2scholars/tests/{test_zotero_read.py → test_utils_zotero_read.py} +30 -91
- aiagents4pharma/talk2scholars/tests/{test_zotero_write.py → test_utils_zotero_write.py} +6 -16
- aiagents4pharma/talk2scholars/tools/__init__.py +1 -4
- aiagents4pharma/talk2scholars/tools/paper_download/paper_downloader.py +20 -35
- aiagents4pharma/talk2scholars/tools/paper_download/utils/__init__.py +7 -5
- aiagents4pharma/talk2scholars/tools/paper_download/utils/arxiv_downloader.py +9 -11
- aiagents4pharma/talk2scholars/tools/paper_download/utils/base_paper_downloader.py +14 -21
- aiagents4pharma/talk2scholars/tools/paper_download/utils/biorxiv_downloader.py +14 -22
- aiagents4pharma/talk2scholars/tools/paper_download/utils/medrxiv_downloader.py +11 -13
- aiagents4pharma/talk2scholars/tools/paper_download/utils/pubmed_downloader.py +14 -28
- aiagents4pharma/talk2scholars/tools/pdf/question_and_answer.py +4 -8
- aiagents4pharma/talk2scholars/tools/pdf/utils/__init__.py +16 -14
- aiagents4pharma/talk2scholars/tools/pdf/utils/answer_formatter.py +4 -4
- aiagents4pharma/talk2scholars/tools/pdf/utils/batch_processor.py +15 -17
- aiagents4pharma/talk2scholars/tools/pdf/utils/collection_manager.py +2 -2
- aiagents4pharma/talk2scholars/tools/pdf/utils/document_processor.py +5 -5
- aiagents4pharma/talk2scholars/tools/pdf/utils/generate_answer.py +4 -4
- aiagents4pharma/talk2scholars/tools/pdf/utils/get_vectorstore.py +2 -6
- aiagents4pharma/talk2scholars/tools/pdf/utils/gpu_detection.py +5 -9
- aiagents4pharma/talk2scholars/tools/pdf/utils/nvidia_nim_reranker.py +4 -4
- aiagents4pharma/talk2scholars/tools/pdf/utils/paper_loader.py +2 -2
- aiagents4pharma/talk2scholars/tools/pdf/utils/rag_pipeline.py +6 -15
- aiagents4pharma/talk2scholars/tools/pdf/utils/retrieve_chunks.py +7 -15
- aiagents4pharma/talk2scholars/tools/pdf/utils/singleton_manager.py +2 -2
- aiagents4pharma/talk2scholars/tools/pdf/utils/tool_helper.py +3 -4
- aiagents4pharma/talk2scholars/tools/pdf/utils/vector_normalization.py +8 -17
- aiagents4pharma/talk2scholars/tools/pdf/utils/vector_store.py +17 -33
- aiagents4pharma/talk2scholars/tools/s2/__init__.py +8 -6
- aiagents4pharma/talk2scholars/tools/s2/display_dataframe.py +3 -7
- aiagents4pharma/talk2scholars/tools/s2/multi_paper_rec.py +7 -6
- aiagents4pharma/talk2scholars/tools/s2/query_dataframe.py +5 -12
- aiagents4pharma/talk2scholars/tools/s2/retrieve_semantic_scholar_paper_id.py +2 -4
- aiagents4pharma/talk2scholars/tools/s2/search.py +6 -6
- aiagents4pharma/talk2scholars/tools/s2/single_paper_rec.py +5 -3
- aiagents4pharma/talk2scholars/tools/s2/utils/__init__.py +1 -3
- aiagents4pharma/talk2scholars/tools/s2/utils/multi_helper.py +12 -18
- aiagents4pharma/talk2scholars/tools/s2/utils/search_helper.py +11 -18
- aiagents4pharma/talk2scholars/tools/s2/utils/single_helper.py +11 -16
- aiagents4pharma/talk2scholars/tools/zotero/__init__.py +1 -4
- aiagents4pharma/talk2scholars/tools/zotero/utils/__init__.py +1 -4
- aiagents4pharma/talk2scholars/tools/zotero/utils/read_helper.py +21 -39
- aiagents4pharma/talk2scholars/tools/zotero/utils/review_helper.py +2 -6
- aiagents4pharma/talk2scholars/tools/zotero/utils/write_helper.py +8 -11
- aiagents4pharma/talk2scholars/tools/zotero/utils/zotero_path.py +4 -12
- aiagents4pharma/talk2scholars/tools/zotero/utils/zotero_pdf_downloader.py +13 -27
- aiagents4pharma/talk2scholars/tools/zotero/zotero_read.py +4 -7
- aiagents4pharma/talk2scholars/tools/zotero/zotero_review.py +8 -10
- aiagents4pharma/talk2scholars/tools/zotero/zotero_write.py +3 -2
- {aiagents4pharma-1.43.0.dist-info → aiagents4pharma-1.45.0.dist-info}/METADATA +115 -50
- aiagents4pharma-1.45.0.dist-info/RECORD +324 -0
- {aiagents4pharma-1.43.0.dist-info → aiagents4pharma-1.45.0.dist-info}/WHEEL +1 -2
- aiagents4pharma-1.43.0.dist-info/RECORD +0 -293
- aiagents4pharma-1.43.0.dist-info/top_level.txt +0 -1
- /aiagents4pharma/talk2scholars/tests/{test_state.py → test_states_state.py} +0 -0
- /aiagents4pharma/talk2scholars/tests/{test_pdf_paper_loader.py → test_utils_pdf_paper_loader.py} +0 -0
- /aiagents4pharma/talk2scholars/tests/{test_tool_helper_utils.py → test_utils_tool_helper_utils.py} +0 -0
- /aiagents4pharma/talk2scholars/tests/{test_zotero_pdf_downloader_utils.py → test_utils_zotero_pdf_downloader_utils.py} +0 -0
- {aiagents4pharma-1.43.0.dist-info → aiagents4pharma-1.45.0.dist-info}/licenses/LICENSE +0 -0
@@ -1,33 +1,37 @@
|
|
1
1
|
#!/usr/bin/env python3
|
2
2
|
|
3
3
|
"""
|
4
|
-
This module contains the `GetAnnotationTool` for fetching species annotations
|
4
|
+
This module contains the `GetAnnotationTool` for fetching species annotations
|
5
5
|
based on the provided model and species names.
|
6
6
|
"""
|
7
|
-
|
8
|
-
from typing import List, Annotated, Type, Union, Literal
|
7
|
+
|
9
8
|
import logging
|
9
|
+
import math
|
10
10
|
from dataclasses import dataclass
|
11
|
-
import
|
12
|
-
|
11
|
+
from typing import Annotated, Literal
|
12
|
+
|
13
13
|
import basico
|
14
|
+
import hydra
|
14
15
|
import pandas as pd
|
15
|
-
from langgraph.types import Command
|
16
|
-
from langgraph.prebuilt import InjectedState
|
17
|
-
from langchain_core.tools.base import BaseTool
|
18
|
-
from langchain_core.tools.base import InjectedToolCallId
|
19
16
|
from langchain_core.messages import ToolMessage
|
17
|
+
from langchain_core.tools.base import BaseTool, InjectedToolCallId
|
18
|
+
from langgraph.prebuilt import InjectedState
|
19
|
+
from langgraph.types import Command
|
20
|
+
from pydantic import BaseModel, Field
|
21
|
+
|
22
|
+
from ..api.kegg import fetch_kegg_annotations
|
23
|
+
from ..api.ols import search_ols_labels
|
24
|
+
from ..api.uniprot import search_uniprot_labels
|
25
|
+
|
20
26
|
# from langchain_openai import ChatOpenAI
|
21
27
|
from .load_biomodel import ModelData, load_biomodel
|
22
|
-
from ..api.uniprot import search_uniprot_labels
|
23
|
-
from ..api.ols import search_ols_labels
|
24
|
-
from ..api.kegg import fetch_kegg_annotations
|
25
28
|
|
26
29
|
# Initialize logger
|
27
30
|
logging.basicConfig(level=logging.INFO)
|
28
31
|
logger = logging.getLogger(__name__)
|
29
32
|
|
30
|
-
ols_ontology_abbreviations = {
|
33
|
+
ols_ontology_abbreviations = {"pato", "chebi", "sbo", "fma", "pr", "go"}
|
34
|
+
|
31
35
|
|
32
36
|
def extract_relevant_species_names(model_object, arg_data, state):
|
33
37
|
"""
|
@@ -35,11 +39,12 @@ def extract_relevant_species_names(model_object, arg_data, state):
|
|
35
39
|
"""
|
36
40
|
# Load hydra configuration
|
37
41
|
with hydra.initialize(version_base=None, config_path="../configs"):
|
38
|
-
cfg = hydra.compose(config_name=
|
39
|
-
overrides=['tools/get_annotation=default'])
|
42
|
+
cfg = hydra.compose(config_name="config", overrides=["tools/get_annotation=default"])
|
40
43
|
cfg = cfg.tools.get_annotation
|
41
|
-
logger.info(
|
42
|
-
|
44
|
+
logger.info(
|
45
|
+
"Loaded the following system prompt for the LLM to get a structured output: %s",
|
46
|
+
cfg.prompt,
|
47
|
+
)
|
43
48
|
|
44
49
|
# Extract all the species names from the model
|
45
50
|
df_species = basico.model_info.get_species(model=model_object.copasi_model)
|
@@ -53,17 +58,19 @@ def extract_relevant_species_names(model_object, arg_data, state):
|
|
53
58
|
"""
|
54
59
|
A list of species based on user question.
|
55
60
|
"""
|
56
|
-
|
57
|
-
|
58
|
-
|
61
|
+
|
62
|
+
relevant_species: None | list[Literal[*all_species_names,]] = Field(
|
63
|
+
description="""List of species based on user question.
|
64
|
+
If no relevant species are found, it must be None."""
|
65
|
+
)
|
59
66
|
|
60
67
|
# Create an instance of the LLM model
|
61
|
-
llm = state[
|
68
|
+
llm = state["llm_model"]
|
62
69
|
# Get the structured output from the LLM model
|
63
70
|
llm_with_structured_output = llm.with_structured_output(CustomHeader)
|
64
71
|
# Define the question for the LLM model using the prompt
|
65
72
|
question = cfg.prompt
|
66
|
-
question += f
|
73
|
+
question += f"Here is the user question: {arg_data.user_question}"
|
67
74
|
# Invoke the LLM model with the user question
|
68
75
|
results = llm_with_structured_output.invoke(question)
|
69
76
|
logging.info("Results from the LLM model: %s", results)
|
@@ -78,82 +85,95 @@ def extract_relevant_species_names(model_object, arg_data, state):
|
|
78
85
|
logger.info("Extracted species: %s", extracted_species)
|
79
86
|
return extracted_species
|
80
87
|
|
81
|
-
|
88
|
+
|
89
|
+
def prepare_content_msg(species_without_description: list[str]):
|
82
90
|
"""
|
83
91
|
Prepare the content message.
|
84
92
|
"""
|
85
|
-
content =
|
93
|
+
content = "Successfully extracted annotations for the species."
|
86
94
|
if species_without_description:
|
87
|
-
content += f
|
95
|
+
content += f"""The descriptions for the following species
|
88
96
|
were not found:
|
89
|
-
{", ".join(species_without_description)}.
|
97
|
+
{", ".join(species_without_description)}."""
|
90
98
|
return content
|
91
99
|
|
100
|
+
|
92
101
|
@dataclass
|
93
102
|
class ArgumentData:
|
94
103
|
"""
|
95
104
|
Dataclass for storing the argument data.
|
96
105
|
"""
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
106
|
+
|
107
|
+
experiment_name: Annotated[
|
108
|
+
str,
|
109
|
+
"An AI assigned _ separated name of"
|
110
|
+
" the experiment based on human query"
|
111
|
+
" and the context of the experiment."
|
112
|
+
" This must be set before the experiment is run.",
|
113
|
+
]
|
101
114
|
user_question: Annotated[str, "Description of the user question"]
|
102
115
|
|
116
|
+
|
103
117
|
class GetAnnotationInput(BaseModel):
|
104
118
|
"""
|
105
119
|
Input schema for annotation tool.
|
106
120
|
"""
|
121
|
+
|
107
122
|
arg_data: ArgumentData = Field(description="argument data")
|
108
123
|
sys_bio_model: ModelData = Field(description="model data")
|
109
124
|
tool_call_id: Annotated[str, InjectedToolCallId]
|
110
125
|
state: Annotated[dict, InjectedState]
|
111
126
|
|
127
|
+
|
112
128
|
class GetAnnotationTool(BaseTool):
|
113
129
|
"""
|
114
130
|
Tool for fetching species annotations based on the provided model and species names.
|
115
131
|
"""
|
132
|
+
|
116
133
|
name: str = "get_annotation"
|
117
|
-
description: str =
|
134
|
+
description: str = """A tool to extract annotations for a list of species names
|
118
135
|
based on the provided model. Annotations include
|
119
136
|
the species name, description, database, ID, link,
|
120
137
|
and qualifier. The tool can handle multiple species
|
121
|
-
in a single invoke.
|
122
|
-
args_schema:
|
138
|
+
in a single invoke."""
|
139
|
+
args_schema: type[BaseModel] = GetAnnotationInput
|
123
140
|
return_direct: bool = False
|
124
141
|
|
125
|
-
def _run(
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
142
|
+
def _run(
|
143
|
+
self,
|
144
|
+
arg_data: ArgumentData,
|
145
|
+
tool_call_id: Annotated[str, InjectedToolCallId],
|
146
|
+
state: Annotated[dict, InjectedState],
|
147
|
+
sys_bio_model: ModelData = None,
|
148
|
+
) -> str:
|
130
149
|
"""
|
131
150
|
Run the tool.
|
132
151
|
"""
|
133
|
-
logger.info(
|
134
|
-
|
135
|
-
|
152
|
+
logger.info(
|
153
|
+
"Running the GetAnnotationTool tool for species %s, %s",
|
154
|
+
arg_data.user_question,
|
155
|
+
arg_data.experiment_name,
|
156
|
+
)
|
136
157
|
|
137
158
|
# Prepare the model object
|
138
|
-
sbml_file_path = state[
|
159
|
+
sbml_file_path = state["sbml_file_path"][-1] if state["sbml_file_path"] else None
|
139
160
|
model_object = load_biomodel(sys_bio_model, sbml_file_path=sbml_file_path)
|
140
161
|
|
141
162
|
# Extract relevant species names based on the user question
|
142
163
|
list_species_names = extract_relevant_species_names(model_object, arg_data, state)
|
143
|
-
print
|
164
|
+
print(list_species_names)
|
144
165
|
|
145
|
-
(annotations_df,
|
146
|
-
species_without_description) = self._fetch_annotations(list_species_names)
|
166
|
+
(annotations_df, species_without_description) = self._fetch_annotations(list_species_names)
|
147
167
|
|
148
168
|
# Process annotations
|
149
169
|
annotations_df = self._process_annotations(annotations_df)
|
150
170
|
|
151
171
|
# Prepare the simulated data
|
152
172
|
dic_annotations_data = {
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
173
|
+
"name": arg_data.experiment_name,
|
174
|
+
"source": (sys_bio_model.biomodel_id if sys_bio_model.biomodel_id else "upload"),
|
175
|
+
"tool_call_id": tool_call_id,
|
176
|
+
"data": annotations_df.to_dict(),
|
157
177
|
}
|
158
178
|
|
159
179
|
# Update the state with the annotations data
|
@@ -161,24 +181,25 @@ class GetAnnotationTool(BaseTool):
|
|
161
181
|
for key, value in {
|
162
182
|
"model_id": [sys_bio_model.biomodel_id],
|
163
183
|
"sbml_file_path": [sbml_file_path],
|
164
|
-
"dic_annotations_data": [dic_annotations_data]
|
184
|
+
"dic_annotations_data": [dic_annotations_data],
|
165
185
|
}.items():
|
166
186
|
if value:
|
167
187
|
dic_updated_state_for_model[key] = value
|
168
188
|
|
169
189
|
return Command(
|
170
|
-
update=dic_updated_state_for_model
|
190
|
+
update=dic_updated_state_for_model
|
191
|
+
| {
|
171
192
|
"messages": [
|
172
193
|
ToolMessage(
|
173
194
|
content=prepare_content_msg(species_without_description),
|
174
195
|
artifact=True,
|
175
|
-
tool_call_id=tool_call_id
|
196
|
+
tool_call_id=tool_call_id,
|
176
197
|
)
|
177
198
|
]
|
178
199
|
}
|
179
200
|
)
|
180
201
|
|
181
|
-
def _fetch_annotations(self, list_species_names:
|
202
|
+
def _fetch_annotations(self, list_species_names: list[str]) -> tuple:
|
182
203
|
"""
|
183
204
|
Fetch annotations for the given species names from the model.
|
184
205
|
In this method, we fetch the MIRIAM annotations for the species names.
|
@@ -210,11 +231,13 @@ class GetAnnotationTool(BaseTool):
|
|
210
231
|
|
211
232
|
# Loop through the descriptions and add them to the data list
|
212
233
|
for desc in descriptions:
|
213
|
-
data.append(
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
234
|
+
data.append(
|
235
|
+
{
|
236
|
+
"Species Name": species,
|
237
|
+
"Link": desc["id"],
|
238
|
+
"Qualifier": desc["qualifier"],
|
239
|
+
}
|
240
|
+
)
|
218
241
|
|
219
242
|
# Create a dataframe from the data list
|
220
243
|
annotations_df = pd.DataFrame(data)
|
@@ -238,22 +261,23 @@ class GetAnnotationTool(BaseTool):
|
|
238
261
|
logger.info("Processing annotations.")
|
239
262
|
# Add a new column for the ID
|
240
263
|
# Get the ID from the link key
|
241
|
-
annotations_df[
|
264
|
+
annotations_df["Id"] = annotations_df["Link"].str.split("/").str[-1]
|
242
265
|
|
243
266
|
# Add a new column for the database
|
244
267
|
# Get the database from the link key
|
245
|
-
annotations_df[
|
268
|
+
annotations_df["Database"] = annotations_df["Link"].str.split("/").str[-2]
|
246
269
|
|
247
270
|
# Fetch descriptions for the IDs based on the database type
|
248
271
|
# by qyerying the respective APIs
|
249
|
-
identifiers = annotations_df[[
|
272
|
+
identifiers = annotations_df[["Id", "Database"]].to_dict(orient="records")
|
250
273
|
descriptions = self._fetch_descriptions(identifiers)
|
251
274
|
|
252
275
|
# Add a new column for the description
|
253
276
|
# Get the description from the descriptions dictionary
|
254
277
|
# based on the ID. If the description is not found, use '-'
|
255
|
-
annotations_df[
|
256
|
-
|
278
|
+
annotations_df["Description"] = annotations_df["Id"].apply(
|
279
|
+
lambda x: descriptions.get(x, "-")
|
280
|
+
)
|
257
281
|
# annotations_df.index = annotations_df.index + 1
|
258
282
|
|
259
283
|
# Reorder the columns
|
@@ -272,13 +296,13 @@ class GetAnnotationTool(BaseTool):
|
|
272
296
|
Process link to format it correctly.
|
273
297
|
"""
|
274
298
|
for ols_ontology_abbreviation in ols_ontology_abbreviations:
|
275
|
-
if ols_ontology_abbreviation +
|
299
|
+
if ols_ontology_abbreviation + "/" in link:
|
276
300
|
link = link.replace(f"{ols_ontology_abbreviation}/", "")
|
277
301
|
if "kegg.compound" in link:
|
278
302
|
link = link.replace("kegg.compound/", "kegg.compound:")
|
279
303
|
return link
|
280
304
|
|
281
|
-
def _fetch_descriptions(self, data:
|
305
|
+
def _fetch_descriptions(self, data: list[dict[str, str]]) -> dict[str, str]:
|
282
306
|
"""
|
283
307
|
Fetch protein names or labels based on the database type.
|
284
308
|
"""
|
@@ -290,8 +314,8 @@ class GetAnnotationTool(BaseTool):
|
|
290
314
|
# and a list of identifiers as the value. If either the database or the
|
291
315
|
# identifier is NaN, we set it to None.
|
292
316
|
for entry in data:
|
293
|
-
identifier = entry.get(
|
294
|
-
database = entry.get(
|
317
|
+
identifier = entry.get("Id")
|
318
|
+
database = entry.get("Database")
|
295
319
|
# Check if database is NaN
|
296
320
|
if isinstance(database, float):
|
297
321
|
if math.isnan(database):
|
@@ -306,18 +330,18 @@ class GetAnnotationTool(BaseTool):
|
|
306
330
|
# Constants
|
307
331
|
|
308
332
|
for database, identifiers in grouped_data.items():
|
309
|
-
if database ==
|
333
|
+
if database == "uniprot":
|
310
334
|
results.update(search_uniprot_labels(identifiers))
|
311
335
|
elif database in ols_ontology_abbreviations:
|
312
|
-
annotations = search_ols_labels(
|
313
|
-
|
314
|
-
|
315
|
-
])
|
336
|
+
annotations = search_ols_labels(
|
337
|
+
[{"Id": id_, "Database": database} for id_ in identifiers]
|
338
|
+
)
|
316
339
|
for identifier in identifiers:
|
317
340
|
results[identifier] = annotations.get(database, {}).get(identifier, "-")
|
318
|
-
elif database ==
|
319
|
-
data = [
|
320
|
-
|
341
|
+
elif database == "kegg.compound":
|
342
|
+
data = [
|
343
|
+
{"Id": identifier, "Database": "kegg.compound"} for identifier in identifiers
|
344
|
+
]
|
321
345
|
annotations = fetch_kegg_annotations(data)
|
322
346
|
for identifier in identifiers:
|
323
347
|
results[identifier] = annotations.get(database, {}).get(identifier, "-")
|
@@ -5,26 +5,30 @@ Tool for get model information.
|
|
5
5
|
"""
|
6
6
|
|
7
7
|
import logging
|
8
|
-
from typing import Type, Optional, Annotated
|
9
8
|
from dataclasses import dataclass
|
9
|
+
from typing import Annotated
|
10
|
+
|
10
11
|
import basico
|
11
|
-
from pydantic import BaseModel, Field
|
12
|
-
from langchain_core.tools import BaseTool
|
13
12
|
from langchain_core.messages import ToolMessage
|
13
|
+
from langchain_core.tools import BaseTool
|
14
14
|
from langchain_core.tools.base import InjectedToolCallId
|
15
15
|
from langgraph.prebuilt import InjectedState
|
16
16
|
from langgraph.types import Command
|
17
|
+
from pydantic import BaseModel, Field
|
18
|
+
|
17
19
|
from .load_biomodel import ModelData, load_biomodel
|
18
20
|
|
19
21
|
# Initialize logger
|
20
22
|
logging.basicConfig(level=logging.INFO)
|
21
23
|
logger = logging.getLogger(__name__)
|
22
24
|
|
25
|
+
|
23
26
|
@dataclass
|
24
27
|
class RequestedModelInfo:
|
25
28
|
"""
|
26
29
|
Dataclass for storing the requested model information.
|
27
30
|
"""
|
31
|
+
|
28
32
|
species: bool = Field(description="Get species from the model.", default=False)
|
29
33
|
parameters: bool = Field(description="Get parameters from the model.", default=False)
|
30
34
|
compartments: bool = Field(description="Get compartments from the model.", default=False)
|
@@ -32,33 +36,38 @@ class RequestedModelInfo:
|
|
32
36
|
description: bool = Field(description="Get description from the model.", default=False)
|
33
37
|
name: bool = Field(description="Get name from the model.", default=False)
|
34
38
|
|
39
|
+
|
35
40
|
class GetModelInfoInput(BaseModel):
|
36
41
|
"""
|
37
42
|
Input schema for the GetModelInfo tool.
|
38
43
|
"""
|
44
|
+
|
39
45
|
requested_model_info: RequestedModelInfo = Field(description="requested model information")
|
40
46
|
sys_bio_model: ModelData = Field(description="model data")
|
41
47
|
tool_call_id: Annotated[str, InjectedToolCallId]
|
42
48
|
state: Annotated[dict, InjectedState]
|
43
49
|
|
50
|
+
|
44
51
|
# Note: It's important that every field has type hints. BaseTool is a
|
45
52
|
# Pydantic class and not having type hints can lead to unexpected behavior.
|
46
53
|
class GetModelInfoTool(BaseTool):
|
47
54
|
"""
|
48
55
|
This tool ise used extract model information.
|
49
56
|
"""
|
57
|
+
|
50
58
|
name: str = "get_modelinfo"
|
51
59
|
description: str = """A tool for extracting name,
|
52
60
|
description, species, parameters,
|
53
61
|
compartments, and units from a model."""
|
54
|
-
args_schema:
|
55
|
-
|
56
|
-
def _run(
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
+
args_schema: type[BaseModel] = GetModelInfoInput
|
63
|
+
|
64
|
+
def _run(
|
65
|
+
self,
|
66
|
+
requested_model_info: RequestedModelInfo,
|
67
|
+
tool_call_id: Annotated[str, InjectedToolCallId],
|
68
|
+
state: Annotated[dict, InjectedState],
|
69
|
+
sys_bio_model: ModelData | None = None,
|
70
|
+
) -> Command:
|
62
71
|
"""
|
63
72
|
Run the tool.
|
64
73
|
|
@@ -71,14 +80,15 @@ class GetModelInfoTool(BaseTool):
|
|
71
80
|
Returns:
|
72
81
|
Command: The updated state of the tool.
|
73
82
|
"""
|
74
|
-
logger.log(
|
75
|
-
|
76
|
-
|
77
|
-
|
83
|
+
logger.log(
|
84
|
+
logging.INFO,
|
85
|
+
"Calling get_modelinfo tool %s, %s",
|
86
|
+
sys_bio_model,
|
87
|
+
requested_model_info,
|
88
|
+
)
|
78
89
|
# print (state, 'state')
|
79
|
-
sbml_file_path = state[
|
80
|
-
model_obj = load_biomodel(sys_bio_model,
|
81
|
-
sbml_file_path=sbml_file_path)
|
90
|
+
sbml_file_path = state["sbml_file_path"][-1] if len(state["sbml_file_path"]) > 0 else None
|
91
|
+
model_obj = load_biomodel(sys_bio_model, sbml_file_path=sbml_file_path)
|
82
92
|
dic_results = {}
|
83
93
|
# Extract species from the model
|
84
94
|
if requested_model_info.species:
|
@@ -87,15 +97,18 @@ class GetModelInfoTool(BaseTool):
|
|
87
97
|
raise ValueError("Unable to extract species from the model.")
|
88
98
|
# Convert index into a column
|
89
99
|
df_species.reset_index(inplace=True)
|
90
|
-
dic_results[
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
100
|
+
dic_results["Species"] = df_species[
|
101
|
+
[
|
102
|
+
"name",
|
103
|
+
"compartment",
|
104
|
+
"type",
|
105
|
+
"unit",
|
106
|
+
"initial_concentration",
|
107
|
+
"display_name",
|
108
|
+
]
|
109
|
+
]
|
97
110
|
# Convert this into a dictionary
|
98
|
-
dic_results[
|
111
|
+
dic_results["Species"] = dic_results["Species"].to_dict(orient="records")
|
99
112
|
|
100
113
|
# Extract parameters from the model
|
101
114
|
if requested_model_info.parameters:
|
@@ -104,50 +117,43 @@ class GetModelInfoTool(BaseTool):
|
|
104
117
|
raise ValueError("Unable to extract parameters from the model.")
|
105
118
|
# Convert index into a column
|
106
119
|
df_parameters.reset_index(inplace=True)
|
107
|
-
dic_results[
|
108
|
-
|
109
|
-
|
110
|
-
'unit',
|
111
|
-
'initial_value',
|
112
|
-
'display_name']]
|
120
|
+
dic_results["Parameters"] = df_parameters[
|
121
|
+
["name", "type", "unit", "initial_value", "display_name"]
|
122
|
+
]
|
113
123
|
# Convert this into a dictionary
|
114
|
-
dic_results[
|
124
|
+
dic_results["Parameters"] = dic_results["Parameters"].to_dict(orient="records")
|
115
125
|
|
116
126
|
# Extract compartments from the model
|
117
127
|
if requested_model_info.compartments:
|
118
128
|
df_compartments = basico.model_info.get_compartments(model=model_obj.copasi_model)
|
119
|
-
dic_results[
|
120
|
-
dic_results[
|
129
|
+
dic_results["Compartments"] = df_compartments.index.tolist()
|
130
|
+
dic_results["Compartments"] = ",".join(dic_results["Compartments"])
|
121
131
|
|
122
132
|
# Extract description from the model
|
123
133
|
if requested_model_info.description:
|
124
|
-
dic_results[
|
134
|
+
dic_results["Description"] = model_obj.description
|
125
135
|
|
126
136
|
# Extract description from the model
|
127
137
|
if requested_model_info.name:
|
128
|
-
dic_results[
|
138
|
+
dic_results["Name"] = model_obj.name
|
129
139
|
|
130
140
|
# Extract time unit from the model
|
131
141
|
if requested_model_info.units:
|
132
|
-
dic_results[
|
142
|
+
dic_results["Units"] = basico.model_info.get_model_units(model=model_obj.copasi_model)
|
133
143
|
|
134
144
|
# Prepare the dictionary of updated state for the model
|
135
145
|
dic_updated_state_for_model = {}
|
136
146
|
for key, value in {
|
137
|
-
|
138
|
-
|
139
|
-
|
147
|
+
"model_id": [sys_bio_model.biomodel_id],
|
148
|
+
"sbml_file_path": [sbml_file_path],
|
149
|
+
}.items():
|
140
150
|
if value:
|
141
151
|
dic_updated_state_for_model[key] = value
|
142
152
|
|
143
153
|
return Command(
|
144
|
-
update=dic_updated_state_for_model
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
)
|
151
|
-
],
|
152
|
-
}
|
153
|
-
)
|
154
|
+
update=dic_updated_state_for_model
|
155
|
+
| {
|
156
|
+
# update the message history
|
157
|
+
"messages": [ToolMessage(content=dic_results, tool_call_id=tool_call_id)],
|
158
|
+
}
|
159
|
+
)
|