aiagents4pharma 1.44.0__py3-none-any.whl → 1.45.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- aiagents4pharma/__init__.py +2 -2
- aiagents4pharma/talk2aiagents4pharma/.dockerignore +13 -0
- aiagents4pharma/talk2aiagents4pharma/Dockerfile +105 -0
- aiagents4pharma/talk2aiagents4pharma/README.md +1 -0
- aiagents4pharma/talk2aiagents4pharma/__init__.py +4 -5
- aiagents4pharma/talk2aiagents4pharma/agents/__init__.py +3 -2
- aiagents4pharma/talk2aiagents4pharma/agents/main_agent.py +24 -23
- aiagents4pharma/talk2aiagents4pharma/configs/__init__.py +2 -2
- aiagents4pharma/talk2aiagents4pharma/configs/agents/__init__.py +2 -2
- aiagents4pharma/talk2aiagents4pharma/configs/agents/main_agent/default.yaml +2 -2
- aiagents4pharma/talk2aiagents4pharma/configs/config.yaml +1 -1
- aiagents4pharma/talk2aiagents4pharma/docker-compose/cpu/.env.example +23 -0
- aiagents4pharma/talk2aiagents4pharma/docker-compose/cpu/docker-compose.yml +93 -0
- aiagents4pharma/talk2aiagents4pharma/docker-compose/gpu/.env.example +23 -0
- aiagents4pharma/talk2aiagents4pharma/docker-compose/gpu/docker-compose.yml +108 -0
- aiagents4pharma/talk2aiagents4pharma/install.md +127 -0
- aiagents4pharma/talk2aiagents4pharma/states/__init__.py +3 -2
- aiagents4pharma/talk2aiagents4pharma/states/state_talk2aiagents4pharma.py +5 -3
- aiagents4pharma/talk2aiagents4pharma/tests/__init__.py +2 -2
- aiagents4pharma/talk2aiagents4pharma/tests/test_main_agent.py +72 -50
- aiagents4pharma/talk2biomodels/.dockerignore +13 -0
- aiagents4pharma/talk2biomodels/Dockerfile +104 -0
- aiagents4pharma/talk2biomodels/README.md +1 -0
- aiagents4pharma/talk2biomodels/__init__.py +4 -8
- aiagents4pharma/talk2biomodels/agents/__init__.py +3 -2
- aiagents4pharma/talk2biomodels/agents/t2b_agent.py +47 -42
- aiagents4pharma/talk2biomodels/api/__init__.py +4 -5
- aiagents4pharma/talk2biomodels/api/kegg.py +14 -10
- aiagents4pharma/talk2biomodels/api/ols.py +13 -10
- aiagents4pharma/talk2biomodels/api/uniprot.py +7 -6
- aiagents4pharma/talk2biomodels/configs/__init__.py +3 -4
- aiagents4pharma/talk2biomodels/configs/agents/__init__.py +2 -2
- aiagents4pharma/talk2biomodels/configs/agents/t2b_agent/__init__.py +2 -2
- aiagents4pharma/talk2biomodels/configs/agents/t2b_agent/default.yaml +1 -1
- aiagents4pharma/talk2biomodels/configs/config.yaml +1 -1
- aiagents4pharma/talk2biomodels/configs/tools/__init__.py +4 -5
- aiagents4pharma/talk2biomodels/configs/tools/ask_question/__init__.py +2 -2
- aiagents4pharma/talk2biomodels/configs/tools/ask_question/default.yaml +1 -2
- aiagents4pharma/talk2biomodels/configs/tools/custom_plotter/__init__.py +2 -2
- aiagents4pharma/talk2biomodels/configs/tools/custom_plotter/default.yaml +1 -1
- aiagents4pharma/talk2biomodels/configs/tools/get_annotation/__init__.py +2 -2
- aiagents4pharma/talk2biomodels/configs/tools/get_annotation/default.yaml +1 -1
- aiagents4pharma/talk2biomodels/install.md +63 -0
- aiagents4pharma/talk2biomodels/models/__init__.py +4 -4
- aiagents4pharma/talk2biomodels/models/basico_model.py +36 -28
- aiagents4pharma/talk2biomodels/models/sys_bio_model.py +13 -10
- aiagents4pharma/talk2biomodels/states/__init__.py +3 -2
- aiagents4pharma/talk2biomodels/states/state_talk2biomodels.py +12 -8
- aiagents4pharma/talk2biomodels/tests/BIOMD0000000449_url.xml +1585 -0
- aiagents4pharma/talk2biomodels/tests/__init__.py +2 -2
- aiagents4pharma/talk2biomodels/tests/article_on_model_537.pdf +0 -0
- aiagents4pharma/talk2biomodels/tests/test_api.py +18 -14
- aiagents4pharma/talk2biomodels/tests/test_ask_question.py +8 -9
- aiagents4pharma/talk2biomodels/tests/test_basico_model.py +15 -9
- aiagents4pharma/talk2biomodels/tests/test_get_annotation.py +54 -55
- aiagents4pharma/talk2biomodels/tests/test_getmodelinfo.py +28 -27
- aiagents4pharma/talk2biomodels/tests/test_integration.py +21 -33
- aiagents4pharma/talk2biomodels/tests/test_load_biomodel.py +14 -11
- aiagents4pharma/talk2biomodels/tests/test_param_scan.py +21 -20
- aiagents4pharma/talk2biomodels/tests/test_query_article.py +129 -29
- aiagents4pharma/talk2biomodels/tests/test_search_models.py +9 -13
- aiagents4pharma/talk2biomodels/tests/test_simulate_model.py +16 -15
- aiagents4pharma/talk2biomodels/tests/test_steady_state.py +12 -22
- aiagents4pharma/talk2biomodels/tests/test_sys_bio_model.py +33 -29
- aiagents4pharma/talk2biomodels/tools/__init__.py +15 -12
- aiagents4pharma/talk2biomodels/tools/ask_question.py +42 -32
- aiagents4pharma/talk2biomodels/tools/custom_plotter.py +51 -43
- aiagents4pharma/talk2biomodels/tools/get_annotation.py +99 -75
- aiagents4pharma/talk2biomodels/tools/get_modelinfo.py +57 -51
- aiagents4pharma/talk2biomodels/tools/load_arguments.py +52 -32
- aiagents4pharma/talk2biomodels/tools/load_biomodel.py +8 -2
- aiagents4pharma/talk2biomodels/tools/parameter_scan.py +107 -90
- aiagents4pharma/talk2biomodels/tools/query_article.py +14 -13
- aiagents4pharma/talk2biomodels/tools/search_models.py +37 -26
- aiagents4pharma/talk2biomodels/tools/simulate_model.py +47 -37
- aiagents4pharma/talk2biomodels/tools/steady_state.py +76 -58
- aiagents4pharma/talk2biomodels/tools/utils.py +4 -3
- aiagents4pharma/talk2cells/README.md +1 -0
- aiagents4pharma/talk2cells/__init__.py +4 -5
- aiagents4pharma/talk2cells/agents/__init__.py +3 -2
- aiagents4pharma/talk2cells/agents/scp_agent.py +21 -19
- aiagents4pharma/talk2cells/states/__init__.py +3 -2
- aiagents4pharma/talk2cells/states/state_talk2cells.py +4 -2
- aiagents4pharma/talk2cells/tests/scp_agent/test_scp_agent.py +8 -9
- aiagents4pharma/talk2cells/tools/__init__.py +3 -2
- aiagents4pharma/talk2cells/tools/scp_agent/__init__.py +4 -4
- aiagents4pharma/talk2cells/tools/scp_agent/display_studies.py +5 -3
- aiagents4pharma/talk2cells/tools/scp_agent/search_studies.py +21 -22
- aiagents4pharma/talk2knowledgegraphs/.dockerignore +13 -0
- aiagents4pharma/talk2knowledgegraphs/Dockerfile +103 -0
- aiagents4pharma/talk2knowledgegraphs/README.md +1 -0
- aiagents4pharma/talk2knowledgegraphs/__init__.py +4 -7
- aiagents4pharma/talk2knowledgegraphs/agents/__init__.py +3 -2
- aiagents4pharma/talk2knowledgegraphs/agents/t2kg_agent.py +40 -30
- aiagents4pharma/talk2knowledgegraphs/configs/__init__.py +3 -6
- aiagents4pharma/talk2knowledgegraphs/configs/agents/t2kg_agent/__init__.py +2 -2
- aiagents4pharma/talk2knowledgegraphs/configs/agents/t2kg_agent/default.yaml +8 -8
- aiagents4pharma/talk2knowledgegraphs/configs/app/__init__.py +3 -2
- aiagents4pharma/talk2knowledgegraphs/configs/app/frontend/__init__.py +2 -2
- aiagents4pharma/talk2knowledgegraphs/configs/app/frontend/default.yaml +1 -1
- aiagents4pharma/talk2knowledgegraphs/configs/config.yaml +1 -1
- aiagents4pharma/talk2knowledgegraphs/configs/tools/__init__.py +4 -5
- aiagents4pharma/talk2knowledgegraphs/configs/tools/graphrag_reasoning/__init__.py +2 -2
- aiagents4pharma/talk2knowledgegraphs/configs/tools/graphrag_reasoning/default.yaml +1 -1
- aiagents4pharma/talk2knowledgegraphs/configs/tools/subgraph_extraction/__init__.py +2 -2
- aiagents4pharma/talk2knowledgegraphs/configs/tools/subgraph_extraction/default.yaml +1 -1
- aiagents4pharma/talk2knowledgegraphs/configs/tools/subgraph_summarization/__init__.py +2 -2
- aiagents4pharma/talk2knowledgegraphs/configs/tools/subgraph_summarization/default.yaml +1 -1
- aiagents4pharma/talk2knowledgegraphs/configs/utils/enrichments/ols_terms/default.yaml +1 -1
- aiagents4pharma/talk2knowledgegraphs/configs/utils/enrichments/reactome_pathways/default.yaml +1 -1
- aiagents4pharma/talk2knowledgegraphs/configs/utils/enrichments/uniprot_proteins/default.yaml +1 -1
- aiagents4pharma/talk2knowledgegraphs/configs/utils/pubchem_utils/default.yaml +1 -1
- aiagents4pharma/talk2knowledgegraphs/datasets/__init__.py +4 -6
- aiagents4pharma/talk2knowledgegraphs/datasets/biobridge_primekg.py +115 -67
- aiagents4pharma/talk2knowledgegraphs/datasets/dataset.py +2 -0
- aiagents4pharma/talk2knowledgegraphs/datasets/primekg.py +35 -24
- aiagents4pharma/talk2knowledgegraphs/datasets/starkqa_primekg.py +29 -21
- aiagents4pharma/talk2knowledgegraphs/docker-compose/cpu/.env.example +23 -0
- aiagents4pharma/talk2knowledgegraphs/docker-compose/cpu/docker-compose.yml +93 -0
- aiagents4pharma/talk2knowledgegraphs/docker-compose/gpu/.env.example +23 -0
- aiagents4pharma/talk2knowledgegraphs/docker-compose/gpu/docker-compose.yml +108 -0
- aiagents4pharma/talk2knowledgegraphs/entrypoint.sh +190 -0
- aiagents4pharma/talk2knowledgegraphs/install.md +140 -0
- aiagents4pharma/talk2knowledgegraphs/milvus_data_dump.py +31 -65
- aiagents4pharma/talk2knowledgegraphs/states/__init__.py +3 -2
- aiagents4pharma/talk2knowledgegraphs/states/state_talk2knowledgegraphs.py +1 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_agents_t2kg_agent.py +65 -40
- aiagents4pharma/talk2knowledgegraphs/tests/test_datasets_biobridge_primekg.py +54 -48
- aiagents4pharma/talk2knowledgegraphs/tests/test_datasets_dataset.py +4 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_datasets_primekg.py +17 -4
- aiagents4pharma/talk2knowledgegraphs/tests/test_datasets_starkqa_primekg.py +33 -24
- aiagents4pharma/talk2knowledgegraphs/tests/test_tools_graphrag_reasoning.py +116 -69
- aiagents4pharma/talk2knowledgegraphs/tests/test_tools_milvus_multimodal_subgraph_extraction.py +334 -216
- aiagents4pharma/talk2knowledgegraphs/tests/test_tools_multimodal_subgraph_extraction.py +22 -15
- aiagents4pharma/talk2knowledgegraphs/tests/test_tools_subgraph_extraction.py +19 -12
- aiagents4pharma/talk2knowledgegraphs/tests/test_tools_subgraph_summarization.py +95 -48
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_embeddings_embeddings.py +4 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_embeddings_huggingface.py +5 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_embeddings_nim_molmim.py +13 -18
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_embeddings_ollama.py +10 -3
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_enrichments.py +4 -3
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_ollama.py +3 -2
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_ols.py +1 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_pubchem.py +9 -4
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_reactome.py +6 -6
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_uniprot.py +4 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_extractions_milvus_multimodal_pcst.py +160 -97
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_kg_utils.py +3 -4
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_pubchem_utils.py +87 -13
- aiagents4pharma/talk2knowledgegraphs/tools/__init__.py +10 -7
- aiagents4pharma/talk2knowledgegraphs/tools/graphrag_reasoning.py +15 -20
- aiagents4pharma/talk2knowledgegraphs/tools/milvus_multimodal_subgraph_extraction.py +145 -142
- aiagents4pharma/talk2knowledgegraphs/tools/multimodal_subgraph_extraction.py +92 -90
- aiagents4pharma/talk2knowledgegraphs/tools/subgraph_extraction.py +25 -37
- aiagents4pharma/talk2knowledgegraphs/tools/subgraph_summarization.py +10 -13
- aiagents4pharma/talk2knowledgegraphs/utils/__init__.py +4 -7
- aiagents4pharma/talk2knowledgegraphs/utils/embeddings/__init__.py +4 -7
- aiagents4pharma/talk2knowledgegraphs/utils/embeddings/embeddings.py +4 -0
- aiagents4pharma/talk2knowledgegraphs/utils/embeddings/huggingface.py +11 -14
- aiagents4pharma/talk2knowledgegraphs/utils/embeddings/nim_molmim.py +7 -7
- aiagents4pharma/talk2knowledgegraphs/utils/embeddings/ollama.py +12 -6
- aiagents4pharma/talk2knowledgegraphs/utils/embeddings/sentence_transformer.py +8 -6
- aiagents4pharma/talk2knowledgegraphs/utils/enrichments/__init__.py +9 -6
- aiagents4pharma/talk2knowledgegraphs/utils/enrichments/enrichments.py +1 -0
- aiagents4pharma/talk2knowledgegraphs/utils/enrichments/ollama.py +15 -9
- aiagents4pharma/talk2knowledgegraphs/utils/enrichments/ols_terms.py +23 -20
- aiagents4pharma/talk2knowledgegraphs/utils/enrichments/pubchem_strings.py +12 -10
- aiagents4pharma/talk2knowledgegraphs/utils/enrichments/reactome_pathways.py +16 -10
- aiagents4pharma/talk2knowledgegraphs/utils/enrichments/uniprot_proteins.py +26 -18
- aiagents4pharma/talk2knowledgegraphs/utils/extractions/__init__.py +4 -5
- aiagents4pharma/talk2knowledgegraphs/utils/extractions/milvus_multimodal_pcst.py +14 -34
- aiagents4pharma/talk2knowledgegraphs/utils/extractions/multimodal_pcst.py +53 -47
- aiagents4pharma/talk2knowledgegraphs/utils/extractions/pcst.py +18 -14
- aiagents4pharma/talk2knowledgegraphs/utils/kg_utils.py +22 -23
- aiagents4pharma/talk2knowledgegraphs/utils/pubchem_utils.py +11 -10
- aiagents4pharma/talk2scholars/.dockerignore +13 -0
- aiagents4pharma/talk2scholars/Dockerfile +104 -0
- aiagents4pharma/talk2scholars/README.md +1 -0
- aiagents4pharma/talk2scholars/agents/__init__.py +1 -5
- aiagents4pharma/talk2scholars/agents/main_agent.py +6 -4
- aiagents4pharma/talk2scholars/agents/paper_download_agent.py +5 -4
- aiagents4pharma/talk2scholars/agents/pdf_agent.py +4 -2
- aiagents4pharma/talk2scholars/agents/s2_agent.py +2 -2
- aiagents4pharma/talk2scholars/agents/zotero_agent.py +10 -11
- aiagents4pharma/talk2scholars/configs/__init__.py +1 -3
- aiagents4pharma/talk2scholars/configs/agents/talk2scholars/__init__.py +1 -4
- aiagents4pharma/talk2scholars/configs/agents/talk2scholars/main_agent/default.yaml +1 -1
- aiagents4pharma/talk2scholars/configs/agents/talk2scholars/pdf_agent/default.yaml +1 -1
- aiagents4pharma/talk2scholars/configs/agents/talk2scholars/s2_agent/default.yaml +8 -8
- aiagents4pharma/talk2scholars/configs/agents/talk2scholars/zotero_agent/default.yaml +7 -7
- aiagents4pharma/talk2scholars/configs/tools/__init__.py +8 -6
- aiagents4pharma/talk2scholars/docker-compose/cpu/.env.example +21 -0
- aiagents4pharma/talk2scholars/docker-compose/cpu/docker-compose.yml +90 -0
- aiagents4pharma/talk2scholars/docker-compose/gpu/.env.example +21 -0
- aiagents4pharma/talk2scholars/docker-compose/gpu/docker-compose.yml +105 -0
- aiagents4pharma/talk2scholars/install.md +122 -0
- aiagents4pharma/talk2scholars/state/state_talk2scholars.py +8 -8
- aiagents4pharma/talk2scholars/tests/{test_main_agent.py → test_agents_main_agent.py} +41 -23
- aiagents4pharma/talk2scholars/tests/{test_paper_download_agent.py → test_agents_paper_agents_download_agent.py} +10 -16
- aiagents4pharma/talk2scholars/tests/{test_pdf_agent.py → test_agents_pdf_agent.py} +6 -10
- aiagents4pharma/talk2scholars/tests/{test_s2_agent.py → test_agents_s2_agent.py} +8 -16
- aiagents4pharma/talk2scholars/tests/{test_zotero_agent.py → test_agents_zotero_agent.py} +5 -7
- aiagents4pharma/talk2scholars/tests/{test_s2_display_dataframe.py → test_s2_tools_display_dataframe.py} +6 -7
- aiagents4pharma/talk2scholars/tests/{test_s2_query_dataframe.py → test_s2_tools_query_dataframe.py} +5 -15
- aiagents4pharma/talk2scholars/tests/{test_paper_downloader.py → test_tools_paper_downloader.py} +25 -63
- aiagents4pharma/talk2scholars/tests/{test_question_and_answer_tool.py → test_tools_question_and_answer_tool.py} +2 -6
- aiagents4pharma/talk2scholars/tests/{test_s2_multi.py → test_tools_s2_multi.py} +5 -5
- aiagents4pharma/talk2scholars/tests/{test_s2_retrieve.py → test_tools_s2_retrieve.py} +2 -1
- aiagents4pharma/talk2scholars/tests/{test_s2_search.py → test_tools_s2_search.py} +5 -5
- aiagents4pharma/talk2scholars/tests/{test_s2_single.py → test_tools_s2_single.py} +5 -5
- aiagents4pharma/talk2scholars/tests/{test_arxiv_downloader.py → test_utils_arxiv_downloader.py} +16 -25
- aiagents4pharma/talk2scholars/tests/{test_base_paper_downloader.py → test_utils_base_paper_downloader.py} +25 -47
- aiagents4pharma/talk2scholars/tests/{test_biorxiv_downloader.py → test_utils_biorxiv_downloader.py} +14 -42
- aiagents4pharma/talk2scholars/tests/{test_medrxiv_downloader.py → test_utils_medrxiv_downloader.py} +15 -49
- aiagents4pharma/talk2scholars/tests/{test_nvidia_nim_reranker.py → test_utils_nvidia_nim_reranker.py} +6 -16
- aiagents4pharma/talk2scholars/tests/{test_pdf_answer_formatter.py → test_utils_pdf_answer_formatter.py} +1 -0
- aiagents4pharma/talk2scholars/tests/{test_pdf_batch_processor.py → test_utils_pdf_batch_processor.py} +6 -15
- aiagents4pharma/talk2scholars/tests/{test_pdf_collection_manager.py → test_utils_pdf_collection_manager.py} +34 -11
- aiagents4pharma/talk2scholars/tests/{test_pdf_document_processor.py → test_utils_pdf_document_processor.py} +2 -3
- aiagents4pharma/talk2scholars/tests/{test_pdf_generate_answer.py → test_utils_pdf_generate_answer.py} +3 -6
- aiagents4pharma/talk2scholars/tests/{test_pdf_gpu_detection.py → test_utils_pdf_gpu_detection.py} +5 -16
- aiagents4pharma/talk2scholars/tests/{test_pdf_rag_pipeline.py → test_utils_pdf_rag_pipeline.py} +7 -17
- aiagents4pharma/talk2scholars/tests/{test_pdf_retrieve_chunks.py → test_utils_pdf_retrieve_chunks.py} +4 -11
- aiagents4pharma/talk2scholars/tests/{test_pdf_singleton_manager.py → test_utils_pdf_singleton_manager.py} +26 -23
- aiagents4pharma/talk2scholars/tests/{test_pdf_vector_normalization.py → test_utils_pdf_vector_normalization.py} +1 -1
- aiagents4pharma/talk2scholars/tests/{test_pdf_vector_store.py → test_utils_pdf_vector_store.py} +27 -55
- aiagents4pharma/talk2scholars/tests/{test_pubmed_downloader.py → test_utils_pubmed_downloader.py} +31 -91
- aiagents4pharma/talk2scholars/tests/{test_read_helper_utils.py → test_utils_read_helper_utils.py} +2 -6
- aiagents4pharma/talk2scholars/tests/{test_s2_utils_ext_ids.py → test_utils_s2_utils_ext_ids.py} +5 -15
- aiagents4pharma/talk2scholars/tests/{test_zotero_human_in_the_loop.py → test_utils_zotero_human_in_the_loop.py} +6 -13
- aiagents4pharma/talk2scholars/tests/{test_zotero_path.py → test_utils_zotero_path.py} +53 -45
- aiagents4pharma/talk2scholars/tests/{test_zotero_read.py → test_utils_zotero_read.py} +30 -91
- aiagents4pharma/talk2scholars/tests/{test_zotero_write.py → test_utils_zotero_write.py} +6 -16
- aiagents4pharma/talk2scholars/tools/__init__.py +1 -4
- aiagents4pharma/talk2scholars/tools/paper_download/paper_downloader.py +20 -35
- aiagents4pharma/talk2scholars/tools/paper_download/utils/__init__.py +7 -5
- aiagents4pharma/talk2scholars/tools/paper_download/utils/arxiv_downloader.py +9 -11
- aiagents4pharma/talk2scholars/tools/paper_download/utils/base_paper_downloader.py +14 -21
- aiagents4pharma/talk2scholars/tools/paper_download/utils/biorxiv_downloader.py +14 -22
- aiagents4pharma/talk2scholars/tools/paper_download/utils/medrxiv_downloader.py +11 -13
- aiagents4pharma/talk2scholars/tools/paper_download/utils/pubmed_downloader.py +14 -28
- aiagents4pharma/talk2scholars/tools/pdf/question_and_answer.py +4 -8
- aiagents4pharma/talk2scholars/tools/pdf/utils/__init__.py +16 -14
- aiagents4pharma/talk2scholars/tools/pdf/utils/answer_formatter.py +4 -4
- aiagents4pharma/talk2scholars/tools/pdf/utils/batch_processor.py +15 -17
- aiagents4pharma/talk2scholars/tools/pdf/utils/collection_manager.py +2 -2
- aiagents4pharma/talk2scholars/tools/pdf/utils/document_processor.py +5 -5
- aiagents4pharma/talk2scholars/tools/pdf/utils/generate_answer.py +4 -4
- aiagents4pharma/talk2scholars/tools/pdf/utils/get_vectorstore.py +2 -6
- aiagents4pharma/talk2scholars/tools/pdf/utils/gpu_detection.py +5 -9
- aiagents4pharma/talk2scholars/tools/pdf/utils/nvidia_nim_reranker.py +4 -4
- aiagents4pharma/talk2scholars/tools/pdf/utils/paper_loader.py +2 -2
- aiagents4pharma/talk2scholars/tools/pdf/utils/rag_pipeline.py +6 -15
- aiagents4pharma/talk2scholars/tools/pdf/utils/retrieve_chunks.py +7 -15
- aiagents4pharma/talk2scholars/tools/pdf/utils/singleton_manager.py +2 -2
- aiagents4pharma/talk2scholars/tools/pdf/utils/tool_helper.py +3 -4
- aiagents4pharma/talk2scholars/tools/pdf/utils/vector_normalization.py +8 -17
- aiagents4pharma/talk2scholars/tools/pdf/utils/vector_store.py +17 -33
- aiagents4pharma/talk2scholars/tools/s2/__init__.py +8 -6
- aiagents4pharma/talk2scholars/tools/s2/display_dataframe.py +3 -7
- aiagents4pharma/talk2scholars/tools/s2/multi_paper_rec.py +7 -6
- aiagents4pharma/talk2scholars/tools/s2/query_dataframe.py +5 -12
- aiagents4pharma/talk2scholars/tools/s2/retrieve_semantic_scholar_paper_id.py +2 -4
- aiagents4pharma/talk2scholars/tools/s2/search.py +6 -6
- aiagents4pharma/talk2scholars/tools/s2/single_paper_rec.py +5 -3
- aiagents4pharma/talk2scholars/tools/s2/utils/__init__.py +1 -3
- aiagents4pharma/talk2scholars/tools/s2/utils/multi_helper.py +12 -18
- aiagents4pharma/talk2scholars/tools/s2/utils/search_helper.py +11 -18
- aiagents4pharma/talk2scholars/tools/s2/utils/single_helper.py +11 -16
- aiagents4pharma/talk2scholars/tools/zotero/__init__.py +1 -4
- aiagents4pharma/talk2scholars/tools/zotero/utils/__init__.py +1 -4
- aiagents4pharma/talk2scholars/tools/zotero/utils/read_helper.py +21 -39
- aiagents4pharma/talk2scholars/tools/zotero/utils/review_helper.py +2 -6
- aiagents4pharma/talk2scholars/tools/zotero/utils/write_helper.py +8 -11
- aiagents4pharma/talk2scholars/tools/zotero/utils/zotero_path.py +4 -12
- aiagents4pharma/talk2scholars/tools/zotero/utils/zotero_pdf_downloader.py +13 -27
- aiagents4pharma/talk2scholars/tools/zotero/zotero_read.py +4 -7
- aiagents4pharma/talk2scholars/tools/zotero/zotero_review.py +8 -10
- aiagents4pharma/talk2scholars/tools/zotero/zotero_write.py +3 -2
- {aiagents4pharma-1.44.0.dist-info → aiagents4pharma-1.45.1.dist-info}/METADATA +115 -51
- aiagents4pharma-1.45.1.dist-info/RECORD +324 -0
- {aiagents4pharma-1.44.0.dist-info → aiagents4pharma-1.45.1.dist-info}/WHEEL +1 -2
- aiagents4pharma-1.44.0.dist-info/RECORD +0 -293
- aiagents4pharma-1.44.0.dist-info/top_level.txt +0 -1
- /aiagents4pharma/talk2scholars/tests/{test_state.py → test_states_state.py} +0 -0
- /aiagents4pharma/talk2scholars/tests/{test_pdf_paper_loader.py → test_utils_pdf_paper_loader.py} +0 -0
- /aiagents4pharma/talk2scholars/tests/{test_tool_helper_utils.py → test_utils_tool_helper_utils.py} +0 -0
- /aiagents4pharma/talk2scholars/tests/{test_zotero_pdf_downloader_utils.py → test_utils_zotero_pdf_downloader_utils.py} +0 -0
- {aiagents4pharma-1.44.0.dist-info → aiagents4pharma-1.45.1.dist-info}/licenses/LICENSE +0 -0
@@ -4,46 +4,51 @@
|
|
4
4
|
Tool for searching models based on search query.
|
5
5
|
"""
|
6
6
|
|
7
|
-
from typing import Type, Annotated
|
8
7
|
import logging
|
9
|
-
from
|
8
|
+
from typing import Annotated
|
9
|
+
|
10
10
|
import pandas as pd
|
11
11
|
from basico import biomodels
|
12
|
-
from langgraph.types import Command
|
13
|
-
from langchain_core.tools import BaseTool
|
14
12
|
from langchain_core.messages import ToolMessage
|
13
|
+
from langchain_core.tools import BaseTool
|
15
14
|
from langchain_core.tools.base import InjectedToolCallId
|
15
|
+
from langgraph.types import Command
|
16
|
+
from pydantic import BaseModel, Field
|
16
17
|
|
17
18
|
# Initialize logger
|
18
19
|
logging.basicConfig(level=logging.INFO)
|
19
20
|
logger = logging.getLogger(__name__)
|
20
21
|
|
22
|
+
|
21
23
|
class SearchModelsInput(BaseModel):
|
22
24
|
"""
|
23
25
|
Input schema for the search models tool.
|
24
26
|
"""
|
27
|
+
|
25
28
|
query: str = Field(description="Search models query", default=None)
|
26
|
-
num_query: int = Field(description="Top number of models to search",
|
27
|
-
default=10,
|
28
|
-
le=100)
|
29
|
+
num_query: int = Field(description="Top number of models to search", default=10, le=100)
|
29
30
|
tool_call_id: Annotated[str, InjectedToolCallId]
|
30
31
|
|
32
|
+
|
31
33
|
# Note: It's important that every field has type hints. BaseTool is a
|
32
34
|
# Pydantic class and not having type hints can lead to unexpected behavior.
|
33
35
|
class SearchModelsTool(BaseTool):
|
34
36
|
"""
|
35
37
|
Tool for returning the search results based on the search query.
|
36
38
|
"""
|
39
|
+
|
37
40
|
name: str = "search_models"
|
38
41
|
description: str = "Search for only manually curated models in "
|
39
42
|
"the BioMmodels database based on keywords."
|
40
|
-
args_schema:
|
43
|
+
args_schema: type[BaseModel] = SearchModelsInput
|
41
44
|
return_direct: bool = False
|
42
45
|
|
43
|
-
def _run(
|
44
|
-
|
45
|
-
|
46
|
-
|
46
|
+
def _run(
|
47
|
+
self,
|
48
|
+
tool_call_id: Annotated[str, InjectedToolCallId],
|
49
|
+
query: str = None,
|
50
|
+
num_query: int = 10,
|
51
|
+
) -> dict:
|
47
52
|
"""
|
48
53
|
Run the tool.
|
49
54
|
|
@@ -55,8 +60,12 @@ class SearchModelsTool(BaseTool):
|
|
55
60
|
Returns:
|
56
61
|
dict: The answer to the question in the form of a dictionary.
|
57
62
|
"""
|
58
|
-
logger.log(
|
59
|
-
|
63
|
+
logger.log(
|
64
|
+
logging.INFO,
|
65
|
+
"Searching models with the query and number %s, %s",
|
66
|
+
query,
|
67
|
+
num_query,
|
68
|
+
)
|
60
69
|
# Search for models based on the query
|
61
70
|
search_results = biomodels.search_for_model(query, num_results=num_query)
|
62
71
|
# Convert the search results to a pandas DataFrame
|
@@ -69,17 +78,19 @@ class SearchModelsTool(BaseTool):
|
|
69
78
|
# to avoid hallucinations
|
70
79
|
content += f" Here is the summary of the first {first_n} models:"
|
71
80
|
for i in range(first_n):
|
72
|
-
content +=
|
81
|
+
content += (
|
82
|
+
f"\nModel {i + 1}: {search_results[i]['name']} (ID: {search_results[i]['id']})"
|
83
|
+
)
|
73
84
|
# Return the updated state of the tool
|
74
85
|
return Command(
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
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
|
+
)
|
@@ -5,49 +5,56 @@ Tool for simulating a model.
|
|
5
5
|
"""
|
6
6
|
|
7
7
|
import logging
|
8
|
-
from typing import
|
9
|
-
|
10
|
-
from langgraph.types import Command
|
11
|
-
from langgraph.prebuilt import InjectedState
|
12
|
-
from langchain_core.tools import BaseTool
|
8
|
+
from typing import Annotated
|
9
|
+
|
13
10
|
from langchain_core.messages import ToolMessage
|
11
|
+
from langchain_core.tools import BaseTool
|
14
12
|
from langchain_core.tools.base import InjectedToolCallId
|
15
|
-
from .
|
13
|
+
from langgraph.prebuilt import InjectedState
|
14
|
+
from langgraph.types import Command
|
15
|
+
from pydantic import BaseModel, Field
|
16
|
+
|
16
17
|
from .load_arguments import ArgumentData, add_rec_events
|
18
|
+
from .load_biomodel import ModelData, load_biomodel
|
17
19
|
from .utils import get_model_units
|
18
20
|
|
19
21
|
# Initialize logger
|
20
22
|
logging.basicConfig(level=logging.INFO)
|
21
23
|
logger = logging.getLogger(__name__)
|
22
24
|
|
25
|
+
|
23
26
|
class SimulateModelInput(BaseModel):
|
24
27
|
"""
|
25
28
|
Input schema for the SimulateModel tool.
|
26
29
|
"""
|
27
|
-
|
28
|
-
|
29
|
-
arg_data: ArgumentData = Field(
|
30
|
-
|
30
|
+
|
31
|
+
sys_bio_model: ModelData = Field(description="model data", default=None)
|
32
|
+
arg_data: ArgumentData = Field(
|
33
|
+
description="""time, species, and reocurring data
|
31
34
|
as well as the simulation name""",
|
32
|
-
|
35
|
+
default=None,
|
36
|
+
)
|
33
37
|
tool_call_id: Annotated[str, InjectedToolCallId]
|
34
38
|
state: Annotated[dict, InjectedState]
|
35
39
|
|
40
|
+
|
36
41
|
# Note: It's important that every field has type hints. BaseTool is a
|
37
42
|
# Pydantic class and not having type hints can lead to unexpected behavior.
|
38
43
|
class SimulateModelTool(BaseTool):
|
39
44
|
"""
|
40
45
|
Tool for simulating a model.
|
41
46
|
"""
|
47
|
+
|
42
48
|
name: str = "simulate_model"
|
43
49
|
description: str = "A tool to simulate a biomodel"
|
44
|
-
args_schema:
|
50
|
+
args_schema: type[BaseModel] = SimulateModelInput
|
45
51
|
|
46
|
-
def _run(
|
52
|
+
def _run(
|
53
|
+
self,
|
47
54
|
tool_call_id: Annotated[str, InjectedToolCallId],
|
48
55
|
state: Annotated[dict, InjectedState],
|
49
56
|
sys_bio_model: ModelData = None,
|
50
|
-
arg_data: ArgumentData = None
|
57
|
+
arg_data: ArgumentData = None,
|
51
58
|
) -> Command:
|
52
59
|
"""
|
53
60
|
Run the tool.
|
@@ -61,13 +68,9 @@ class SimulateModelTool(BaseTool):
|
|
61
68
|
Returns:
|
62
69
|
str: The result of the simulation.
|
63
70
|
"""
|
64
|
-
logger.log(logging.INFO,
|
65
|
-
|
66
|
-
|
67
|
-
arg_data)
|
68
|
-
sbml_file_path = state['sbml_file_path'][-1] if len(state['sbml_file_path']) > 0 else None
|
69
|
-
model_object = load_biomodel(sys_bio_model,
|
70
|
-
sbml_file_path=sbml_file_path)
|
71
|
+
logger.log(logging.INFO, "Calling simulate_model tool %s, %s", sys_bio_model, arg_data)
|
72
|
+
sbml_file_path = state["sbml_file_path"][-1] if len(state["sbml_file_path"]) > 0 else None
|
73
|
+
model_object = load_biomodel(sys_bio_model, sbml_file_path=sbml_file_path)
|
71
74
|
# Prepare the dictionary of species data
|
72
75
|
# that will be passed to the simulate method
|
73
76
|
# of the BasicoModel class
|
@@ -78,8 +81,12 @@ class SimulateModelTool(BaseTool):
|
|
78
81
|
# Prepare the dictionary of species data
|
79
82
|
if arg_data.species_to_be_analyzed_before_experiment is not None:
|
80
83
|
dic_species_to_be_analyzed_before_experiment = dict(
|
81
|
-
zip(
|
82
|
-
arg_data.species_to_be_analyzed_before_experiment.
|
84
|
+
zip(
|
85
|
+
arg_data.species_to_be_analyzed_before_experiment.species_name,
|
86
|
+
arg_data.species_to_be_analyzed_before_experiment.species_concentration,
|
87
|
+
strict=False,
|
88
|
+
)
|
89
|
+
)
|
83
90
|
# Add reocurring events (if any) to the model
|
84
91
|
if arg_data.reocurring_data is not None:
|
85
92
|
add_rec_events(model_object, arg_data.reocurring_data)
|
@@ -89,17 +96,19 @@ class SimulateModelTool(BaseTool):
|
|
89
96
|
interval = arg_data.time_data.interval
|
90
97
|
# Update the model parameters
|
91
98
|
model_object.update_parameters(dic_species_to_be_analyzed_before_experiment)
|
92
|
-
logger.log(
|
93
|
-
|
94
|
-
|
99
|
+
logger.log(
|
100
|
+
logging.INFO,
|
101
|
+
"Following species/parameters updated in the model %s",
|
102
|
+
dic_species_to_be_analyzed_before_experiment,
|
103
|
+
)
|
95
104
|
# Simulate the model
|
96
105
|
df = model_object.simulate(duration=duration, interval=interval)
|
97
106
|
logger.log(logging.INFO, "Simulation results ready with shape %s", df.shape)
|
98
107
|
dic_simulated_data = {
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
108
|
+
"name": arg_data.experiment_name,
|
109
|
+
"source": (sys_bio_model.biomodel_id if sys_bio_model.biomodel_id else "upload"),
|
110
|
+
"tool_call_id": tool_call_id,
|
111
|
+
"data": df.to_dict(),
|
103
112
|
}
|
104
113
|
# Prepare the dictionary of updated state
|
105
114
|
dic_updated_state_for_model = {}
|
@@ -107,19 +116,20 @@ class SimulateModelTool(BaseTool):
|
|
107
116
|
"model_id": [sys_bio_model.biomodel_id],
|
108
117
|
"sbml_file_path": [sbml_file_path],
|
109
118
|
"dic_simulated_data": [dic_simulated_data],
|
110
|
-
|
119
|
+
}.items():
|
111
120
|
if value:
|
112
121
|
dic_updated_state_for_model[key] = value
|
113
122
|
# Return the updated state of the tool
|
114
123
|
return Command(
|
115
|
-
|
124
|
+
update=dic_updated_state_for_model
|
125
|
+
| {
|
116
126
|
# update the message history
|
117
127
|
"messages": [
|
118
128
|
ToolMessage(
|
119
129
|
content=f"Simulation results of {arg_data.experiment_name}",
|
120
130
|
tool_call_id=tool_call_id,
|
121
|
-
artifact=get_model_units(model_object)
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
131
|
+
artifact=get_model_units(model_object),
|
132
|
+
)
|
133
|
+
],
|
134
|
+
}
|
135
|
+
)
|
@@ -5,23 +5,25 @@ Tool for parameter scan.
|
|
5
5
|
"""
|
6
6
|
|
7
7
|
import logging
|
8
|
-
from typing import
|
8
|
+
from typing import Annotated
|
9
|
+
|
9
10
|
import basico
|
10
|
-
from pydantic import BaseModel, Field
|
11
|
-
from langgraph.types import Command
|
12
|
-
from langgraph.prebuilt import InjectedState
|
13
|
-
from langchain_core.tools import BaseTool
|
14
11
|
from langchain_core.messages import ToolMessage
|
12
|
+
from langchain_core.tools import BaseTool
|
15
13
|
from langchain_core.tools.base import InjectedToolCallId
|
16
|
-
from .
|
14
|
+
from langgraph.prebuilt import InjectedState
|
15
|
+
from langgraph.types import Command
|
16
|
+
from pydantic import BaseModel, Field
|
17
|
+
|
17
18
|
from .load_arguments import ArgumentData, add_rec_events
|
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
|
|
23
|
-
|
24
|
-
|
25
|
+
|
26
|
+
def run_steady_state(model_object, dic_species_to_be_analyzed_before_experiment):
|
25
27
|
"""
|
26
28
|
Run the steady state analysis.
|
27
29
|
|
@@ -47,58 +49,65 @@ def run_steady_state(model_object,
|
|
47
49
|
df_steady_state = basico.model_info.get_species(model=model_object.copasi_model).reset_index()
|
48
50
|
# print (df_steady_state)
|
49
51
|
# Rename the column name to species_name
|
50
|
-
df_steady_state.rename(columns={
|
51
|
-
inplace=True)
|
52
|
+
df_steady_state.rename(columns={"name": "species_name"}, inplace=True)
|
52
53
|
# Rename the column concentration to steady_state_concentration
|
53
|
-
df_steady_state.rename(columns={
|
54
|
-
inplace=True)
|
54
|
+
df_steady_state.rename(columns={"concentration": "steady_state_concentration"}, inplace=True)
|
55
55
|
# Rename the column transition_time to steady_state_transition_time
|
56
|
-
df_steady_state.rename(
|
57
|
-
|
56
|
+
df_steady_state.rename(
|
57
|
+
columns={"transition_time": "steady_state_transition_time"}, inplace=True
|
58
|
+
)
|
58
59
|
# Drop some columns
|
59
|
-
df_steady_state.drop(
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
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
|
+
)
|
71
74
|
logger.log(logging.INFO, "Steady state results with shape %s", df_steady_state.shape)
|
72
75
|
return df_steady_state
|
73
76
|
|
77
|
+
|
74
78
|
class SteadyStateInput(BaseModel):
|
75
79
|
"""
|
76
80
|
Input schema for the steady state tool.
|
77
81
|
"""
|
78
|
-
|
79
|
-
|
82
|
+
|
83
|
+
sys_bio_model: ModelData = Field(description="model data", default=None)
|
80
84
|
arg_data: ArgumentData = Field(
|
81
85
|
description="time, species, and reocurring data"
|
82
|
-
|
83
|
-
|
86
|
+
" that must be set before the steady state analysis"
|
87
|
+
" as well as the experiment name",
|
88
|
+
default=None,
|
89
|
+
)
|
84
90
|
tool_call_id: Annotated[str, InjectedToolCallId]
|
85
91
|
state: Annotated[dict, InjectedState]
|
86
92
|
|
93
|
+
|
87
94
|
# Note: It's important that every field has type hints. BaseTool is a
|
88
95
|
# Pydantic class and not having type hints can lead to unexpected behavior.
|
89
96
|
class SteadyStateTool(BaseTool):
|
90
97
|
"""
|
91
98
|
Tool to bring a model to steady state.
|
92
99
|
"""
|
100
|
+
|
93
101
|
name: str = "steady_state"
|
94
102
|
description: str = "A tool to bring a model to steady state."
|
95
|
-
args_schema:
|
103
|
+
args_schema: type[BaseModel] = SteadyStateInput
|
96
104
|
|
97
|
-
def _run(
|
105
|
+
def _run(
|
106
|
+
self,
|
98
107
|
tool_call_id: Annotated[str, InjectedToolCallId],
|
99
108
|
state: Annotated[dict, InjectedState],
|
100
109
|
sys_bio_model: ModelData = None,
|
101
|
-
arg_data: ArgumentData = None
|
110
|
+
arg_data: ArgumentData = None,
|
102
111
|
) -> Command:
|
103
112
|
"""
|
104
113
|
Run the tool.
|
@@ -112,12 +121,15 @@ class SteadyStateTool(BaseTool):
|
|
112
121
|
Returns:
|
113
122
|
Command: The updated state of the tool.
|
114
123
|
"""
|
115
|
-
logger.log(
|
116
|
-
|
124
|
+
logger.log(
|
125
|
+
logging.INFO,
|
126
|
+
"Calling the steady_state tool %s, %s",
|
127
|
+
sys_bio_model,
|
128
|
+
arg_data,
|
129
|
+
)
|
117
130
|
# print (f'Calling steady_state tool {sys_bio_model}, {arg_data}, {tool_call_id}')
|
118
|
-
sbml_file_path = state[
|
119
|
-
model_object = load_biomodel(sys_bio_model,
|
120
|
-
sbml_file_path=sbml_file_path)
|
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)
|
121
133
|
# Prepare the dictionary of species data
|
122
134
|
# that will be passed to the simulate method
|
123
135
|
# of the BasicoModel class
|
@@ -126,44 +138,50 @@ class SteadyStateTool(BaseTool):
|
|
126
138
|
# Prepare the dictionary of species data
|
127
139
|
if arg_data.species_to_be_analyzed_before_experiment is not None:
|
128
140
|
dic_species_to_be_analyzed_before_experiment = dict(
|
129
|
-
zip(
|
130
|
-
arg_data.species_to_be_analyzed_before_experiment.
|
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
|
+
)
|
131
147
|
# Add reocurring events (if any) to the model
|
132
148
|
if arg_data.reocurring_data is not None:
|
133
149
|
add_rec_events(model_object, arg_data.reocurring_data)
|
134
150
|
# Run the parameter scan
|
135
|
-
df_steady_state = run_steady_state(
|
136
|
-
|
137
|
-
|
151
|
+
df_steady_state = run_steady_state(
|
152
|
+
model_object, dic_species_to_be_analyzed_before_experiment
|
153
|
+
)
|
154
|
+
print(df_steady_state)
|
138
155
|
# Prepare the dictionary of scanned data
|
139
156
|
# that will be passed to the state of the graph
|
140
157
|
dic_steady_state_data = {
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
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"),
|
145
162
|
}
|
146
163
|
# Prepare the dictionary of updated state for the model
|
147
164
|
dic_updated_state_for_model = {}
|
148
165
|
for key, value in {
|
149
166
|
"model_id": [sys_bio_model.biomodel_id],
|
150
167
|
"sbml_file_path": [sbml_file_path],
|
151
|
-
"dic_steady_state_data": [dic_steady_state_data]
|
152
|
-
|
168
|
+
"dic_steady_state_data": [dic_steady_state_data],
|
169
|
+
}.items():
|
153
170
|
if value:
|
154
171
|
dic_updated_state_for_model[key] = value
|
155
172
|
# Return the updated state
|
156
173
|
return Command(
|
157
|
-
|
174
|
+
update=dic_updated_state_for_model
|
175
|
+
| {
|
158
176
|
# Update the message history
|
159
177
|
"messages": [
|
160
|
-
|
178
|
+
ToolMessage(
|
161
179
|
content=f"Steady state analysis of"
|
162
|
-
|
163
|
-
|
180
|
+
f" {arg_data.experiment_name}"
|
181
|
+
" was successful.",
|
164
182
|
tool_call_id=tool_call_id,
|
165
|
-
artifact={
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
183
|
+
artifact={"dic_data": df_steady_state.to_dict(orient="records")},
|
184
|
+
)
|
185
|
+
],
|
186
|
+
}
|
187
|
+
)
|
@@ -6,6 +6,7 @@ Utility functions for T2B tools.
|
|
6
6
|
|
7
7
|
import basico
|
8
8
|
|
9
|
+
|
9
10
|
def get_model_units(model_object):
|
10
11
|
"""
|
11
12
|
Get the units of the model.
|
@@ -17,6 +18,6 @@ def get_model_units(model_object):
|
|
17
18
|
dict: The units of the model.
|
18
19
|
"""
|
19
20
|
model_units = basico.model_info.get_model_units(model=model_object.copasi_model)
|
20
|
-
model_units_y = model_units[
|
21
|
-
model_units_x = model_units[
|
22
|
-
return {
|
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.
|
@@ -1,31 +1,35 @@
|
|
1
|
-
|
1
|
+
# /usr/bin/env python3
|
2
2
|
|
3
|
-
|
3
|
+
"""
|
4
4
|
This is the agent file for the Talk2Cells graph.
|
5
|
-
|
5
|
+
"""
|
6
6
|
|
7
7
|
import logging
|
8
8
|
import os
|
9
|
+
|
9
10
|
from langchain_openai import ChatOpenAI
|
10
11
|
from langgraph.checkpoint.memory import MemorySaver
|
11
12
|
from langgraph.graph import START, StateGraph
|
12
|
-
from langgraph.prebuilt import
|
13
|
-
|
14
|
-
from ..tools.scp_agent.display_studies import display_studies
|
13
|
+
from langgraph.prebuilt import ToolNode, create_react_agent
|
14
|
+
|
15
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
|
16
18
|
|
17
19
|
# Initialize logger
|
18
20
|
logging.basicConfig(level=logging.INFO)
|
19
21
|
logger = logging.getLogger(__name__)
|
20
22
|
|
23
|
+
|
21
24
|
def get_app(uniq_id):
|
22
|
-
|
25
|
+
"""
|
23
26
|
This function returns the langraph app.
|
24
|
-
|
27
|
+
"""
|
28
|
+
|
25
29
|
def agent_scp_node(state: Talk2Cells):
|
26
|
-
|
30
|
+
"""
|
27
31
|
This function calls the model.
|
28
|
-
|
32
|
+
"""
|
29
33
|
logger.log(logging.INFO, "Creating SCP_Agent node with thread_id %s", uniq_id)
|
30
34
|
# Get the messages from the state
|
31
35
|
# messages = state['messages']
|
@@ -48,19 +52,17 @@ def get_app(uniq_id):
|
|
48
52
|
# Create an environment variable to store the LLM model
|
49
53
|
# Check if the environment variable AIAGENTS4PHARMA_LLM_MODEL is set
|
50
54
|
# If not, set it to 'gpt-4o-mini'
|
51
|
-
llm_model = os.getenv(
|
55
|
+
llm_model = os.getenv("AIAGENTS4PHARMA_LLM_MODEL", "gpt-4o-mini")
|
52
56
|
# print (f'LLM model: {llm_model}')
|
53
57
|
# llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
|
54
58
|
llm = ChatOpenAI(model=llm_model, temperature=0)
|
55
59
|
model = create_react_agent(
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
checkpointer=MemorySaver()
|
63
|
-
)
|
60
|
+
llm,
|
61
|
+
tools=tools,
|
62
|
+
state_schema=Talk2Cells,
|
63
|
+
state_modifier=("You are Talk2Cells agent."),
|
64
|
+
checkpointer=MemorySaver(),
|
65
|
+
)
|
64
66
|
|
65
67
|
# Define a new graph
|
66
68
|
workflow = StateGraph(Talk2Cells)
|
@@ -1,13 +1,15 @@
|
|
1
1
|
#!/usr/bin/env python3
|
2
2
|
|
3
|
-
|
3
|
+
"""
|
4
4
|
This is the state file for the Talk2Cells agent.
|
5
|
-
|
5
|
+
"""
|
6
6
|
|
7
7
|
from langgraph.prebuilt.chat_agent_executor import AgentState
|
8
8
|
|
9
|
+
|
9
10
|
class Talk2Cells(AgentState):
|
10
11
|
"""
|
11
12
|
The state for the Talk2Cells agent.
|
12
13
|
"""
|
14
|
+
|
13
15
|
search_table: str
|
@@ -1,23 +1,22 @@
|
|
1
|
-
|
1
|
+
"""
|
2
2
|
Test cases for the search_studies
|
3
|
-
|
3
|
+
"""
|
4
4
|
|
5
5
|
# from ..tools.search_studies import search_studies
|
6
|
-
from aiagents4pharma.talk2cells.agents.scp_agent import get_app
|
7
6
|
from langchain_core.messages import HumanMessage
|
8
7
|
|
8
|
+
from aiagents4pharma.talk2cells.agents.scp_agent import get_app
|
9
|
+
|
10
|
+
|
9
11
|
def test_agent_scp():
|
10
|
-
|
12
|
+
"""
|
11
13
|
Test the agent_scp.
|
12
|
-
|
14
|
+
"""
|
13
15
|
unique_id = 12345
|
14
16
|
app = get_app(unique_id)
|
15
17
|
config = {"configurable": {"thread_id": unique_id}}
|
16
18
|
prompt = "Search for studies on Crohns Disease."
|
17
|
-
response = app.invoke(
|
18
|
-
{"messages": [HumanMessage(content=prompt)]},
|
19
|
-
config=config
|
20
|
-
)
|
19
|
+
response = app.invoke({"messages": [HumanMessage(content=prompt)]}, config=config)
|
21
20
|
assistant_msg = response["messages"][-1].content
|
22
21
|
# Check if the assistant message is a string
|
23
22
|
assert isinstance(assistant_msg, str)
|