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
@@ -8,45 +8,52 @@ before the experiment is run.
|
|
8
8
|
|
9
9
|
import logging
|
10
10
|
from dataclasses import dataclass
|
11
|
-
from typing import
|
12
|
-
|
11
|
+
from typing import Annotated
|
12
|
+
|
13
13
|
import basico
|
14
|
+
from pydantic import Field
|
14
15
|
|
15
16
|
# Initialize logger
|
16
17
|
logging.basicConfig(level=logging.INFO)
|
17
18
|
logger = logging.getLogger(__name__)
|
18
19
|
|
20
|
+
|
19
21
|
@dataclass
|
20
22
|
class TimeData:
|
21
23
|
"""
|
22
24
|
Dataclass for storing the time data.
|
23
25
|
"""
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
interval: Union[int, float] = Field(
|
26
|
+
|
27
|
+
duration: int | float = Field(description="Duration of the simulation", default=100)
|
28
|
+
interval: int | float = Field(
|
28
29
|
description="The interval is the time step or"
|
29
30
|
" the step size of the simulation. It is unrelated"
|
30
31
|
" to the step size of species concentration and parameter values.",
|
31
|
-
default=100
|
32
|
+
default=100,
|
33
|
+
)
|
34
|
+
|
32
35
|
|
33
36
|
@dataclass
|
34
37
|
class SpeciesInitialData:
|
35
38
|
"""
|
36
39
|
Dataclass for storing the species initial data.
|
37
40
|
"""
|
38
|
-
|
41
|
+
|
42
|
+
species_name: list[str] = Field(
|
39
43
|
description="List of species whose initial concentration is to be set."
|
40
44
|
" This does not include species that reoccur or the species whose"
|
41
45
|
" concentration is to be determined/observed at the end of the experiment."
|
42
46
|
" Do not hallucinate the species name.",
|
43
|
-
default=[]
|
44
|
-
|
47
|
+
default=[],
|
48
|
+
)
|
49
|
+
species_concentration: list[int | float] = Field(
|
45
50
|
description="List of initial concentrations of species."
|
46
51
|
" This does not include species that reoccur or the species whose"
|
47
52
|
" concentration is to be determined/observed at the end of the experiment."
|
48
53
|
" Do not hallucinate the species concentration.",
|
49
|
-
default=[]
|
54
|
+
default=[],
|
55
|
+
)
|
56
|
+
|
50
57
|
|
51
58
|
@dataclass
|
52
59
|
class TimeSpeciesNameConcentration:
|
@@ -54,10 +61,13 @@ class TimeSpeciesNameConcentration:
|
|
54
61
|
Dataclass for storing the time,
|
55
62
|
species name, and concentration data.
|
56
63
|
"""
|
57
|
-
|
64
|
+
|
65
|
+
time: int | float = Field(description="time point where the event occurs")
|
58
66
|
species_name: str = Field(description="species name")
|
59
|
-
species_concentration:
|
60
|
-
description="species concentration at the time point"
|
67
|
+
species_concentration: int | float = Field(
|
68
|
+
description="species concentration at the time point"
|
69
|
+
)
|
70
|
+
|
61
71
|
|
62
72
|
@dataclass
|
63
73
|
class ReocurringData:
|
@@ -66,34 +76,42 @@ class ReocurringData:
|
|
66
76
|
the concentration of the species resets to a certain
|
67
77
|
value after a certain time interval.
|
68
78
|
"""
|
69
|
-
|
79
|
+
|
80
|
+
data: list[TimeSpeciesNameConcentration] = Field(
|
70
81
|
description="List of time, name, and concentration data"
|
71
|
-
|
72
|
-
|
82
|
+
" of species or parameters that reoccur",
|
83
|
+
default=[],
|
84
|
+
)
|
85
|
+
|
73
86
|
|
74
87
|
@dataclass
|
75
88
|
class ArgumentData:
|
76
89
|
"""
|
77
90
|
Dataclass for storing the argument data.
|
78
91
|
"""
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
92
|
+
|
93
|
+
experiment_name: Annotated[
|
94
|
+
str,
|
95
|
+
"An AI assigned _ separated name of"
|
96
|
+
" the experiment based on human query"
|
97
|
+
" and the context of the experiment."
|
98
|
+
" This must be set before the experiment is run.",
|
99
|
+
]
|
100
|
+
time_data: TimeData | None = Field(description="time data", default=None)
|
101
|
+
species_to_be_analyzed_before_experiment: SpeciesInitialData | None = Field(
|
87
102
|
description="Data of species whose initial concentration"
|
88
103
|
" is to be set before the experiment. This does not include"
|
89
104
|
" species that reoccur or the species whose concentration"
|
90
105
|
" is to be determined at the end of the experiment.",
|
91
|
-
default=None
|
92
|
-
|
106
|
+
default=None,
|
107
|
+
)
|
108
|
+
reocurring_data: ReocurringData | None = Field(
|
93
109
|
description="List of concentration and time data of species that"
|
94
110
|
" reoccur. For example, a species whose concentration resets"
|
95
111
|
" to a certain value after a certain time interval.",
|
96
|
-
default=None
|
112
|
+
default=None,
|
113
|
+
)
|
114
|
+
|
97
115
|
|
98
116
|
def add_rec_events(model_object, reocurring_data):
|
99
117
|
"""
|
@@ -108,7 +126,9 @@ def add_rec_events(model_object, reocurring_data):
|
|
108
126
|
"""
|
109
127
|
for row in reocurring_data.data:
|
110
128
|
tp, sn, sc = row.time, row.species_name, row.species_concentration
|
111
|
-
basico.add_event(
|
112
|
-
|
113
|
-
|
114
|
-
|
129
|
+
basico.add_event(
|
130
|
+
f"{sn}_{tp}",
|
131
|
+
f"Time > {tp}",
|
132
|
+
[[sn, str(sc)]],
|
133
|
+
model=model_object.copasi_model,
|
134
|
+
)
|
@@ -4,10 +4,13 @@
|
|
4
4
|
Function for loading the BioModel.
|
5
5
|
"""
|
6
6
|
|
7
|
-
from typing import Annotated, Any
|
7
|
+
from typing import Annotated, Any
|
8
|
+
|
8
9
|
from pydantic import BaseModel, BeforeValidator
|
10
|
+
|
9
11
|
from ..models.basico_model import BasicoModel
|
10
12
|
|
13
|
+
|
11
14
|
def ensure_biomodel_id(value: Any) -> Any:
|
12
15
|
"""
|
13
16
|
Ensure that the biomodel_id is an integer or a string starting with 'BIOMD' or 'MODEL'.
|
@@ -18,14 +21,17 @@ def ensure_biomodel_id(value: Any) -> Any:
|
|
18
21
|
return value
|
19
22
|
raise ValueError("biomodel_id must be an integer or a string starting with 'BIOMD' or 'MODEL'.")
|
20
23
|
|
24
|
+
|
21
25
|
class ModelData(BaseModel):
|
22
26
|
"""
|
23
27
|
Base model for the model data.
|
24
28
|
"""
|
25
|
-
|
29
|
+
|
30
|
+
biomodel_id: Annotated[int | str, BeforeValidator(ensure_biomodel_id)] = None
|
26
31
|
# sbml_file_path: Optional[str] = None
|
27
32
|
use_uploaded_sbml_file: bool = False
|
28
33
|
|
34
|
+
|
29
35
|
def load_biomodel(sys_bio_model, sbml_file_path=None):
|
30
36
|
"""
|
31
37
|
Load the BioModel.
|
@@ -6,69 +6,79 @@ Tool for parameter scan.
|
|
6
6
|
|
7
7
|
import logging
|
8
8
|
from dataclasses import dataclass
|
9
|
-
from typing import
|
10
|
-
|
9
|
+
from typing import Annotated
|
10
|
+
|
11
11
|
import basico
|
12
|
-
|
13
|
-
from langgraph.types import Command
|
14
|
-
from langgraph.prebuilt import InjectedState
|
15
|
-
from langchain_core.tools import BaseTool
|
12
|
+
import pandas as pd
|
16
13
|
from langchain_core.messages import ToolMessage
|
14
|
+
from langchain_core.tools import BaseTool
|
17
15
|
from langchain_core.tools.base import InjectedToolCallId
|
16
|
+
from langgraph.prebuilt import InjectedState
|
17
|
+
from langgraph.types import Command
|
18
|
+
from pydantic import BaseModel, Field
|
19
|
+
|
20
|
+
from .load_arguments import SpeciesInitialData, TimeData
|
18
21
|
from .load_biomodel import ModelData, load_biomodel
|
19
|
-
from .load_arguments import TimeData, SpeciesInitialData
|
20
22
|
from .utils import get_model_units
|
21
23
|
|
22
24
|
# Initialize logger
|
23
25
|
logging.basicConfig(level=logging.INFO)
|
24
26
|
logger = logging.getLogger(__name__)
|
25
27
|
|
28
|
+
|
26
29
|
@dataclass
|
27
30
|
class ParameterScanData(BaseModel):
|
28
31
|
"""
|
29
32
|
Dataclass for storing the parameter scan data.
|
30
33
|
"""
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
34
|
+
|
35
|
+
species_names: list[str] = Field(
|
36
|
+
description="species to be observed after each scan."
|
37
|
+
" These are the species whose concentration"
|
38
|
+
" will be observed after the parameter scan."
|
39
|
+
" Do not make up this data.",
|
40
|
+
default=[],
|
41
|
+
)
|
37
42
|
species_parameter_name: str = Field(
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
43
|
+
description="Species or parameter name to be scanned."
|
44
|
+
" This is the species or parameter whose value will be scanned"
|
45
|
+
" over a range of values. This does not include the species"
|
46
|
+
" that are to be observed after the scan."
|
47
|
+
"Do not make up this data.",
|
48
|
+
default=None,
|
49
|
+
)
|
50
|
+
species_parameter_values: list[int | float] = Field(
|
51
|
+
description="Species or parameter values to be scanned."
|
52
|
+
" These are the values of the species or parameters that will be"
|
53
|
+
" scanned over a range of values. This does not include the "
|
54
|
+
"species that are to be observed after the scan."
|
55
|
+
"Do not make up this data.",
|
56
|
+
default=None,
|
57
|
+
)
|
58
|
+
|
51
59
|
|
52
60
|
@dataclass
|
53
61
|
class ArgumentData:
|
54
62
|
"""
|
55
63
|
Dataclass for storing the argument data.
|
56
64
|
"""
|
65
|
+
|
57
66
|
time_data: TimeData = Field(description="time data", default=None)
|
58
|
-
species_to_be_analyzed_before_experiment:
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
default=None)
|
67
|
+
species_to_be_analyzed_before_experiment: SpeciesInitialData | None = Field(
|
68
|
+
description=" This is the initial condition of the model."
|
69
|
+
" This does not include species that reoccur or the species"
|
70
|
+
" whose concentration is to be determined/observed at the end"
|
71
|
+
" of the experiment. This also does not include the species"
|
72
|
+
" or the parameter that is to be scanned. Do not make up this data.",
|
73
|
+
default=None,
|
74
|
+
)
|
75
|
+
parameter_scan_data: ParameterScanData = Field(description="parameter scan data", default=None)
|
68
76
|
experiment_name: str = Field(
|
69
|
-
|
70
|
-
|
71
|
-
|
77
|
+
description="An AI assigned `_` separated unique name of"
|
78
|
+
" the parameter scan experiment based on human query."
|
79
|
+
" This must be unique for each experiment."
|
80
|
+
)
|
81
|
+
|
72
82
|
|
73
83
|
def make_list_dic_scanned_data(dic_param_scan, arg_data, sys_bio_model, tool_call_id):
|
74
84
|
"""
|
@@ -86,24 +96,26 @@ def make_list_dic_scanned_data(dic_param_scan, arg_data, sys_bio_model, tool_cal
|
|
86
96
|
"""
|
87
97
|
list_dic_scanned_data = []
|
88
98
|
for species_name, df_param_scan in dic_param_scan.items():
|
89
|
-
logger.log(
|
90
|
-
|
91
|
-
|
99
|
+
logger.log(
|
100
|
+
logging.INFO,
|
101
|
+
"Parameter scan results for %s with shape %s",
|
102
|
+
species_name,
|
103
|
+
df_param_scan.shape,
|
104
|
+
)
|
92
105
|
# Prepare the list dictionary of scanned data
|
93
106
|
# that will be passed to the state of the graph
|
94
|
-
list_dic_scanned_data.append(
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
107
|
+
list_dic_scanned_data.append(
|
108
|
+
{
|
109
|
+
"name": arg_data.experiment_name + ":" + species_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_param_scan.to_dict(),
|
113
|
+
}
|
114
|
+
)
|
100
115
|
return list_dic_scanned_data
|
101
116
|
|
102
|
-
|
103
|
-
|
104
|
-
dic_species_data,
|
105
|
-
duration,
|
106
|
-
interval) -> dict:
|
117
|
+
|
118
|
+
def run_parameter_scan(model_object, arg_data, dic_species_data, duration, interval) -> dict:
|
107
119
|
"""
|
108
120
|
Run parameter scan on the model.
|
109
121
|
|
@@ -128,16 +140,18 @@ def run_parameter_scan(model_object,
|
|
128
140
|
|
129
141
|
# Extract all species name from the model
|
130
142
|
df_all_species = basico.model_info.get_species(model=model_object.copasi_model)
|
131
|
-
all_species = df_all_species[
|
143
|
+
all_species = df_all_species["display_name"].tolist()
|
132
144
|
|
133
145
|
# Verify if the given species or parameter names to be scanned are valid
|
134
146
|
if arg_data.parameter_scan_data.species_parameter_name not in all_parameters + all_species:
|
135
147
|
logger.error(
|
136
148
|
"Invalid species or parameter name: %s",
|
137
|
-
arg_data.parameter_scan_data.species_parameter_name
|
149
|
+
arg_data.parameter_scan_data.species_parameter_name,
|
150
|
+
)
|
138
151
|
raise ValueError(
|
139
152
|
"Invalid species or parameter name: "
|
140
|
-
f"{arg_data.parameter_scan_data.species_parameter_name}."
|
153
|
+
f"{arg_data.parameter_scan_data.species_parameter_name}."
|
154
|
+
)
|
141
155
|
|
142
156
|
# Dictionary to store the parameter scan results
|
143
157
|
dic_param_scan_results = {}
|
@@ -165,12 +179,13 @@ def run_parameter_scan(model_object,
|
|
165
179
|
for param_value in arg_data.parameter_scan_data.species_parameter_values:
|
166
180
|
# Update the parameter value in the model
|
167
181
|
model_object_copy.update_parameters(
|
168
|
-
{arg_data.parameter_scan_data.species_parameter_name: param_value}
|
182
|
+
{arg_data.parameter_scan_data.species_parameter_name: param_value}
|
183
|
+
)
|
169
184
|
# Simulate the model
|
170
185
|
model_object_copy.simulate(duration=duration, interval=interval)
|
171
186
|
# If the column name 'Time' is not present in the results DataFrame
|
172
|
-
if
|
173
|
-
df_param_scan[
|
187
|
+
if "Time" not in df_param_scan.columns:
|
188
|
+
df_param_scan["Time"] = model_object_copy.simulation_results["Time"]
|
174
189
|
# Add the simulation results to the results DataFrame
|
175
190
|
col_name = f"{arg_data.parameter_scan_data.species_parameter_name}_{param_value}"
|
176
191
|
df_param_scan[col_name] = model_object_copy.simulation_results[species_name]
|
@@ -182,37 +197,42 @@ def run_parameter_scan(model_object,
|
|
182
197
|
# return df_param_scan
|
183
198
|
return dic_param_scan_results
|
184
199
|
|
200
|
+
|
185
201
|
class ParameterScanInput(BaseModel):
|
186
202
|
"""
|
187
203
|
Input schema for the ParameterScan tool.
|
188
204
|
"""
|
189
|
-
|
190
|
-
|
191
|
-
arg_data: ArgumentData = Field(
|
192
|
-
|
205
|
+
|
206
|
+
sys_bio_model: ModelData = Field(description="model data", default=None)
|
207
|
+
arg_data: ArgumentData = Field(
|
208
|
+
description="""time, species, and reocurring data
|
193
209
|
as well as the parameter scan name and
|
194
210
|
data""",
|
195
|
-
|
211
|
+
default=None,
|
212
|
+
)
|
196
213
|
tool_call_id: Annotated[str, InjectedToolCallId]
|
197
214
|
state: Annotated[dict, InjectedState]
|
198
215
|
|
216
|
+
|
199
217
|
# Note: It's important that every field has type hints. BaseTool is a
|
200
218
|
# Pydantic class and not having type hints can lead to unexpected behavior.
|
201
219
|
class ParameterScanTool(BaseTool):
|
202
220
|
"""
|
203
221
|
Tool for parameter scan.
|
204
222
|
"""
|
223
|
+
|
205
224
|
name: str = "parameter_scan"
|
206
225
|
description: str = """A tool to perform scanning of a given
|
207
226
|
parameter over a range of values and observe the effect on
|
208
227
|
the concentration of a given species"""
|
209
|
-
args_schema:
|
228
|
+
args_schema: type[BaseModel] = ParameterScanInput
|
210
229
|
|
211
|
-
def _run(
|
230
|
+
def _run(
|
231
|
+
self,
|
212
232
|
tool_call_id: Annotated[str, InjectedToolCallId],
|
213
233
|
state: Annotated[dict, InjectedState],
|
214
234
|
sys_bio_model: ModelData = None,
|
215
|
-
arg_data: ArgumentData = None
|
235
|
+
arg_data: ArgumentData = None,
|
216
236
|
) -> Command:
|
217
237
|
"""
|
218
238
|
Run the tool.
|
@@ -226,11 +246,9 @@ class ParameterScanTool(BaseTool):
|
|
226
246
|
Returns:
|
227
247
|
Command: The updated state of the tool.
|
228
248
|
"""
|
229
|
-
logger.log(logging.INFO, "Calling parameter_scan tool %s, %s",
|
230
|
-
|
231
|
-
|
232
|
-
model_object = load_biomodel(sys_bio_model,
|
233
|
-
sbml_file_path=sbml_file_path)
|
249
|
+
logger.log(logging.INFO, "Calling parameter_scan tool %s, %s", sys_bio_model, arg_data)
|
250
|
+
sbml_file_path = state["sbml_file_path"][-1] if len(state["sbml_file_path"]) > 0 else None
|
251
|
+
model_object = load_biomodel(sys_bio_model, sbml_file_path=sbml_file_path)
|
234
252
|
# Prepare the dictionary of species data
|
235
253
|
# that will be passed to the simulate method
|
236
254
|
# of the BasicoModel class
|
@@ -243,9 +261,10 @@ class ParameterScanTool(BaseTool):
|
|
243
261
|
dic_species_data = dict(
|
244
262
|
zip(
|
245
263
|
arg_data.species_to_be_analyzed_before_experiment.species_name,
|
246
|
-
arg_data.species_to_be_analyzed_before_experiment.species_concentration
|
247
|
-
|
264
|
+
arg_data.species_to_be_analyzed_before_experiment.species_concentration,
|
265
|
+
strict=False,
|
248
266
|
)
|
267
|
+
)
|
249
268
|
|
250
269
|
# # Add reocurring events (if any) to the model
|
251
270
|
# if arg_data.reocurring_data is not None:
|
@@ -257,37 +276,35 @@ class ParameterScanTool(BaseTool):
|
|
257
276
|
interval = arg_data.time_data.interval
|
258
277
|
|
259
278
|
# Run the parameter scan
|
260
|
-
dic_param_scan = run_parameter_scan(
|
261
|
-
|
262
|
-
|
263
|
-
duration,
|
264
|
-
interval)
|
279
|
+
dic_param_scan = run_parameter_scan(
|
280
|
+
model_object, arg_data, dic_species_data, duration, interval
|
281
|
+
)
|
265
282
|
|
266
283
|
logger.log(logging.INFO, "Parameter scan results ready")
|
267
284
|
# Prepare the list dictionary of scanned data
|
268
|
-
list_dic_scanned_data = make_list_dic_scanned_data(
|
269
|
-
|
270
|
-
|
271
|
-
tool_call_id)
|
285
|
+
list_dic_scanned_data = make_list_dic_scanned_data(
|
286
|
+
dic_param_scan, arg_data, sys_bio_model, tool_call_id
|
287
|
+
)
|
272
288
|
# Prepare the dictionary of updated state for the model
|
273
289
|
dic_updated_state_for_model = {}
|
274
290
|
for key, value in {
|
275
291
|
"model_id": [sys_bio_model.biomodel_id],
|
276
292
|
"sbml_file_path": [sbml_file_path],
|
277
293
|
"dic_scanned_data": list_dic_scanned_data,
|
278
|
-
|
294
|
+
}.items():
|
279
295
|
if value:
|
280
296
|
dic_updated_state_for_model[key] = value
|
281
297
|
# Return the updated state
|
282
298
|
return Command(
|
283
|
-
|
299
|
+
update=dic_updated_state_for_model
|
300
|
+
| {
|
284
301
|
# update the message history
|
285
302
|
"messages": [
|
286
303
|
ToolMessage(
|
287
304
|
content=f"Parameter scan results of {arg_data.experiment_name}",
|
288
305
|
tool_call_id=tool_call_id,
|
289
|
-
artifact=get_model_units(model_object)
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
306
|
+
artifact=get_model_units(model_object),
|
307
|
+
)
|
308
|
+
],
|
309
|
+
}
|
310
|
+
)
|
@@ -5,58 +5,59 @@ Tool for asking questions to the article.
|
|
5
5
|
"""
|
6
6
|
|
7
7
|
import logging
|
8
|
-
from typing import
|
9
|
-
|
8
|
+
from typing import Annotated
|
9
|
+
|
10
|
+
from langchain_community.document_loaders import PyPDFLoader
|
10
11
|
from langchain_core.tools import BaseTool
|
11
12
|
from langchain_core.vectorstores import InMemoryVectorStore
|
12
|
-
from langchain_community.document_loaders import PyPDFLoader
|
13
13
|
from langgraph.prebuilt import InjectedState
|
14
|
+
from pydantic import BaseModel, Field
|
14
15
|
|
15
16
|
# Initialize logger
|
16
17
|
logging.basicConfig(level=logging.INFO)
|
17
18
|
logger = logging.getLogger(__name__)
|
18
19
|
|
20
|
+
|
19
21
|
class QueryArticleInput(BaseModel):
|
20
22
|
"""
|
21
23
|
Input schema for the query_articles tool.
|
22
24
|
"""
|
25
|
+
|
23
26
|
question: Annotated[str, Field(description="User question to search articles.")]
|
24
27
|
state: Annotated[dict, InjectedState]
|
25
28
|
|
29
|
+
|
26
30
|
# Note: It's important that every field has type hints. BaseTool is a
|
27
31
|
# Pydantic class and not having type hints can lead to unexpected behavior.
|
28
32
|
class QueryArticle(BaseTool):
|
29
33
|
"""
|
30
34
|
Tool to ask questions to the article.
|
31
35
|
"""
|
36
|
+
|
32
37
|
name: str = "query_article"
|
33
38
|
description: str = "Ask questions to the article."
|
34
|
-
args_schema:
|
39
|
+
args_schema: type[BaseModel] = QueryArticleInput
|
35
40
|
|
36
|
-
def _run(self,
|
37
|
-
question: str,
|
38
|
-
state: Annotated[dict, InjectedState]):
|
41
|
+
def _run(self, question: str, state: Annotated[dict, InjectedState]):
|
39
42
|
"""
|
40
43
|
Run the tool.
|
41
44
|
|
42
45
|
Args:
|
43
46
|
query (str): The search query.
|
44
47
|
"""
|
45
|
-
logger.log(logging.INFO, "loading the article from %s", state[
|
48
|
+
logger.log(logging.INFO, "loading the article from %s", state["pdf_file_name"])
|
46
49
|
logger.log(logging.INFO, "searching the article with the question: %s", question)
|
47
50
|
# Load the article
|
48
|
-
loader = PyPDFLoader(state[
|
51
|
+
loader = PyPDFLoader(state["pdf_file_name"])
|
49
52
|
# Load the pages of the article
|
50
53
|
pages = []
|
51
54
|
for page in loader.lazy_load():
|
52
55
|
pages.append(page)
|
53
56
|
# Set up text embedding model
|
54
|
-
text_embedding_model = state[
|
57
|
+
text_embedding_model = state["text_embedding_model"]
|
55
58
|
logging.info("Loaded text embedding model %s", text_embedding_model)
|
56
59
|
# Create a vector store from the pages
|
57
|
-
vector_store = InMemoryVectorStore.from_documents(
|
58
|
-
pages,
|
59
|
-
text_embedding_model)
|
60
|
+
vector_store = InMemoryVectorStore.from_documents(pages, text_embedding_model)
|
60
61
|
# Search the article with the question
|
61
62
|
docs = vector_store.similarity_search(question)
|
62
63
|
# Return the content of the pages
|