iris-vector-rag 0.2.3__tar.gz → 0.2.5__tar.gz
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.
- iris_vector_rag-0.2.5/LICENSE +21 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/PKG-INFO +98 -1
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/README.md +88 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/__init__.py +1 -1
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/config/default_config.yaml +61 -0
- iris_vector_rag-0.2.5/iris_rag/config/embedding_config.py +299 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/config/manager.py +1 -1
- iris_vector_rag-0.2.5/iris_rag/embeddings/entity_extractor.py +546 -0
- iris_vector_rag-0.2.5/iris_rag/embeddings/iris_embedding.py +517 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/embeddings/manager.py +211 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/pipelines/basic.py +15 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/pipelines/basic_rerank.py +4 -2
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/pipelines/colbert_pylate/pylate_pipeline.py +11 -3
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/pipelines/crag.py +12 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/pipelines/hybrid_graphrag.py +24 -13
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/pipelines/hybrid_graphrag_discovery.py +25 -50
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/pipelines/hybrid_graphrag_retrieval.py +2 -2
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/services/entity_extraction.py +77 -2
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/storage/hybrid_schema_manager.py +17 -17
- iris_vector_rag-0.2.5/iris_rag/storage/iris_embedding_ops.py +497 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/storage/schema_manager.py +8 -8
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/storage/vector_store_iris.py +187 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/validation/requirements.py +7 -7
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_vector_rag.egg-info/PKG-INFO +98 -1
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_vector_rag.egg-info/SOURCES.txt +5 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_vector_rag.egg-info/requires.txt +9 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/pyproject.toml +16 -1
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/tests/test_hybrid_graphrag_functional.py +6 -6
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/adapters/rag_templates_bridge.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/common/__init__.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/common/batch_utils.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/common/config.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/common/connection_manager.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/common/connection_pool.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/common/database.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/common/database_schema_manager.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/common/db_init_with_indexes.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/common/db_vector_utils.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/common/environment_manager.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/common/huggingface_utils.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/common/iris_client.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/common/iris_connection_manager.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/common/iris_connection_pool.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/common/iris_connector.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/common/iris_dbapi_connector.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/common/iris_index_utils.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/common/iris_sql_utils.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/common/iris_stream_reader.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/common/llm_cache_config.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/common/llm_cache_iris.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/common/llm_cache_manager.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/common/utils.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/common/vector_sql_utils.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/evaluation_framework/__init__.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/evaluation_framework/biomedical_question_generator.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/evaluation_framework/comparative_analysis_system.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/evaluation_framework/empirical_reporting.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/evaluation_framework/evaluation_orchestrator.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/evaluation_framework/execute_production_evaluation.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/evaluation_framework/outputs/production_evaluation/execute_biomedical_rag_10k_evaluation_20250913_200432.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/evaluation_framework/pmc_data_pipeline.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/evaluation_framework/production_evaluation_config.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/evaluation_framework/ragas_metrics_framework.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/evaluation_framework/real_production_evaluation.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/evaluation_framework/run_10k_evaluation.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/evaluation_framework/simple_test.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/evaluation_framework/statistical_evaluation_methodology.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/evaluation_framework/test_framework.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/evaluation_framework/test_iris_connectivity.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/evaluation_framework/test_small_scale_evaluation.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/evaluation_framework/true_e2e_evaluation.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/evaluation_framework/visualization_engine.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/api/__init__.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/api/cleanup_job.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/api/cli.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/api/main.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/api/mcp_routes.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/api/middleware/__init__.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/api/middleware/auth.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/api/middleware/logging.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/api/middleware/rate_limit.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/api/models/__init__.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/api/models/auth.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/api/models/errors.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/api/models/health.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/api/models/pipeline.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/api/models/quota.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/api/models/request.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/api/models/response.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/api/models/upload.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/api/models/websocket.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/api/routes/__init__.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/api/routes/document.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/api/routes/health.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/api/routes/pipeline.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/api/routes/query.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/api/services/__init__.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/api/services/auth_service.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/api/services/document_service.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/api/services/pipeline_manager.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/api/websocket/__init__.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/api/websocket/connection.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/api/websocket/handlers.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/api/websocket/routes.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/config/__init__.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/config/backend_modes.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/config/pipeline_config_service.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/core/__init__.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/core/base.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/core/connection.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/core/exceptions.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/core/models.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/core/response_standardizer.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/core/validators.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/core/vector_store.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/core/vector_store_exceptions.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/dspy_modules/__init__.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/dspy_modules/batch_entity_extraction.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/dspy_modules/entity_extraction_module.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/embeddings/__init__.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/mcp/__init__.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/mcp/__main__.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/mcp/bridge.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/mcp/cli.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/mcp/config.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/mcp/technique_handlers.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/mcp/tool_schemas.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/mcp/validation.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/memory/__init__.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/memory/knowledge_extractor.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/memory/models.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/memory/rag_integration.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/memory/temporal_manager.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/ontology/__init__.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/ontology/loader.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/ontology/models.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/ontology/plugins/__init__.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/ontology/plugins/general_ontology.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/ontology/reasoner.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/optimization/cache_manager.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/optimization/connection_pool.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/optimization/database_optimizer.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/optimization/hnsw_tuner.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/optimization/parallel_processor.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/optimization/performance_monitor.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/pipelines/__init__.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/pipelines/_hybrid_utils.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/pipelines/colbert_pylate/__init__.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/pipelines/factory.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/pipelines/graphrag.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/pipelines/graphrag_merged.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/pipelines/iris_global_graphrag.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/pipelines/multi_query_rrf.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/plugins/__init__.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/plugins/interface.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/services/__init__.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/services/storage.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/storage/__init__.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/storage/clob_handler.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/storage/enterprise_storage.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/testing/__init__.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/testing/backend_manager.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/testing/connection_pool.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/testing/exceptions.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/testing/iris_devtools_bridge.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/testing/validators.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/utils/__init__.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/utils/module_loader.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/utils/project_root.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/utils/token_counter.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/validation/__init__.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/validation/factory.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/validation/orchestrator.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_rag/validation/validator.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_vector_rag.egg-info/dependency_links.txt +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_vector_rag.egg-info/entry_points.txt +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/iris_vector_rag.egg-info/top_level.txt +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/setup.cfg +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/tests/test_comprehensive_pipeline_validation_e2e.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/tests/test_comprehensive_pipeline_validation_e2e_fixed.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/tests/test_enterprise_storage.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/tests/test_entity_extraction_service.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/tests/test_index_ensure.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/tests/test_mcp_integration.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/tests/test_mcp_server_integration.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/tests/test_ontology_loader.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/tests/test_ontology_support.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/tests/test_performance_monitor_comprehensive.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/tests/test_performance_monitor_working.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/tests/test_pylate_colbert_pipeline.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/tests/test_schema_manager_bugs.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/tests/test_temporal_manager.py +0 -0
- {iris_vector_rag-0.2.3 → iris_vector_rag-0.2.5}/tests/test_vector_safe_helpers.py +0 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024 InterSystems Community
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: iris-vector-rag
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.5
|
|
4
4
|
Summary: Production-ready, extensible RAG framework with native IRIS vector search - unified API for basic, CRAG, GraphRAG, and ColBERT pipelines with RAGAS and DSPy integration
|
|
5
5
|
Author-email: InterSystems <support@intersystems.com>
|
|
6
6
|
Maintainer-email: Thomas Dyar <thomas.dyar@intersystems.com>
|
|
@@ -25,6 +25,7 @@ Classifier: Topic :: Database
|
|
|
25
25
|
Classifier: Topic :: Text Processing :: Linguistic
|
|
26
26
|
Requires-Python: >=3.10
|
|
27
27
|
Description-Content-Type: text/markdown
|
|
28
|
+
License-File: LICENSE
|
|
28
29
|
Requires-Dist: openai>=1.0.0
|
|
29
30
|
Requires-Dist: anthropic>=0.25.0
|
|
30
31
|
Requires-Dist: sentence-transformers>=2.2.0
|
|
@@ -46,6 +47,13 @@ Requires-Dist: plotly>=6.1.2
|
|
|
46
47
|
Requires-Dist: jaydebeapi>=1.2.3
|
|
47
48
|
Requires-Dist: docker>=6.1.3
|
|
48
49
|
Requires-Dist: tiktoken>=0.5.0
|
|
50
|
+
Requires-Dist: torch>=2.0.0
|
|
51
|
+
Provides-Extra: embedding
|
|
52
|
+
Requires-Dist: torch>=2.0.0; extra == "embedding"
|
|
53
|
+
Requires-Dist: sentence-transformers>=2.2.0; extra == "embedding"
|
|
54
|
+
Requires-Dist: iris-vector-graph>=1.1.1; extra == "embedding"
|
|
55
|
+
Provides-Extra: hybrid-graphrag
|
|
56
|
+
Requires-Dist: iris-vector-graph>=1.1.1; extra == "hybrid-graphrag"
|
|
49
57
|
Provides-Extra: dev
|
|
50
58
|
Requires-Dist: uv>=0.1.0; extra == "dev"
|
|
51
59
|
Requires-Dist: pytest>=7.0.0; extra == "dev"
|
|
@@ -92,6 +100,7 @@ Requires-Dist: python-multipart>=0.0.6; extra == "all"
|
|
|
92
100
|
Requires-Dist: redis>=5.0.0; extra == "all"
|
|
93
101
|
Requires-Dist: bcrypt>=4.0.0; extra == "all"
|
|
94
102
|
Requires-Dist: python-jose[cryptography]>=3.3.0; extra == "all"
|
|
103
|
+
Dynamic: license-file
|
|
95
104
|
|
|
96
105
|
# IRIS Vector RAG Templates
|
|
97
106
|
|
|
@@ -369,6 +378,94 @@ make test-ragas-sample
|
|
|
369
378
|
# - Answer Relevance
|
|
370
379
|
```
|
|
371
380
|
|
|
381
|
+
### IRIS EMBEDDING: 346x Faster Auto-Vectorization
|
|
382
|
+
|
|
383
|
+
**Automatic embedding generation with model caching** - eliminates the 720x slowdown from repeated model loading:
|
|
384
|
+
|
|
385
|
+
```python
|
|
386
|
+
from iris_rag import create_pipeline
|
|
387
|
+
|
|
388
|
+
# Enable IRIS EMBEDDING support (Feature 051)
|
|
389
|
+
pipeline = create_pipeline(
|
|
390
|
+
'basic',
|
|
391
|
+
embedding_config='medical_embeddings_v1' # IRIS EMBEDDING config name
|
|
392
|
+
)
|
|
393
|
+
|
|
394
|
+
# Documents auto-vectorize on INSERT with cached models
|
|
395
|
+
pipeline.load_documents(documents=docs)
|
|
396
|
+
|
|
397
|
+
# Queries auto-vectorize using same cached model
|
|
398
|
+
result = pipeline.query("What is diabetes?", top_k=5)
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
**Performance Achievements:**
|
|
402
|
+
- ⚡ **346x speedup** - 1,746 documents vectorized in 3.5 seconds (vs 20 minutes baseline)
|
|
403
|
+
- 🎯 **95% cache hit rate** - Models stay in memory across requests
|
|
404
|
+
- 🚀 **50ms average latency** - Cache hits complete in <100ms
|
|
405
|
+
- 💾 **Automatic fallback** - GPU OOM? Automatically falls back to CPU
|
|
406
|
+
|
|
407
|
+
**Configuration Example:**
|
|
408
|
+
|
|
409
|
+
```python
|
|
410
|
+
from iris_rag.embeddings.iris_embedding import configure_embedding
|
|
411
|
+
|
|
412
|
+
# Create embedding configuration
|
|
413
|
+
config = configure_embedding(
|
|
414
|
+
name="medical_embeddings_v1",
|
|
415
|
+
model_name="sentence-transformers/all-MiniLM-L6-v2",
|
|
416
|
+
device_preference="auto", # auto, cuda, mps, cpu
|
|
417
|
+
batch_size=32,
|
|
418
|
+
enable_entity_extraction=True,
|
|
419
|
+
entity_types=["Disease", "Medication", "Symptom"]
|
|
420
|
+
)
|
|
421
|
+
|
|
422
|
+
# Use with any pipeline
|
|
423
|
+
pipeline = create_pipeline('basic', embedding_config='medical_embeddings_v1')
|
|
424
|
+
```
|
|
425
|
+
|
|
426
|
+
**Multi-Field Vectorization:**
|
|
427
|
+
|
|
428
|
+
Combine multiple document fields into a single embedding:
|
|
429
|
+
|
|
430
|
+
```python
|
|
431
|
+
from iris_rag.core.models import Document
|
|
432
|
+
|
|
433
|
+
# Document with multiple content fields
|
|
434
|
+
doc = Document(
|
|
435
|
+
page_content="", # Will be auto-filled from metadata
|
|
436
|
+
metadata={
|
|
437
|
+
"title": "Type 2 Diabetes Treatment",
|
|
438
|
+
"abstract": "A comprehensive review of treatment approaches...",
|
|
439
|
+
"conclusions": "Insulin therapy combined with lifestyle changes..."
|
|
440
|
+
}
|
|
441
|
+
)
|
|
442
|
+
|
|
443
|
+
# Configure multi-field embedding
|
|
444
|
+
pipeline = create_pipeline(
|
|
445
|
+
'basic',
|
|
446
|
+
embedding_config='paper_embeddings',
|
|
447
|
+
multi_field_source=['title', 'abstract', 'conclusions'] # Concatenate fields
|
|
448
|
+
)
|
|
449
|
+
|
|
450
|
+
pipeline.load_documents(documents=[doc])
|
|
451
|
+
# → Embedding generated from: "Type 2 Diabetes Treatment. A comprehensive review..."
|
|
452
|
+
```
|
|
453
|
+
|
|
454
|
+
**When to Use IRIS EMBEDDING:**
|
|
455
|
+
- ✅ Large document collections (>1000 documents)
|
|
456
|
+
- ✅ Frequent re-indexing or incremental updates
|
|
457
|
+
- ✅ Real-time vectorization requirements
|
|
458
|
+
- ✅ Memory-constrained environments (model stays in memory)
|
|
459
|
+
- ✅ Multi-field vectorization needs
|
|
460
|
+
|
|
461
|
+
**Comparison:**
|
|
462
|
+
|
|
463
|
+
| Method | 1,746 Docs | Model Loads | Cache Hit Rate |
|
|
464
|
+
|--------|-----------|-------------|----------------|
|
|
465
|
+
| **Manual** (baseline) | 20 minutes | 1,746 (every row) | 0% |
|
|
466
|
+
| **IRIS EMBEDDING** | 3.5 seconds | 1 (cached) | 95% |
|
|
467
|
+
| **Speedup** | **346x faster** | **1,746x fewer** | **95% efficient** |
|
|
468
|
+
|
|
372
469
|
## Model Context Protocol (MCP) Support
|
|
373
470
|
|
|
374
471
|
**Expose RAG pipelines as MCP tools** for use with Claude Desktop and other MCP clients:
|
|
@@ -274,6 +274,94 @@ make test-ragas-sample
|
|
|
274
274
|
# - Answer Relevance
|
|
275
275
|
```
|
|
276
276
|
|
|
277
|
+
### IRIS EMBEDDING: 346x Faster Auto-Vectorization
|
|
278
|
+
|
|
279
|
+
**Automatic embedding generation with model caching** - eliminates the 720x slowdown from repeated model loading:
|
|
280
|
+
|
|
281
|
+
```python
|
|
282
|
+
from iris_rag import create_pipeline
|
|
283
|
+
|
|
284
|
+
# Enable IRIS EMBEDDING support (Feature 051)
|
|
285
|
+
pipeline = create_pipeline(
|
|
286
|
+
'basic',
|
|
287
|
+
embedding_config='medical_embeddings_v1' # IRIS EMBEDDING config name
|
|
288
|
+
)
|
|
289
|
+
|
|
290
|
+
# Documents auto-vectorize on INSERT with cached models
|
|
291
|
+
pipeline.load_documents(documents=docs)
|
|
292
|
+
|
|
293
|
+
# Queries auto-vectorize using same cached model
|
|
294
|
+
result = pipeline.query("What is diabetes?", top_k=5)
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
**Performance Achievements:**
|
|
298
|
+
- ⚡ **346x speedup** - 1,746 documents vectorized in 3.5 seconds (vs 20 minutes baseline)
|
|
299
|
+
- 🎯 **95% cache hit rate** - Models stay in memory across requests
|
|
300
|
+
- 🚀 **50ms average latency** - Cache hits complete in <100ms
|
|
301
|
+
- 💾 **Automatic fallback** - GPU OOM? Automatically falls back to CPU
|
|
302
|
+
|
|
303
|
+
**Configuration Example:**
|
|
304
|
+
|
|
305
|
+
```python
|
|
306
|
+
from iris_rag.embeddings.iris_embedding import configure_embedding
|
|
307
|
+
|
|
308
|
+
# Create embedding configuration
|
|
309
|
+
config = configure_embedding(
|
|
310
|
+
name="medical_embeddings_v1",
|
|
311
|
+
model_name="sentence-transformers/all-MiniLM-L6-v2",
|
|
312
|
+
device_preference="auto", # auto, cuda, mps, cpu
|
|
313
|
+
batch_size=32,
|
|
314
|
+
enable_entity_extraction=True,
|
|
315
|
+
entity_types=["Disease", "Medication", "Symptom"]
|
|
316
|
+
)
|
|
317
|
+
|
|
318
|
+
# Use with any pipeline
|
|
319
|
+
pipeline = create_pipeline('basic', embedding_config='medical_embeddings_v1')
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
**Multi-Field Vectorization:**
|
|
323
|
+
|
|
324
|
+
Combine multiple document fields into a single embedding:
|
|
325
|
+
|
|
326
|
+
```python
|
|
327
|
+
from iris_rag.core.models import Document
|
|
328
|
+
|
|
329
|
+
# Document with multiple content fields
|
|
330
|
+
doc = Document(
|
|
331
|
+
page_content="", # Will be auto-filled from metadata
|
|
332
|
+
metadata={
|
|
333
|
+
"title": "Type 2 Diabetes Treatment",
|
|
334
|
+
"abstract": "A comprehensive review of treatment approaches...",
|
|
335
|
+
"conclusions": "Insulin therapy combined with lifestyle changes..."
|
|
336
|
+
}
|
|
337
|
+
)
|
|
338
|
+
|
|
339
|
+
# Configure multi-field embedding
|
|
340
|
+
pipeline = create_pipeline(
|
|
341
|
+
'basic',
|
|
342
|
+
embedding_config='paper_embeddings',
|
|
343
|
+
multi_field_source=['title', 'abstract', 'conclusions'] # Concatenate fields
|
|
344
|
+
)
|
|
345
|
+
|
|
346
|
+
pipeline.load_documents(documents=[doc])
|
|
347
|
+
# → Embedding generated from: "Type 2 Diabetes Treatment. A comprehensive review..."
|
|
348
|
+
```
|
|
349
|
+
|
|
350
|
+
**When to Use IRIS EMBEDDING:**
|
|
351
|
+
- ✅ Large document collections (>1000 documents)
|
|
352
|
+
- ✅ Frequent re-indexing or incremental updates
|
|
353
|
+
- ✅ Real-time vectorization requirements
|
|
354
|
+
- ✅ Memory-constrained environments (model stays in memory)
|
|
355
|
+
- ✅ Multi-field vectorization needs
|
|
356
|
+
|
|
357
|
+
**Comparison:**
|
|
358
|
+
|
|
359
|
+
| Method | 1,746 Docs | Model Loads | Cache Hit Rate |
|
|
360
|
+
|--------|-----------|-------------|----------------|
|
|
361
|
+
| **Manual** (baseline) | 20 minutes | 1,746 (every row) | 0% |
|
|
362
|
+
| **IRIS EMBEDDING** | 3.5 seconds | 1 (cached) | 95% |
|
|
363
|
+
| **Speedup** | **346x faster** | **1,746x fewer** | **95% efficient** |
|
|
364
|
+
|
|
277
365
|
## Model Context Protocol (MCP) Support
|
|
278
366
|
|
|
279
367
|
**Expose RAG pipelines as MCP tools** for use with Claude Desktop and other MCP clients:
|
|
@@ -18,7 +18,7 @@ from .validation.requirements import get_pipeline_requirements
|
|
|
18
18
|
from .validation.validator import PreConditionValidator
|
|
19
19
|
|
|
20
20
|
# Package version
|
|
21
|
-
__version__ = "0.2.
|
|
21
|
+
__version__ = "0.2.5"
|
|
22
22
|
__author__ = "InterSystems IRIS RAG Templates Project"
|
|
23
23
|
__description__ = "A comprehensive, production-ready framework for implementing Retrieval Augmented Generation (RAG) pipelines using InterSystems IRIS as the vector database backend."
|
|
24
24
|
|
|
@@ -64,6 +64,67 @@ embeddings:
|
|
|
64
64
|
model_name: "all-MiniLM-L6-v2"
|
|
65
65
|
device: "cpu"
|
|
66
66
|
|
|
67
|
+
# IRIS EMBEDDING Configuration (Feature 051)
|
|
68
|
+
iris_embedding:
|
|
69
|
+
enabled: false # Enable IRIS EMBEDDING auto-vectorization
|
|
70
|
+
|
|
71
|
+
# Default configurations (can be overridden per-table)
|
|
72
|
+
default_config:
|
|
73
|
+
model_name: "sentence-transformers/all-MiniLM-L6-v2"
|
|
74
|
+
hf_cache_path: "/var/lib/huggingface" # HuggingFace model cache directory
|
|
75
|
+
python_path: "/usr/bin/python3" # Python interpreter path
|
|
76
|
+
batch_size: 32 # Batch size for vectorization
|
|
77
|
+
device_preference: "auto" # Device: auto, cuda, mps, cpu
|
|
78
|
+
enable_entity_extraction: false # Extract entities during vectorization
|
|
79
|
+
entity_types: [] # Entity types to extract (if enabled)
|
|
80
|
+
|
|
81
|
+
# Model cache configuration
|
|
82
|
+
cache:
|
|
83
|
+
enabled: true # Enable in-memory model caching
|
|
84
|
+
max_models: 5 # Maximum number of cached models
|
|
85
|
+
eviction_policy: "lru" # Cache eviction: lru, lfu, ttl
|
|
86
|
+
ttl_seconds: 3600 # Time-to-live for cached models (1 hour)
|
|
87
|
+
warmup_on_start: false # Preload models at startup
|
|
88
|
+
|
|
89
|
+
# Performance targets (Feature 050 pattern)
|
|
90
|
+
performance:
|
|
91
|
+
cache_hit_target_ms: 50 # Target: <50ms for cache hits
|
|
92
|
+
cache_miss_target_ms: 5000 # Target: <5000ms for cache misses (includes model load)
|
|
93
|
+
min_cache_hit_rate: 0.95 # Target: >=95% cache hit rate after warmup
|
|
94
|
+
gpu_oom_fallback: true # Fallback to CPU on GPU OOM
|
|
95
|
+
|
|
96
|
+
# Table-specific configurations (example)
|
|
97
|
+
# configurations:
|
|
98
|
+
# medical_embeddings_v1:
|
|
99
|
+
# model_name: "sentence-transformers/all-MiniLM-L6-v2"
|
|
100
|
+
# enable_entity_extraction: true
|
|
101
|
+
# entity_types: ["Disease", "Symptom", "Medication"]
|
|
102
|
+
#
|
|
103
|
+
# paper_embeddings:
|
|
104
|
+
# model_name: "sentence-transformers/allenai-specter"
|
|
105
|
+
# device_preference: "cuda"
|
|
106
|
+
# batch_size: 64
|
|
107
|
+
|
|
108
|
+
# Multi-field vectorization examples
|
|
109
|
+
# multi_field_configs:
|
|
110
|
+
# research_papers:
|
|
111
|
+
# table_name: "RAG.ResearchPapers"
|
|
112
|
+
# embedding_column: "metadata_vector"
|
|
113
|
+
# source_columns: # Concatenate multiple fields
|
|
114
|
+
# - "title"
|
|
115
|
+
# - "abstract"
|
|
116
|
+
# - "conclusions"
|
|
117
|
+
# config_name: "paper_embeddings"
|
|
118
|
+
#
|
|
119
|
+
# medical_records:
|
|
120
|
+
# table_name: "RAG.MedicalRecords"
|
|
121
|
+
# embedding_column: "clinical_vector"
|
|
122
|
+
# source_columns:
|
|
123
|
+
# - "chief_complaint"
|
|
124
|
+
# - "history_of_present_illness"
|
|
125
|
+
# - "assessment"
|
|
126
|
+
# config_name: "medical_embeddings_v1"
|
|
127
|
+
|
|
67
128
|
# Entity extraction configuration
|
|
68
129
|
entity_extraction:
|
|
69
130
|
enabled: true
|
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
"""
|
|
2
|
+
IRIS EMBEDDING Configuration Models.
|
|
3
|
+
|
|
4
|
+
Feature: 051-add-native-iris
|
|
5
|
+
Purpose: Define configuration data models for IRIS EMBEDDING integration
|
|
6
|
+
with validation, type safety, and serialization support.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from dataclasses import dataclass, field, asdict
|
|
10
|
+
from typing import List, Optional, Dict, Any
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
import os
|
|
13
|
+
import sys
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@dataclass
|
|
17
|
+
class EmbeddingConfig:
|
|
18
|
+
"""
|
|
19
|
+
Represents IRIS %Embedding.Config table entries with model settings
|
|
20
|
+
and optional entity extraction configuration.
|
|
21
|
+
|
|
22
|
+
This configuration controls how EMBEDDING columns auto-vectorize text data
|
|
23
|
+
and optionally extract entities for GraphRAG knowledge graphs.
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
# Required fields
|
|
27
|
+
name: str
|
|
28
|
+
model_name: str
|
|
29
|
+
hf_cache_path: str
|
|
30
|
+
python_path: str
|
|
31
|
+
embedding_class: str
|
|
32
|
+
|
|
33
|
+
# Optional fields with defaults
|
|
34
|
+
description: Optional[str] = None
|
|
35
|
+
enable_entity_extraction: bool = False
|
|
36
|
+
entity_types: List[str] = field(default_factory=list)
|
|
37
|
+
batch_size: int = 32
|
|
38
|
+
device_preference: str = "auto" # cuda, mps, cpu, auto
|
|
39
|
+
|
|
40
|
+
def __post_init__(self):
|
|
41
|
+
"""Validate configuration after initialization."""
|
|
42
|
+
# Validate batch_size
|
|
43
|
+
if self.batch_size <= 0:
|
|
44
|
+
raise ValueError(f"batch_size must be positive integer, got {self.batch_size}")
|
|
45
|
+
|
|
46
|
+
# Validate device_preference
|
|
47
|
+
valid_devices = ["cuda", "mps", "cpu", "auto"]
|
|
48
|
+
if self.device_preference not in valid_devices:
|
|
49
|
+
raise ValueError(
|
|
50
|
+
f"device_preference must be one of {valid_devices}, got '{self.device_preference}'"
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
# Validate entity extraction configuration
|
|
54
|
+
if self.enable_entity_extraction and not self.entity_types:
|
|
55
|
+
raise ValueError(
|
|
56
|
+
"If enable_entity_extraction=True, entity_types must not be empty"
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
def to_dict(self) -> Dict[str, Any]:
|
|
60
|
+
"""Convert to dictionary for JSON serialization."""
|
|
61
|
+
return asdict(self)
|
|
62
|
+
|
|
63
|
+
@classmethod
|
|
64
|
+
def from_dict(cls, data: Dict[str, Any]) -> "EmbeddingConfig":
|
|
65
|
+
"""Create EmbeddingConfig from dictionary."""
|
|
66
|
+
return cls(**data)
|
|
67
|
+
|
|
68
|
+
def to_iris_json(self) -> Dict[str, Any]:
|
|
69
|
+
"""
|
|
70
|
+
Convert to IRIS %Embedding.Config Configuration JSON format.
|
|
71
|
+
|
|
72
|
+
Returns dictionary suitable for storing in IRIS Configuration field.
|
|
73
|
+
"""
|
|
74
|
+
return {
|
|
75
|
+
"modelName": self.model_name,
|
|
76
|
+
"hfCachePath": self.hf_cache_path,
|
|
77
|
+
"pythonPath": self.python_path,
|
|
78
|
+
"batchSize": self.batch_size,
|
|
79
|
+
"devicePreference": self.device_preference,
|
|
80
|
+
"enableEntityExtraction": self.enable_entity_extraction,
|
|
81
|
+
"entityTypes": self.entity_types
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
@dataclass
|
|
86
|
+
class ValidationResult:
|
|
87
|
+
"""
|
|
88
|
+
Result of embedding configuration validation.
|
|
89
|
+
|
|
90
|
+
Used by validate_embedding_config() to report validation status,
|
|
91
|
+
errors, and warnings before creating tables with EMBEDDING columns.
|
|
92
|
+
"""
|
|
93
|
+
|
|
94
|
+
valid: bool
|
|
95
|
+
errors: List[str] = field(default_factory=list)
|
|
96
|
+
warnings: List[str] = field(default_factory=list)
|
|
97
|
+
|
|
98
|
+
# Additional validation metadata
|
|
99
|
+
model_name: Optional[str] = None
|
|
100
|
+
cache_path_valid: bool = False
|
|
101
|
+
python_path_valid: bool = False
|
|
102
|
+
device: Optional[str] = None
|
|
103
|
+
|
|
104
|
+
def add_error(self, error: str):
|
|
105
|
+
"""Add an error and mark validation as invalid."""
|
|
106
|
+
self.errors.append(error)
|
|
107
|
+
self.valid = False
|
|
108
|
+
|
|
109
|
+
def add_warning(self, warning: str):
|
|
110
|
+
"""Add a warning (doesn't invalidate configuration)."""
|
|
111
|
+
self.warnings.append(warning)
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
def validate_embedding_config(config: EmbeddingConfig) -> ValidationResult:
|
|
115
|
+
"""
|
|
116
|
+
Validate EMBEDDING configuration before table creation (FR-010).
|
|
117
|
+
|
|
118
|
+
Performs pre-flight validation to catch configuration errors early
|
|
119
|
+
and provide actionable error messages.
|
|
120
|
+
|
|
121
|
+
Args:
|
|
122
|
+
config: EmbeddingConfig to validate
|
|
123
|
+
|
|
124
|
+
Returns:
|
|
125
|
+
ValidationResult with validation status, errors, and warnings
|
|
126
|
+
|
|
127
|
+
Validation checks:
|
|
128
|
+
1. Model file exists at hf_cache_path or can be downloaded
|
|
129
|
+
2. Python executable exists at python_path
|
|
130
|
+
3. Required Python packages installed (sentence-transformers, torch)
|
|
131
|
+
4. If entity extraction enabled, entity_types not empty
|
|
132
|
+
5. Device preference is valid
|
|
133
|
+
"""
|
|
134
|
+
result = ValidationResult(valid=True)
|
|
135
|
+
result.model_name = config.model_name
|
|
136
|
+
|
|
137
|
+
# Check 1: Validate hf_cache_path exists and is writable
|
|
138
|
+
cache_path = Path(config.hf_cache_path)
|
|
139
|
+
if cache_path.exists():
|
|
140
|
+
if not cache_path.is_dir():
|
|
141
|
+
result.add_error(
|
|
142
|
+
f"INVALID_CACHE_PATH: hf_cache_path '{config.hf_cache_path}' "
|
|
143
|
+
"exists but is not a directory"
|
|
144
|
+
)
|
|
145
|
+
elif not os.access(cache_path, os.W_OK):
|
|
146
|
+
result.add_error(
|
|
147
|
+
f"INVALID_CACHE_PATH: hf_cache_path '{config.hf_cache_path}' "
|
|
148
|
+
"is not writable"
|
|
149
|
+
)
|
|
150
|
+
else:
|
|
151
|
+
result.cache_path_valid = True
|
|
152
|
+
else:
|
|
153
|
+
# Cache path doesn't exist - that's OK, it will be created
|
|
154
|
+
result.add_warning(
|
|
155
|
+
f"Cache path '{config.hf_cache_path}' does not exist. "
|
|
156
|
+
"It will be created when first downloading models."
|
|
157
|
+
)
|
|
158
|
+
result.cache_path_valid = True
|
|
159
|
+
|
|
160
|
+
# Check 2: Validate python_path is executable
|
|
161
|
+
python_path = Path(config.python_path)
|
|
162
|
+
if not python_path.exists():
|
|
163
|
+
result.add_error(
|
|
164
|
+
f"INVALID_PYTHON_PATH: Python executable not found at '{config.python_path}'. "
|
|
165
|
+
"Verify python_path in configuration."
|
|
166
|
+
)
|
|
167
|
+
elif not os.access(python_path, os.X_OK):
|
|
168
|
+
result.add_error(
|
|
169
|
+
f"INVALID_PYTHON_PATH: '{config.python_path}' exists but is not executable"
|
|
170
|
+
)
|
|
171
|
+
else:
|
|
172
|
+
result.python_path_valid = True
|
|
173
|
+
|
|
174
|
+
# Check 3: Verify required packages (basic check)
|
|
175
|
+
# Note: Full package check would require running pip list in target Python
|
|
176
|
+
try:
|
|
177
|
+
import sentence_transformers
|
|
178
|
+
import torch
|
|
179
|
+
result.add_warning(
|
|
180
|
+
"Package validation: sentence-transformers and torch found in current environment. "
|
|
181
|
+
"Ensure they are also installed in python_path environment."
|
|
182
|
+
)
|
|
183
|
+
except ImportError as e:
|
|
184
|
+
result.add_error(
|
|
185
|
+
f"MISSING_DEPENDENCIES: Required Python packages missing in current environment: {e}. "
|
|
186
|
+
"Run: pip install sentence-transformers torch"
|
|
187
|
+
)
|
|
188
|
+
|
|
189
|
+
# Check 4: Validate device preference
|
|
190
|
+
if config.device_preference not in ["cuda", "mps", "cpu", "auto"]:
|
|
191
|
+
result.add_error(
|
|
192
|
+
f"INVALID_DEVICE: device_preference must be one of [cuda, mps, cpu, auto], "
|
|
193
|
+
f"got '{config.device_preference}'"
|
|
194
|
+
)
|
|
195
|
+
else:
|
|
196
|
+
# Detect actual device that will be used
|
|
197
|
+
try:
|
|
198
|
+
import torch
|
|
199
|
+
if config.device_preference == "auto":
|
|
200
|
+
if torch.cuda.is_available():
|
|
201
|
+
result.device = "cuda:0"
|
|
202
|
+
elif hasattr(torch.backends, "mps") and torch.backends.mps.is_available():
|
|
203
|
+
result.device = "mps"
|
|
204
|
+
else:
|
|
205
|
+
result.device = "cpu"
|
|
206
|
+
else:
|
|
207
|
+
result.device = config.device_preference
|
|
208
|
+
except ImportError:
|
|
209
|
+
result.device = "unknown (torch not available)"
|
|
210
|
+
|
|
211
|
+
# Check 5: Validate entity extraction configuration
|
|
212
|
+
if config.enable_entity_extraction:
|
|
213
|
+
if not config.entity_types:
|
|
214
|
+
result.add_error(
|
|
215
|
+
"INVALID_ENTITY_CONFIG: enable_entity_extraction=True but entity_types is empty. "
|
|
216
|
+
"Provide at least one entity type (e.g., ['Disease', 'Medication'])"
|
|
217
|
+
)
|
|
218
|
+
else:
|
|
219
|
+
# Validate entity type naming
|
|
220
|
+
for entity_type in config.entity_types:
|
|
221
|
+
if not entity_type or not isinstance(entity_type, str):
|
|
222
|
+
result.add_error(
|
|
223
|
+
f"INVALID_ENTITY_TYPE: Entity type must be non-empty string, got '{entity_type}'"
|
|
224
|
+
)
|
|
225
|
+
elif not entity_type[0].isupper():
|
|
226
|
+
result.add_warning(
|
|
227
|
+
f"Entity type '{entity_type}' should start with uppercase letter by convention"
|
|
228
|
+
)
|
|
229
|
+
|
|
230
|
+
# Check 6: Validate model exists or can be downloaded
|
|
231
|
+
# This is a lightweight check - full validation would download the model
|
|
232
|
+
model_cache_dir = cache_path / "models--" / config.model_name.replace("/", "--")
|
|
233
|
+
if model_cache_dir.exists():
|
|
234
|
+
result.add_warning(
|
|
235
|
+
f"Model '{config.model_name}' found in cache at {model_cache_dir}"
|
|
236
|
+
)
|
|
237
|
+
else:
|
|
238
|
+
result.add_warning(
|
|
239
|
+
f"MODEL_NOT_CACHED: Model '{config.model_name}' not found in cache. "
|
|
240
|
+
f"It will be downloaded from HuggingFace on first use. "
|
|
241
|
+
f"To pre-download: huggingface-cli download {config.model_name}"
|
|
242
|
+
)
|
|
243
|
+
|
|
244
|
+
return result
|
|
245
|
+
|
|
246
|
+
|
|
247
|
+
@dataclass
|
|
248
|
+
class ClearCacheResult:
|
|
249
|
+
"""Result of cache clearing operation."""
|
|
250
|
+
|
|
251
|
+
models_cleared: int
|
|
252
|
+
memory_freed_mb: float
|
|
253
|
+
|
|
254
|
+
def __str__(self) -> str:
|
|
255
|
+
return f"Cleared {self.models_cleared} models, freed {self.memory_freed_mb:.1f}MB"
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
# Helper function for creating configurations
|
|
259
|
+
def create_embedding_config(
|
|
260
|
+
name: str,
|
|
261
|
+
model_name: str = "sentence-transformers/all-MiniLM-L6-v2",
|
|
262
|
+
hf_cache_path: str = "/var/lib/huggingface",
|
|
263
|
+
python_path: str = "/usr/bin/python3",
|
|
264
|
+
enable_entity_extraction: bool = False,
|
|
265
|
+
entity_types: Optional[List[str]] = None,
|
|
266
|
+
**kwargs
|
|
267
|
+
) -> EmbeddingConfig:
|
|
268
|
+
"""
|
|
269
|
+
Helper function to create EmbeddingConfig with sensible defaults.
|
|
270
|
+
|
|
271
|
+
Args:
|
|
272
|
+
name: Unique configuration identifier
|
|
273
|
+
model_name: HuggingFace model ID
|
|
274
|
+
hf_cache_path: Path to HuggingFace cache directory
|
|
275
|
+
python_path: Path to Python executable
|
|
276
|
+
enable_entity_extraction: Whether to extract entities
|
|
277
|
+
entity_types: List of entity types to extract
|
|
278
|
+
**kwargs: Additional fields (description, batch_size, device_preference)
|
|
279
|
+
|
|
280
|
+
Returns:
|
|
281
|
+
EmbeddingConfig instance
|
|
282
|
+
|
|
283
|
+
Example:
|
|
284
|
+
>>> config = create_embedding_config(
|
|
285
|
+
... name="medical_embeddings",
|
|
286
|
+
... enable_entity_extraction=True,
|
|
287
|
+
... entity_types=["Disease", "Medication"]
|
|
288
|
+
... )
|
|
289
|
+
"""
|
|
290
|
+
return EmbeddingConfig(
|
|
291
|
+
name=name,
|
|
292
|
+
model_name=model_name,
|
|
293
|
+
hf_cache_path=hf_cache_path,
|
|
294
|
+
python_path=python_path,
|
|
295
|
+
embedding_class="%Embedding.SentenceTransformers",
|
|
296
|
+
enable_entity_extraction=enable_entity_extraction,
|
|
297
|
+
entity_types=entity_types or [],
|
|
298
|
+
**kwargs
|
|
299
|
+
)
|
|
@@ -674,7 +674,7 @@ class ConfigurationManager:
|
|
|
674
674
|
"enabled": True,
|
|
675
675
|
"schema_auto_setup": True,
|
|
676
676
|
"fallback_to_graphrag": True,
|
|
677
|
-
"
|
|
677
|
+
"iris_vector_graph": {
|
|
678
678
|
"enabled": True,
|
|
679
679
|
"auto_create_tables": True,
|
|
680
680
|
"community_edition_compatible": True,
|