aiagents4pharma 0.0.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- aiagents4pharma/__init__.py +11 -0
- aiagents4pharma/talk2aiagents4pharma/.dockerignore +13 -0
- aiagents4pharma/talk2aiagents4pharma/Dockerfile +133 -0
- aiagents4pharma/talk2aiagents4pharma/README.md +1 -0
- aiagents4pharma/talk2aiagents4pharma/__init__.py +5 -0
- aiagents4pharma/talk2aiagents4pharma/agents/__init__.py +6 -0
- aiagents4pharma/talk2aiagents4pharma/agents/main_agent.py +70 -0
- aiagents4pharma/talk2aiagents4pharma/configs/__init__.py +5 -0
- aiagents4pharma/talk2aiagents4pharma/configs/agents/__init__.py +5 -0
- aiagents4pharma/talk2aiagents4pharma/configs/agents/main_agent/default.yaml +29 -0
- aiagents4pharma/talk2aiagents4pharma/configs/app/__init__.py +0 -0
- aiagents4pharma/talk2aiagents4pharma/configs/app/frontend/__init__.py +0 -0
- aiagents4pharma/talk2aiagents4pharma/configs/app/frontend/default.yaml +102 -0
- aiagents4pharma/talk2aiagents4pharma/configs/config.yaml +4 -0
- aiagents4pharma/talk2aiagents4pharma/docker-compose/cpu/.env.example +23 -0
- aiagents4pharma/talk2aiagents4pharma/docker-compose/cpu/docker-compose.yml +93 -0
- aiagents4pharma/talk2aiagents4pharma/docker-compose/gpu/.env.example +23 -0
- aiagents4pharma/talk2aiagents4pharma/docker-compose/gpu/docker-compose.yml +108 -0
- aiagents4pharma/talk2aiagents4pharma/install.md +154 -0
- aiagents4pharma/talk2aiagents4pharma/states/__init__.py +5 -0
- aiagents4pharma/talk2aiagents4pharma/states/state_talk2aiagents4pharma.py +18 -0
- aiagents4pharma/talk2aiagents4pharma/tests/__init__.py +3 -0
- aiagents4pharma/talk2aiagents4pharma/tests/test_main_agent.py +312 -0
- aiagents4pharma/talk2biomodels/.dockerignore +13 -0
- aiagents4pharma/talk2biomodels/Dockerfile +104 -0
- aiagents4pharma/talk2biomodels/README.md +1 -0
- aiagents4pharma/talk2biomodels/__init__.py +5 -0
- aiagents4pharma/talk2biomodels/agents/__init__.py +6 -0
- aiagents4pharma/talk2biomodels/agents/t2b_agent.py +104 -0
- aiagents4pharma/talk2biomodels/api/__init__.py +5 -0
- aiagents4pharma/talk2biomodels/api/ols.py +75 -0
- aiagents4pharma/talk2biomodels/api/uniprot.py +36 -0
- aiagents4pharma/talk2biomodels/configs/__init__.py +5 -0
- aiagents4pharma/talk2biomodels/configs/agents/__init__.py +5 -0
- aiagents4pharma/talk2biomodels/configs/agents/t2b_agent/__init__.py +3 -0
- aiagents4pharma/talk2biomodels/configs/agents/t2b_agent/default.yaml +14 -0
- aiagents4pharma/talk2biomodels/configs/app/__init__.py +0 -0
- aiagents4pharma/talk2biomodels/configs/app/frontend/__init__.py +0 -0
- aiagents4pharma/talk2biomodels/configs/app/frontend/default.yaml +72 -0
- aiagents4pharma/talk2biomodels/configs/config.yaml +7 -0
- aiagents4pharma/talk2biomodels/configs/tools/__init__.py +5 -0
- aiagents4pharma/talk2biomodels/configs/tools/ask_question/__init__.py +3 -0
- aiagents4pharma/talk2biomodels/configs/tools/ask_question/default.yaml +30 -0
- aiagents4pharma/talk2biomodels/configs/tools/custom_plotter/__init__.py +3 -0
- aiagents4pharma/talk2biomodels/configs/tools/custom_plotter/default.yaml +8 -0
- aiagents4pharma/talk2biomodels/configs/tools/get_annotation/__init__.py +3 -0
- aiagents4pharma/talk2biomodels/configs/tools/get_annotation/default.yaml +8 -0
- aiagents4pharma/talk2biomodels/install.md +63 -0
- aiagents4pharma/talk2biomodels/models/__init__.py +5 -0
- aiagents4pharma/talk2biomodels/models/basico_model.py +125 -0
- aiagents4pharma/talk2biomodels/models/sys_bio_model.py +60 -0
- aiagents4pharma/talk2biomodels/states/__init__.py +6 -0
- aiagents4pharma/talk2biomodels/states/state_talk2biomodels.py +49 -0
- aiagents4pharma/talk2biomodels/tests/BIOMD0000000449_url.xml +1585 -0
- aiagents4pharma/talk2biomodels/tests/__init__.py +3 -0
- aiagents4pharma/talk2biomodels/tests/article_on_model_537.pdf +0 -0
- aiagents4pharma/talk2biomodels/tests/test_api.py +31 -0
- aiagents4pharma/talk2biomodels/tests/test_ask_question.py +42 -0
- aiagents4pharma/talk2biomodels/tests/test_basico_model.py +67 -0
- aiagents4pharma/talk2biomodels/tests/test_get_annotation.py +190 -0
- aiagents4pharma/talk2biomodels/tests/test_getmodelinfo.py +92 -0
- aiagents4pharma/talk2biomodels/tests/test_integration.py +116 -0
- aiagents4pharma/talk2biomodels/tests/test_load_biomodel.py +35 -0
- aiagents4pharma/talk2biomodels/tests/test_param_scan.py +71 -0
- aiagents4pharma/talk2biomodels/tests/test_query_article.py +184 -0
- aiagents4pharma/talk2biomodels/tests/test_save_model.py +47 -0
- aiagents4pharma/talk2biomodels/tests/test_search_models.py +35 -0
- aiagents4pharma/talk2biomodels/tests/test_simulate_model.py +44 -0
- aiagents4pharma/talk2biomodels/tests/test_steady_state.py +86 -0
- aiagents4pharma/talk2biomodels/tests/test_sys_bio_model.py +67 -0
- aiagents4pharma/talk2biomodels/tools/__init__.py +17 -0
- aiagents4pharma/talk2biomodels/tools/ask_question.py +125 -0
- aiagents4pharma/talk2biomodels/tools/custom_plotter.py +165 -0
- aiagents4pharma/talk2biomodels/tools/get_annotation.py +342 -0
- aiagents4pharma/talk2biomodels/tools/get_modelinfo.py +159 -0
- aiagents4pharma/talk2biomodels/tools/load_arguments.py +134 -0
- aiagents4pharma/talk2biomodels/tools/load_biomodel.py +44 -0
- aiagents4pharma/talk2biomodels/tools/parameter_scan.py +310 -0
- aiagents4pharma/talk2biomodels/tools/query_article.py +64 -0
- aiagents4pharma/talk2biomodels/tools/save_model.py +98 -0
- aiagents4pharma/talk2biomodels/tools/search_models.py +96 -0
- aiagents4pharma/talk2biomodels/tools/simulate_model.py +137 -0
- aiagents4pharma/talk2biomodels/tools/steady_state.py +187 -0
- aiagents4pharma/talk2biomodels/tools/utils.py +23 -0
- aiagents4pharma/talk2cells/README.md +1 -0
- aiagents4pharma/talk2cells/__init__.py +5 -0
- aiagents4pharma/talk2cells/agents/__init__.py +6 -0
- aiagents4pharma/talk2cells/agents/scp_agent.py +87 -0
- aiagents4pharma/talk2cells/states/__init__.py +6 -0
- aiagents4pharma/talk2cells/states/state_talk2cells.py +15 -0
- aiagents4pharma/talk2cells/tests/scp_agent/test_scp_agent.py +22 -0
- aiagents4pharma/talk2cells/tools/__init__.py +6 -0
- aiagents4pharma/talk2cells/tools/scp_agent/__init__.py +6 -0
- aiagents4pharma/talk2cells/tools/scp_agent/display_studies.py +27 -0
- aiagents4pharma/talk2cells/tools/scp_agent/search_studies.py +78 -0
- aiagents4pharma/talk2knowledgegraphs/.dockerignore +13 -0
- aiagents4pharma/talk2knowledgegraphs/Dockerfile +131 -0
- aiagents4pharma/talk2knowledgegraphs/README.md +1 -0
- aiagents4pharma/talk2knowledgegraphs/__init__.py +5 -0
- aiagents4pharma/talk2knowledgegraphs/agents/__init__.py +5 -0
- aiagents4pharma/talk2knowledgegraphs/agents/t2kg_agent.py +99 -0
- aiagents4pharma/talk2knowledgegraphs/configs/__init__.py +5 -0
- aiagents4pharma/talk2knowledgegraphs/configs/agents/t2kg_agent/__init__.py +3 -0
- aiagents4pharma/talk2knowledgegraphs/configs/agents/t2kg_agent/default.yaml +62 -0
- aiagents4pharma/talk2knowledgegraphs/configs/app/__init__.py +5 -0
- aiagents4pharma/talk2knowledgegraphs/configs/app/frontend/__init__.py +3 -0
- aiagents4pharma/talk2knowledgegraphs/configs/app/frontend/default.yaml +79 -0
- aiagents4pharma/talk2knowledgegraphs/configs/config.yaml +13 -0
- aiagents4pharma/talk2knowledgegraphs/configs/tools/__init__.py +5 -0
- aiagents4pharma/talk2knowledgegraphs/configs/tools/graphrag_reasoning/__init__.py +3 -0
- aiagents4pharma/talk2knowledgegraphs/configs/tools/graphrag_reasoning/default.yaml +24 -0
- aiagents4pharma/talk2knowledgegraphs/configs/tools/multimodal_subgraph_extraction/__init__.py +0 -0
- aiagents4pharma/talk2knowledgegraphs/configs/tools/multimodal_subgraph_extraction/default.yaml +33 -0
- aiagents4pharma/talk2knowledgegraphs/configs/tools/subgraph_extraction/__init__.py +3 -0
- aiagents4pharma/talk2knowledgegraphs/configs/tools/subgraph_extraction/default.yaml +43 -0
- aiagents4pharma/talk2knowledgegraphs/configs/tools/subgraph_summarization/__init__.py +3 -0
- aiagents4pharma/talk2knowledgegraphs/configs/tools/subgraph_summarization/default.yaml +9 -0
- aiagents4pharma/talk2knowledgegraphs/configs/utils/database/milvus/__init__.py +3 -0
- aiagents4pharma/talk2knowledgegraphs/configs/utils/database/milvus/default.yaml +61 -0
- aiagents4pharma/talk2knowledgegraphs/configs/utils/enrichments/ols_terms/default.yaml +3 -0
- aiagents4pharma/talk2knowledgegraphs/configs/utils/enrichments/reactome_pathways/default.yaml +3 -0
- aiagents4pharma/talk2knowledgegraphs/configs/utils/enrichments/uniprot_proteins/default.yaml +6 -0
- aiagents4pharma/talk2knowledgegraphs/configs/utils/pubchem_utils/default.yaml +5 -0
- aiagents4pharma/talk2knowledgegraphs/datasets/__init__.py +5 -0
- aiagents4pharma/talk2knowledgegraphs/datasets/biobridge_primekg.py +607 -0
- aiagents4pharma/talk2knowledgegraphs/datasets/dataset.py +25 -0
- aiagents4pharma/talk2knowledgegraphs/datasets/primekg.py +212 -0
- aiagents4pharma/talk2knowledgegraphs/datasets/starkqa_primekg.py +210 -0
- aiagents4pharma/talk2knowledgegraphs/docker-compose/cpu/.env.example +23 -0
- aiagents4pharma/talk2knowledgegraphs/docker-compose/cpu/docker-compose.yml +93 -0
- aiagents4pharma/talk2knowledgegraphs/docker-compose/gpu/.env.example +23 -0
- aiagents4pharma/talk2knowledgegraphs/docker-compose/gpu/docker-compose.yml +108 -0
- aiagents4pharma/talk2knowledgegraphs/entrypoint.sh +180 -0
- aiagents4pharma/talk2knowledgegraphs/install.md +165 -0
- aiagents4pharma/talk2knowledgegraphs/milvus_data_dump.py +886 -0
- aiagents4pharma/talk2knowledgegraphs/states/__init__.py +5 -0
- aiagents4pharma/talk2knowledgegraphs/states/state_talk2knowledgegraphs.py +40 -0
- aiagents4pharma/talk2knowledgegraphs/tests/__init__.py +0 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_agents_t2kg_agent.py +318 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_datasets_biobridge_primekg.py +248 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_datasets_dataset.py +33 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_datasets_primekg.py +86 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_datasets_starkqa_primekg.py +125 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_tools_graphrag_reasoning.py +257 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_tools_milvus_multimodal_subgraph_extraction.py +1444 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_tools_multimodal_subgraph_extraction.py +159 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_tools_subgraph_extraction.py +152 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_tools_subgraph_summarization.py +201 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_database_milvus_connection_manager.py +812 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_embeddings_embeddings.py +51 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_embeddings_huggingface.py +49 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_embeddings_nim_molmim.py +59 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_embeddings_ollama.py +63 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_embeddings_sentencetransformer.py +47 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_enrichments.py +40 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_ollama.py +94 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_ols.py +70 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_pubchem.py +45 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_reactome.py +44 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_uniprot.py +48 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_extractions_milvus_multimodal_pcst.py +759 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_kg_utils.py +78 -0
- aiagents4pharma/talk2knowledgegraphs/tests/test_utils_pubchem_utils.py +123 -0
- aiagents4pharma/talk2knowledgegraphs/tools/__init__.py +11 -0
- aiagents4pharma/talk2knowledgegraphs/tools/graphrag_reasoning.py +138 -0
- aiagents4pharma/talk2knowledgegraphs/tools/load_arguments.py +22 -0
- aiagents4pharma/talk2knowledgegraphs/tools/milvus_multimodal_subgraph_extraction.py +965 -0
- aiagents4pharma/talk2knowledgegraphs/tools/multimodal_subgraph_extraction.py +374 -0
- aiagents4pharma/talk2knowledgegraphs/tools/subgraph_extraction.py +291 -0
- aiagents4pharma/talk2knowledgegraphs/tools/subgraph_summarization.py +123 -0
- aiagents4pharma/talk2knowledgegraphs/utils/__init__.py +5 -0
- aiagents4pharma/talk2knowledgegraphs/utils/database/__init__.py +5 -0
- aiagents4pharma/talk2knowledgegraphs/utils/database/milvus_connection_manager.py +586 -0
- aiagents4pharma/talk2knowledgegraphs/utils/embeddings/__init__.py +5 -0
- aiagents4pharma/talk2knowledgegraphs/utils/embeddings/embeddings.py +81 -0
- aiagents4pharma/talk2knowledgegraphs/utils/embeddings/huggingface.py +111 -0
- aiagents4pharma/talk2knowledgegraphs/utils/embeddings/nim_molmim.py +54 -0
- aiagents4pharma/talk2knowledgegraphs/utils/embeddings/ollama.py +87 -0
- aiagents4pharma/talk2knowledgegraphs/utils/embeddings/sentence_transformer.py +73 -0
- aiagents4pharma/talk2knowledgegraphs/utils/enrichments/__init__.py +12 -0
- aiagents4pharma/talk2knowledgegraphs/utils/enrichments/enrichments.py +37 -0
- aiagents4pharma/talk2knowledgegraphs/utils/enrichments/ollama.py +129 -0
- aiagents4pharma/talk2knowledgegraphs/utils/enrichments/ols_terms.py +89 -0
- aiagents4pharma/talk2knowledgegraphs/utils/enrichments/pubchem_strings.py +78 -0
- aiagents4pharma/talk2knowledgegraphs/utils/enrichments/reactome_pathways.py +71 -0
- aiagents4pharma/talk2knowledgegraphs/utils/enrichments/uniprot_proteins.py +98 -0
- aiagents4pharma/talk2knowledgegraphs/utils/extractions/__init__.py +5 -0
- aiagents4pharma/talk2knowledgegraphs/utils/extractions/milvus_multimodal_pcst.py +762 -0
- aiagents4pharma/talk2knowledgegraphs/utils/extractions/multimodal_pcst.py +298 -0
- aiagents4pharma/talk2knowledgegraphs/utils/extractions/pcst.py +229 -0
- aiagents4pharma/talk2knowledgegraphs/utils/kg_utils.py +67 -0
- aiagents4pharma/talk2knowledgegraphs/utils/pubchem_utils.py +104 -0
- aiagents4pharma/talk2scholars/.dockerignore +13 -0
- aiagents4pharma/talk2scholars/Dockerfile +104 -0
- aiagents4pharma/talk2scholars/README.md +1 -0
- aiagents4pharma/talk2scholars/__init__.py +7 -0
- aiagents4pharma/talk2scholars/agents/__init__.py +13 -0
- aiagents4pharma/talk2scholars/agents/main_agent.py +89 -0
- aiagents4pharma/talk2scholars/agents/paper_download_agent.py +96 -0
- aiagents4pharma/talk2scholars/agents/pdf_agent.py +101 -0
- aiagents4pharma/talk2scholars/agents/s2_agent.py +135 -0
- aiagents4pharma/talk2scholars/agents/zotero_agent.py +127 -0
- aiagents4pharma/talk2scholars/configs/__init__.py +7 -0
- aiagents4pharma/talk2scholars/configs/agents/__init__.py +7 -0
- aiagents4pharma/talk2scholars/configs/agents/talk2scholars/__init__.py +7 -0
- aiagents4pharma/talk2scholars/configs/agents/talk2scholars/main_agent/__init__.py +3 -0
- aiagents4pharma/talk2scholars/configs/agents/talk2scholars/main_agent/default.yaml +52 -0
- aiagents4pharma/talk2scholars/configs/agents/talk2scholars/paper_download_agent/__init__.py +3 -0
- aiagents4pharma/talk2scholars/configs/agents/talk2scholars/paper_download_agent/default.yaml +19 -0
- aiagents4pharma/talk2scholars/configs/agents/talk2scholars/pdf_agent/__init__.py +3 -0
- aiagents4pharma/talk2scholars/configs/agents/talk2scholars/pdf_agent/default.yaml +19 -0
- aiagents4pharma/talk2scholars/configs/agents/talk2scholars/s2_agent/__init__.py +3 -0
- aiagents4pharma/talk2scholars/configs/agents/talk2scholars/s2_agent/default.yaml +44 -0
- aiagents4pharma/talk2scholars/configs/agents/talk2scholars/zotero_agent/__init__.py +3 -0
- aiagents4pharma/talk2scholars/configs/agents/talk2scholars/zotero_agent/default.yaml +19 -0
- aiagents4pharma/talk2scholars/configs/app/__init__.py +7 -0
- aiagents4pharma/talk2scholars/configs/app/frontend/__init__.py +3 -0
- aiagents4pharma/talk2scholars/configs/app/frontend/default.yaml +72 -0
- aiagents4pharma/talk2scholars/configs/config.yaml +16 -0
- aiagents4pharma/talk2scholars/configs/tools/__init__.py +21 -0
- aiagents4pharma/talk2scholars/configs/tools/multi_paper_recommendation/__init__.py +3 -0
- aiagents4pharma/talk2scholars/configs/tools/multi_paper_recommendation/default.yaml +26 -0
- aiagents4pharma/talk2scholars/configs/tools/paper_download/__init__.py +3 -0
- aiagents4pharma/talk2scholars/configs/tools/paper_download/default.yaml +124 -0
- aiagents4pharma/talk2scholars/configs/tools/question_and_answer/__init__.py +3 -0
- aiagents4pharma/talk2scholars/configs/tools/question_and_answer/default.yaml +62 -0
- aiagents4pharma/talk2scholars/configs/tools/retrieve_semantic_scholar_paper_id/__init__.py +3 -0
- aiagents4pharma/talk2scholars/configs/tools/retrieve_semantic_scholar_paper_id/default.yaml +12 -0
- aiagents4pharma/talk2scholars/configs/tools/search/__init__.py +3 -0
- aiagents4pharma/talk2scholars/configs/tools/search/default.yaml +26 -0
- aiagents4pharma/talk2scholars/configs/tools/single_paper_recommendation/__init__.py +3 -0
- aiagents4pharma/talk2scholars/configs/tools/single_paper_recommendation/default.yaml +26 -0
- aiagents4pharma/talk2scholars/configs/tools/zotero_read/__init__.py +3 -0
- aiagents4pharma/talk2scholars/configs/tools/zotero_read/default.yaml +57 -0
- aiagents4pharma/talk2scholars/configs/tools/zotero_write/__inti__.py +3 -0
- aiagents4pharma/talk2scholars/configs/tools/zotero_write/default.yaml +55 -0
- aiagents4pharma/talk2scholars/docker-compose/cpu/.env.example +21 -0
- aiagents4pharma/talk2scholars/docker-compose/cpu/docker-compose.yml +90 -0
- aiagents4pharma/talk2scholars/docker-compose/gpu/.env.example +21 -0
- aiagents4pharma/talk2scholars/docker-compose/gpu/docker-compose.yml +105 -0
- aiagents4pharma/talk2scholars/install.md +122 -0
- aiagents4pharma/talk2scholars/state/__init__.py +7 -0
- aiagents4pharma/talk2scholars/state/state_talk2scholars.py +98 -0
- aiagents4pharma/talk2scholars/tests/__init__.py +3 -0
- aiagents4pharma/talk2scholars/tests/test_agents_main_agent.py +256 -0
- aiagents4pharma/talk2scholars/tests/test_agents_paper_agents_download_agent.py +139 -0
- aiagents4pharma/talk2scholars/tests/test_agents_pdf_agent.py +114 -0
- aiagents4pharma/talk2scholars/tests/test_agents_s2_agent.py +198 -0
- aiagents4pharma/talk2scholars/tests/test_agents_zotero_agent.py +160 -0
- aiagents4pharma/talk2scholars/tests/test_s2_tools_display_dataframe.py +91 -0
- aiagents4pharma/talk2scholars/tests/test_s2_tools_query_dataframe.py +191 -0
- aiagents4pharma/talk2scholars/tests/test_states_state.py +38 -0
- aiagents4pharma/talk2scholars/tests/test_tools_paper_downloader.py +507 -0
- aiagents4pharma/talk2scholars/tests/test_tools_question_and_answer_tool.py +105 -0
- aiagents4pharma/talk2scholars/tests/test_tools_s2_multi.py +307 -0
- aiagents4pharma/talk2scholars/tests/test_tools_s2_retrieve.py +67 -0
- aiagents4pharma/talk2scholars/tests/test_tools_s2_search.py +286 -0
- aiagents4pharma/talk2scholars/tests/test_tools_s2_single.py +298 -0
- aiagents4pharma/talk2scholars/tests/test_utils_arxiv_downloader.py +469 -0
- aiagents4pharma/talk2scholars/tests/test_utils_base_paper_downloader.py +598 -0
- aiagents4pharma/talk2scholars/tests/test_utils_biorxiv_downloader.py +669 -0
- aiagents4pharma/talk2scholars/tests/test_utils_medrxiv_downloader.py +500 -0
- aiagents4pharma/talk2scholars/tests/test_utils_nvidia_nim_reranker.py +117 -0
- aiagents4pharma/talk2scholars/tests/test_utils_pdf_answer_formatter.py +67 -0
- aiagents4pharma/talk2scholars/tests/test_utils_pdf_batch_processor.py +92 -0
- aiagents4pharma/talk2scholars/tests/test_utils_pdf_collection_manager.py +173 -0
- aiagents4pharma/talk2scholars/tests/test_utils_pdf_document_processor.py +68 -0
- aiagents4pharma/talk2scholars/tests/test_utils_pdf_generate_answer.py +72 -0
- aiagents4pharma/talk2scholars/tests/test_utils_pdf_gpu_detection.py +129 -0
- aiagents4pharma/talk2scholars/tests/test_utils_pdf_paper_loader.py +116 -0
- aiagents4pharma/talk2scholars/tests/test_utils_pdf_rag_pipeline.py +88 -0
- aiagents4pharma/talk2scholars/tests/test_utils_pdf_retrieve_chunks.py +190 -0
- aiagents4pharma/talk2scholars/tests/test_utils_pdf_singleton_manager.py +159 -0
- aiagents4pharma/talk2scholars/tests/test_utils_pdf_vector_normalization.py +121 -0
- aiagents4pharma/talk2scholars/tests/test_utils_pdf_vector_store.py +406 -0
- aiagents4pharma/talk2scholars/tests/test_utils_pubmed_downloader.py +1007 -0
- aiagents4pharma/talk2scholars/tests/test_utils_read_helper_utils.py +106 -0
- aiagents4pharma/talk2scholars/tests/test_utils_s2_utils_ext_ids.py +403 -0
- aiagents4pharma/talk2scholars/tests/test_utils_tool_helper_utils.py +85 -0
- aiagents4pharma/talk2scholars/tests/test_utils_zotero_human_in_the_loop.py +266 -0
- aiagents4pharma/talk2scholars/tests/test_utils_zotero_path.py +496 -0
- aiagents4pharma/talk2scholars/tests/test_utils_zotero_pdf_downloader_utils.py +46 -0
- aiagents4pharma/talk2scholars/tests/test_utils_zotero_read.py +743 -0
- aiagents4pharma/talk2scholars/tests/test_utils_zotero_write.py +151 -0
- aiagents4pharma/talk2scholars/tools/__init__.py +9 -0
- aiagents4pharma/talk2scholars/tools/paper_download/__init__.py +12 -0
- aiagents4pharma/talk2scholars/tools/paper_download/paper_downloader.py +442 -0
- aiagents4pharma/talk2scholars/tools/paper_download/utils/__init__.py +22 -0
- aiagents4pharma/talk2scholars/tools/paper_download/utils/arxiv_downloader.py +207 -0
- aiagents4pharma/talk2scholars/tools/paper_download/utils/base_paper_downloader.py +336 -0
- aiagents4pharma/talk2scholars/tools/paper_download/utils/biorxiv_downloader.py +313 -0
- aiagents4pharma/talk2scholars/tools/paper_download/utils/medrxiv_downloader.py +196 -0
- aiagents4pharma/talk2scholars/tools/paper_download/utils/pubmed_downloader.py +323 -0
- aiagents4pharma/talk2scholars/tools/pdf/__init__.py +7 -0
- aiagents4pharma/talk2scholars/tools/pdf/question_and_answer.py +170 -0
- aiagents4pharma/talk2scholars/tools/pdf/utils/__init__.py +37 -0
- aiagents4pharma/talk2scholars/tools/pdf/utils/answer_formatter.py +62 -0
- aiagents4pharma/talk2scholars/tools/pdf/utils/batch_processor.py +198 -0
- aiagents4pharma/talk2scholars/tools/pdf/utils/collection_manager.py +172 -0
- aiagents4pharma/talk2scholars/tools/pdf/utils/document_processor.py +76 -0
- aiagents4pharma/talk2scholars/tools/pdf/utils/generate_answer.py +97 -0
- aiagents4pharma/talk2scholars/tools/pdf/utils/get_vectorstore.py +59 -0
- aiagents4pharma/talk2scholars/tools/pdf/utils/gpu_detection.py +150 -0
- aiagents4pharma/talk2scholars/tools/pdf/utils/nvidia_nim_reranker.py +97 -0
- aiagents4pharma/talk2scholars/tools/pdf/utils/paper_loader.py +123 -0
- aiagents4pharma/talk2scholars/tools/pdf/utils/rag_pipeline.py +113 -0
- aiagents4pharma/talk2scholars/tools/pdf/utils/retrieve_chunks.py +197 -0
- aiagents4pharma/talk2scholars/tools/pdf/utils/singleton_manager.py +140 -0
- aiagents4pharma/talk2scholars/tools/pdf/utils/tool_helper.py +86 -0
- aiagents4pharma/talk2scholars/tools/pdf/utils/vector_normalization.py +150 -0
- aiagents4pharma/talk2scholars/tools/pdf/utils/vector_store.py +327 -0
- aiagents4pharma/talk2scholars/tools/s2/__init__.py +21 -0
- aiagents4pharma/talk2scholars/tools/s2/display_dataframe.py +110 -0
- aiagents4pharma/talk2scholars/tools/s2/multi_paper_rec.py +111 -0
- aiagents4pharma/talk2scholars/tools/s2/query_dataframe.py +233 -0
- aiagents4pharma/talk2scholars/tools/s2/retrieve_semantic_scholar_paper_id.py +128 -0
- aiagents4pharma/talk2scholars/tools/s2/search.py +101 -0
- aiagents4pharma/talk2scholars/tools/s2/single_paper_rec.py +102 -0
- aiagents4pharma/talk2scholars/tools/s2/utils/__init__.py +5 -0
- aiagents4pharma/talk2scholars/tools/s2/utils/multi_helper.py +223 -0
- aiagents4pharma/talk2scholars/tools/s2/utils/search_helper.py +205 -0
- aiagents4pharma/talk2scholars/tools/s2/utils/single_helper.py +216 -0
- aiagents4pharma/talk2scholars/tools/zotero/__init__.py +7 -0
- aiagents4pharma/talk2scholars/tools/zotero/utils/__init__.py +7 -0
- aiagents4pharma/talk2scholars/tools/zotero/utils/read_helper.py +270 -0
- aiagents4pharma/talk2scholars/tools/zotero/utils/review_helper.py +74 -0
- aiagents4pharma/talk2scholars/tools/zotero/utils/write_helper.py +194 -0
- aiagents4pharma/talk2scholars/tools/zotero/utils/zotero_path.py +180 -0
- aiagents4pharma/talk2scholars/tools/zotero/utils/zotero_pdf_downloader.py +133 -0
- aiagents4pharma/talk2scholars/tools/zotero/zotero_read.py +105 -0
- aiagents4pharma/talk2scholars/tools/zotero/zotero_review.py +162 -0
- aiagents4pharma/talk2scholars/tools/zotero/zotero_write.py +91 -0
- aiagents4pharma-0.0.0.dist-info/METADATA +335 -0
- aiagents4pharma-0.0.0.dist-info/RECORD +336 -0
- aiagents4pharma-0.0.0.dist-info/WHEEL +4 -0
- aiagents4pharma-0.0.0.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Singleton manager for Milvus connections and vector stores.
|
|
3
|
+
Handles connection reuse, event loops, and GPU detection caching.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
import asyncio
|
|
7
|
+
import logging
|
|
8
|
+
import threading
|
|
9
|
+
from typing import Any
|
|
10
|
+
|
|
11
|
+
from langchain_core.embeddings import Embeddings
|
|
12
|
+
from langchain_milvus import Milvus
|
|
13
|
+
from pymilvus import connections, db, utility
|
|
14
|
+
from pymilvus.exceptions import MilvusException
|
|
15
|
+
|
|
16
|
+
from .gpu_detection import detect_nvidia_gpu
|
|
17
|
+
|
|
18
|
+
logger = logging.getLogger(__name__)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class VectorstoreSingleton:
|
|
22
|
+
"""Singleton manager for Milvus connections and vector stores."""
|
|
23
|
+
|
|
24
|
+
_instance = None
|
|
25
|
+
_lock = threading.Lock()
|
|
26
|
+
_connections = {} # Store connections by connection string
|
|
27
|
+
_vector_stores = {} # Store vector stores by collection name
|
|
28
|
+
_event_loops = {} # Store event loops by thread ID
|
|
29
|
+
_gpu_detected = None # Cache GPU detection result
|
|
30
|
+
|
|
31
|
+
def __new__(cls):
|
|
32
|
+
if cls._instance is None:
|
|
33
|
+
with cls._lock:
|
|
34
|
+
if cls._instance is None:
|
|
35
|
+
cls._instance = super().__new__(cls)
|
|
36
|
+
return cls._instance
|
|
37
|
+
|
|
38
|
+
def get_event_loop(self) -> asyncio.AbstractEventLoop:
|
|
39
|
+
"""Get or create event loop for current thread."""
|
|
40
|
+
thread_id = threading.get_ident()
|
|
41
|
+
|
|
42
|
+
if thread_id not in self._event_loops:
|
|
43
|
+
try:
|
|
44
|
+
loop = asyncio.get_event_loop()
|
|
45
|
+
if loop.is_closed():
|
|
46
|
+
raise RuntimeError("Event loop is closed")
|
|
47
|
+
except RuntimeError:
|
|
48
|
+
loop = asyncio.new_event_loop()
|
|
49
|
+
asyncio.set_event_loop(loop)
|
|
50
|
+
self._event_loops[thread_id] = loop
|
|
51
|
+
logger.info("Created new event loop for thread %s", thread_id)
|
|
52
|
+
|
|
53
|
+
return self._event_loops[thread_id]
|
|
54
|
+
|
|
55
|
+
def detect_gpu_once(self) -> bool:
|
|
56
|
+
"""Detect GPU availability once and cache the result."""
|
|
57
|
+
if self._gpu_detected is None:
|
|
58
|
+
self._gpu_detected = detect_nvidia_gpu()
|
|
59
|
+
gpu_status = "available" if self._gpu_detected else "not available"
|
|
60
|
+
logger.info("GPU detection completed: NVIDIA GPU %s", gpu_status)
|
|
61
|
+
return self._gpu_detected
|
|
62
|
+
|
|
63
|
+
def get_connection(self, host: str, port: int, db_name: str) -> str:
|
|
64
|
+
"""Get or create a Milvus connection."""
|
|
65
|
+
conn_key = f"{host}:{port}/{db_name}"
|
|
66
|
+
|
|
67
|
+
if conn_key not in self._connections:
|
|
68
|
+
try:
|
|
69
|
+
# Check if already connected
|
|
70
|
+
if connections.has_connection("default"):
|
|
71
|
+
connections.remove_connection("default")
|
|
72
|
+
|
|
73
|
+
# Connect to Milvus
|
|
74
|
+
connections.connect(
|
|
75
|
+
alias="default",
|
|
76
|
+
host=host,
|
|
77
|
+
port=port,
|
|
78
|
+
)
|
|
79
|
+
logger.info("Connected to Milvus at %s:%s", host, port)
|
|
80
|
+
|
|
81
|
+
# Check if database exists, create if not
|
|
82
|
+
existing_dbs = db.list_database()
|
|
83
|
+
if db_name not in existing_dbs:
|
|
84
|
+
db.create_database(db_name)
|
|
85
|
+
logger.info("Created database: %s", db_name)
|
|
86
|
+
|
|
87
|
+
# Use the database
|
|
88
|
+
db.using_database(db_name)
|
|
89
|
+
logger.info("Using database: %s", db_name)
|
|
90
|
+
logger.debug(
|
|
91
|
+
"Milvus DB switched to: %s, available collections: %s",
|
|
92
|
+
db_name,
|
|
93
|
+
utility.list_collections(),
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
self._connections[conn_key] = "default"
|
|
97
|
+
|
|
98
|
+
except MilvusException as e:
|
|
99
|
+
logger.error("Failed to connect to Milvus: %s", e)
|
|
100
|
+
raise
|
|
101
|
+
|
|
102
|
+
return self._connections[conn_key]
|
|
103
|
+
|
|
104
|
+
def get_vector_store(
|
|
105
|
+
self,
|
|
106
|
+
collection_name: str,
|
|
107
|
+
embedding_model: Embeddings,
|
|
108
|
+
connection_args: dict[str, Any],
|
|
109
|
+
) -> Milvus:
|
|
110
|
+
"""Get or create a vector store for a collection."""
|
|
111
|
+
if collection_name not in self._vector_stores:
|
|
112
|
+
# Ensure event loop exists for this thread
|
|
113
|
+
self.get_event_loop()
|
|
114
|
+
|
|
115
|
+
# Create LangChain Milvus instance with explicit URI format
|
|
116
|
+
# This ensures LangChain uses the correct host
|
|
117
|
+
milvus_uri = f"http://{connection_args['host']}:{connection_args['port']}"
|
|
118
|
+
|
|
119
|
+
vector_store = Milvus(
|
|
120
|
+
embedding_function=embedding_model,
|
|
121
|
+
collection_name=collection_name,
|
|
122
|
+
connection_args={
|
|
123
|
+
"uri": milvus_uri, # Use URI format instead of host/port
|
|
124
|
+
"host": connection_args["host"],
|
|
125
|
+
"port": connection_args["port"],
|
|
126
|
+
},
|
|
127
|
+
text_field="text",
|
|
128
|
+
auto_id=False,
|
|
129
|
+
drop_old=False,
|
|
130
|
+
consistency_level="Strong",
|
|
131
|
+
)
|
|
132
|
+
|
|
133
|
+
self._vector_stores[collection_name] = vector_store
|
|
134
|
+
logger.info(
|
|
135
|
+
"Created new vector store for collection: %s with URI: %s",
|
|
136
|
+
collection_name,
|
|
137
|
+
milvus_uri,
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
return self._vector_stores[collection_name]
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Helper class for question and answer tool in PDF processing.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import logging
|
|
6
|
+
from typing import Any
|
|
7
|
+
|
|
8
|
+
from .get_vectorstore import get_vectorstore
|
|
9
|
+
|
|
10
|
+
logger = logging.getLogger(__name__)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class QAToolHelper:
|
|
14
|
+
"""
|
|
15
|
+
Encapsulates helper routines for the PDF Question & Answer tool.
|
|
16
|
+
Enhanced with automatic GPU/CPU detection and optimization.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
def __init__(self) -> None:
|
|
20
|
+
self.config: Any = None
|
|
21
|
+
self.call_id: str = ""
|
|
22
|
+
self.has_gpu: bool = False # Track GPU availability
|
|
23
|
+
logger.debug("Initialized QAToolHelper")
|
|
24
|
+
|
|
25
|
+
def start_call(self, config: Any, call_id: str) -> None:
|
|
26
|
+
"""Initialize helper with current config and call identifier."""
|
|
27
|
+
self.config = config
|
|
28
|
+
self.call_id = call_id
|
|
29
|
+
logger.debug("QAToolHelper started call %s", call_id)
|
|
30
|
+
|
|
31
|
+
def get_state_models_and_data(self, state: dict) -> tuple[Any, Any, dict[str, Any]]:
|
|
32
|
+
"""Retrieve embedding model, LLM, and article data from agent state."""
|
|
33
|
+
text_emb = state.get("text_embedding_model")
|
|
34
|
+
if not text_emb:
|
|
35
|
+
msg = "No text embedding model found in state."
|
|
36
|
+
logger.error("%s: %s", self.call_id, msg)
|
|
37
|
+
raise ValueError(msg)
|
|
38
|
+
llm = state.get("llm_model")
|
|
39
|
+
if not llm:
|
|
40
|
+
msg = "No LLM model found in state."
|
|
41
|
+
logger.error("%s: %s", self.call_id, msg)
|
|
42
|
+
raise ValueError(msg)
|
|
43
|
+
articles = state.get("article_data", {})
|
|
44
|
+
if not articles:
|
|
45
|
+
msg = "No article_data found in state."
|
|
46
|
+
logger.error("%s: %s", self.call_id, msg)
|
|
47
|
+
raise ValueError(msg)
|
|
48
|
+
return text_emb, llm, articles
|
|
49
|
+
|
|
50
|
+
def init_vector_store(self, emb_model: Any) -> Any:
|
|
51
|
+
"""Get the singleton Milvus vector store instance with GPU/CPU optimization."""
|
|
52
|
+
logger.info(
|
|
53
|
+
"%s: Getting singleton vector store instance with hardware optimization",
|
|
54
|
+
self.call_id,
|
|
55
|
+
)
|
|
56
|
+
vs = get_vectorstore(embedding_model=emb_model, config=self.config)
|
|
57
|
+
|
|
58
|
+
# Track GPU availability from vector store
|
|
59
|
+
self.has_gpu = getattr(vs, "has_gpu", False)
|
|
60
|
+
hardware_type = "GPU-accelerated" if self.has_gpu else "CPU-only"
|
|
61
|
+
|
|
62
|
+
logger.info(
|
|
63
|
+
"%s: Vector store initialized (%s mode)",
|
|
64
|
+
self.call_id,
|
|
65
|
+
hardware_type,
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
# Log hardware-specific configuration
|
|
69
|
+
if hasattr(vs, "index_params"):
|
|
70
|
+
index_type = vs.index_params.get("index_type", "Unknown")
|
|
71
|
+
logger.info(
|
|
72
|
+
"%s: Using %s index type for %s processing",
|
|
73
|
+
self.call_id,
|
|
74
|
+
index_type,
|
|
75
|
+
hardware_type,
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
return vs
|
|
79
|
+
|
|
80
|
+
def get_hardware_stats(self) -> dict[str, Any]:
|
|
81
|
+
"""Get current hardware configuration stats for monitoring."""
|
|
82
|
+
return {
|
|
83
|
+
"gpu_available": self.has_gpu,
|
|
84
|
+
"hardware_mode": "GPU-accelerated" if self.has_gpu else "CPU-only",
|
|
85
|
+
"call_id": self.call_id,
|
|
86
|
+
}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Vector normalization utilities for GPU COSINE similarity support.
|
|
3
|
+
Since GPU indexes don't support COSINE distance, we normalize vectors
|
|
4
|
+
and use IP (Inner Product) distance instead.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import logging
|
|
8
|
+
|
|
9
|
+
import numpy as np
|
|
10
|
+
from langchain_core.embeddings import Embeddings
|
|
11
|
+
|
|
12
|
+
logger = logging.getLogger(__name__)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def normalize_vector(vector: list[float] | np.ndarray) -> list[float]:
|
|
16
|
+
"""
|
|
17
|
+
Normalize a single vector to unit length.
|
|
18
|
+
|
|
19
|
+
Args:
|
|
20
|
+
vector: Input vector as list or numpy array
|
|
21
|
+
|
|
22
|
+
Returns:
|
|
23
|
+
Normalized vector as list
|
|
24
|
+
"""
|
|
25
|
+
vector = np.asarray(vector, dtype=np.float32)
|
|
26
|
+
norm = np.linalg.norm(vector)
|
|
27
|
+
|
|
28
|
+
if norm == 0:
|
|
29
|
+
logger.warning("Zero vector encountered during normalization")
|
|
30
|
+
return vector.tolist()
|
|
31
|
+
|
|
32
|
+
normalized = vector / norm
|
|
33
|
+
return normalized.tolist()
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def normalize_vectors_batch(vectors: list[list[float]]) -> list[list[float]]:
|
|
37
|
+
"""
|
|
38
|
+
Normalize a batch of vectors to unit length.
|
|
39
|
+
|
|
40
|
+
Args:
|
|
41
|
+
vectors: List of vectors
|
|
42
|
+
|
|
43
|
+
Returns:
|
|
44
|
+
List of normalized vectors
|
|
45
|
+
"""
|
|
46
|
+
if not vectors:
|
|
47
|
+
return vectors
|
|
48
|
+
|
|
49
|
+
# Convert to numpy array for efficient computation
|
|
50
|
+
vectors_array = np.asarray(vectors, dtype=np.float32)
|
|
51
|
+
|
|
52
|
+
# Calculate norms for each vector
|
|
53
|
+
norms = np.linalg.norm(vectors_array, axis=1, keepdims=True)
|
|
54
|
+
|
|
55
|
+
# Handle zero vectors
|
|
56
|
+
zero_mask = norms.flatten() == 0
|
|
57
|
+
if np.any(zero_mask):
|
|
58
|
+
logger.warning("Found %d zero vectors during batch normalization", np.sum(zero_mask))
|
|
59
|
+
norms[zero_mask] = 1.0 # Avoid division by zero
|
|
60
|
+
|
|
61
|
+
# Normalize
|
|
62
|
+
normalized = vectors_array / norms
|
|
63
|
+
|
|
64
|
+
return normalized.tolist()
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
class NormalizingEmbeddings(Embeddings):
|
|
68
|
+
"""
|
|
69
|
+
Wrapper around an embedding model that automatically normalizes outputs.
|
|
70
|
+
This is needed for GPU indexes when using COSINE similarity.
|
|
71
|
+
"""
|
|
72
|
+
|
|
73
|
+
def __init__(self, embedding_model: Embeddings, normalize_for_gpu: bool = True):
|
|
74
|
+
"""
|
|
75
|
+
Initialize the normalizing wrapper.
|
|
76
|
+
|
|
77
|
+
Args:
|
|
78
|
+
embedding_model: The underlying embedding model
|
|
79
|
+
normalize_for_gpu: Whether to normalize embeddings (for GPU compatibility)
|
|
80
|
+
"""
|
|
81
|
+
self.embedding_model = embedding_model
|
|
82
|
+
self.normalize_for_gpu = normalize_for_gpu
|
|
83
|
+
|
|
84
|
+
if normalize_for_gpu:
|
|
85
|
+
logger.info("Embedding model wrapped with normalization for GPU compatibility")
|
|
86
|
+
|
|
87
|
+
def embed_documents(self, texts: list[str]) -> list[list[float]]:
|
|
88
|
+
"""Embed documents and optionally normalize."""
|
|
89
|
+
embeddings = self.embedding_model.embed_documents(texts)
|
|
90
|
+
|
|
91
|
+
if self.normalize_for_gpu:
|
|
92
|
+
embeddings = normalize_vectors_batch(embeddings)
|
|
93
|
+
logger.debug("Normalized %d document embeddings for GPU", len(embeddings))
|
|
94
|
+
|
|
95
|
+
return embeddings
|
|
96
|
+
|
|
97
|
+
def embed_query(self, text: str) -> list[float]:
|
|
98
|
+
"""Embed query and optionally normalize."""
|
|
99
|
+
embedding = self.embedding_model.embed_query(text)
|
|
100
|
+
|
|
101
|
+
if self.normalize_for_gpu:
|
|
102
|
+
embedding = normalize_vector(embedding)
|
|
103
|
+
logger.debug("Normalized query embedding for GPU")
|
|
104
|
+
|
|
105
|
+
return embedding
|
|
106
|
+
|
|
107
|
+
def __getattr__(self, name):
|
|
108
|
+
"""Delegate other attributes to the underlying model."""
|
|
109
|
+
return getattr(self.embedding_model, name)
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def should_normalize_vectors(has_gpu: bool, use_cosine: bool) -> bool:
|
|
113
|
+
"""
|
|
114
|
+
Determine if vectors should be normalized based on hardware and similarity metric.
|
|
115
|
+
|
|
116
|
+
Args:
|
|
117
|
+
has_gpu: Whether GPU is being used
|
|
118
|
+
use_cosine: Whether COSINE similarity is desired
|
|
119
|
+
|
|
120
|
+
Returns:
|
|
121
|
+
True if vectors should be normalized
|
|
122
|
+
"""
|
|
123
|
+
needs_normalization = has_gpu and use_cosine
|
|
124
|
+
|
|
125
|
+
if needs_normalization:
|
|
126
|
+
logger.info("Vector normalization ENABLED: GPU detected with COSINE similarity request")
|
|
127
|
+
else:
|
|
128
|
+
logger.info("Vector normalization DISABLED: GPU=%s, COSINE=%s", has_gpu, use_cosine)
|
|
129
|
+
|
|
130
|
+
return needs_normalization
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
def wrap_embedding_model_if_needed(
|
|
134
|
+
embedding_model: Embeddings, has_gpu: bool, use_cosine: bool = True
|
|
135
|
+
) -> Embeddings:
|
|
136
|
+
"""
|
|
137
|
+
Wrap embedding model with normalization if needed for GPU compatibility.
|
|
138
|
+
|
|
139
|
+
Args:
|
|
140
|
+
embedding_model: Original embedding model
|
|
141
|
+
has_gpu: Whether GPU is being used
|
|
142
|
+
use_cosine: Whether COSINE similarity is desired
|
|
143
|
+
|
|
144
|
+
Returns:
|
|
145
|
+
Original or wrapped embedding model
|
|
146
|
+
"""
|
|
147
|
+
if should_normalize_vectors(has_gpu, use_cosine):
|
|
148
|
+
return NormalizingEmbeddings(embedding_model, normalize_for_gpu=True)
|
|
149
|
+
|
|
150
|
+
return embedding_model
|