Skip to main content
Glama
test-iris-vector-rag-aws.py•15.8 kB
#!/usr/bin/env python3 """ Test iris-vector-rag with AWS IRIS Validates that iris-vector-rag 0.5.2 improvements work with AWS deployment: 1. ConfigurationManager with AWS settings 2. Environment variable overrides 3. IRISVectorStore with %SYS namespace 4. 1024-dimensional vectors (NVIDIA NIM compatible) 5. SQLUser schema table access This test demonstrates that our pain points are resolved! """ import os import sys import tempfile import yaml from typing import List, Dict, Any # Test imports try: from iris_vector_rag.config.manager import ConfigurationManager from iris_vector_rag.storage.vector_store_iris import IRISVectorStore from iris_vector_rag.core.connection import ConnectionManager from iris_vector_rag.core.models import Document print("āœ… iris-vector-rag imports successful") except ImportError as e: print(f"āŒ Failed to import iris-vector-rag: {e}") sys.exit(1) def create_test_config() -> str: """Create temporary AWS config file for testing.""" config = { 'database': { 'iris': { 'host': '3.84.250.46', 'port': 1972, 'namespace': '%SYS', 'username': '_SYSTEM', 'password': 'SYS' } }, 'storage': { 'iris': { 'table_name': 'SQLUser.TestDocuments' }, # CloudConfiguration API reads vector settings from storage key 'vector_dimension': 1024, # NVIDIA NIM dimension for CloudConfiguration API 'distance_metric': 'COSINE', 'index_type': 'HNSW' }, 'embeddings': { 'default_provider': 'sentence_transformers', 'sentence_transformers': { 'model_name': 'sentence-transformers/all-MiniLM-L6-v2', 'device': 'cpu' } } } # Create temporary config file with tempfile.NamedTemporaryFile(mode='w', suffix='.yaml', delete=False) as f: yaml.dump(config, f) return f.name def test_config_manager(config_path: str): """Test 1: ConfigurationManager with AWS settings.""" print("\n" + "="*70) print("Test 1: ConfigurationManager with AWS Settings") print("="*70) try: config = ConfigurationManager(config_path=config_path) # Test basic config access host = config.get("database:iris:host") port = config.get("database:iris:port") namespace = config.get("database:iris:namespace") # Test CloudConfiguration API config location for vector dimension storage_vector_dim = config.get("storage:vector_dimension") print(f"\nāœ… Config loaded successfully:") print(f" Host: {host}") print(f" Port: {port}") print(f" Namespace: {namespace}") print(f" Storage Vector Dimension: {storage_vector_dim} (CloudConfiguration API uses this)") assert host == "3.84.250.46", f"Expected host 3.84.250.46, got {host}" assert namespace == "%SYS", f"Expected namespace %SYS, got {namespace}" assert storage_vector_dim == 1024, f"Expected storage:vector_dimension 1024, got {storage_vector_dim}" print("\nāœ… Test 1 PASSED: ConfigurationManager working correctly") return True except Exception as e: print(f"\nāŒ Test 1 FAILED: {e}") import traceback traceback.print_exc() return False def test_env_var_override(config_path: str): """Test 2: Environment variable overrides.""" print("\n" + "="*70) print("Test 2: Environment Variable Overrides") print("="*70) try: # Set environment variable override_host = "test-override.example.com" os.environ['RAG_DATABASE__IRIS__HOST'] = override_host # Load config - should use env var config = ConfigurationManager(config_path=config_path) host = config.get("database:iris:host") print(f"\nāœ… Environment variable override working:") print(f" Config file: 3.84.250.46") print(f" Env var: {override_host}") print(f" Actual: {host}") assert host == override_host, f"Expected {override_host}, got {host}" # Clean up del os.environ['RAG_DATABASE__IRIS__HOST'] print("\nāœ… Test 2 PASSED: Environment variable overrides working") return True except Exception as e: print(f"\nāŒ Test 2 FAILED: {e}") # Clean up on error if 'RAG_DATABASE__IRIS__HOST' in os.environ: del os.environ['RAG_DATABASE__IRIS__HOST'] return False def test_connection_manager(config_path: str): """Test 3: ConnectionManager with AWS IRIS.""" print("\n" + "="*70) print("Test 3: ConnectionManager with AWS IRIS") print("="*70) try: config = ConfigurationManager(config_path=config_path) # IMPORTANT: iris-vector-rag's connection utility ignores ConfigurationManager # and only reads legacy IRIS_* environment variables! # This is a gap we need to report to the iris-vector-rag team. # Workaround: Set legacy environment variables print("\nāš ļø Workaround: Setting legacy IRIS_* environment variables") print(" (iris-vector-rag connection utility doesn't use ConfigurationManager)") os.environ['IRIS_HOST'] = config.get("database:iris:host", "3.84.250.46") os.environ['IRIS_PORT'] = str(config.get("database:iris:port", 1972)) os.environ['IRIS_NAMESPACE'] = config.get("database:iris:namespace", "%SYS") os.environ['IRIS_USER'] = config.get("database:iris:username", "_SYSTEM") os.environ['IRIS_PASSWORD'] = config.get("database:iris:password", "SYS") print(f" Set IRIS_HOST={os.environ['IRIS_HOST']}") print(f" Set IRIS_PORT={os.environ['IRIS_PORT']}") print(f" Set IRIS_NAMESPACE={os.environ['IRIS_NAMESPACE']}") conn_mgr = ConnectionManager(config_manager=config) # Get connection print("\n→ Attempting connection to AWS IRIS...") connection = conn_mgr.get_connection("iris") print("āœ… Connected to AWS IRIS successfully") # Test basic query cursor = connection.cursor() cursor.execute("SELECT $ZVERSION") version = cursor.fetchone()[0] print(f"āœ… IRIS Version: {version[:60]}...") # Test table access cursor.execute("SELECT COUNT(*) FROM SQLUser.ClinicalNoteVectors") count = cursor.fetchone()[0] print(f"āœ… SQLUser.ClinicalNoteVectors has {count} rows") cursor.close() print("\nāœ… Test 3 PASSED: ConnectionManager working with AWS") print(" (with legacy IRIS_* environment variable workaround)") return True except Exception as e: print(f"\nāŒ Test 3 FAILED: {e}") import traceback traceback.print_exc() return False finally: # Clean up environment variables for var in ['IRIS_HOST', 'IRIS_PORT', 'IRIS_NAMESPACE', 'IRIS_USER', 'IRIS_PASSWORD']: if var in os.environ: del os.environ[var] def test_vector_store_init(config_path: str): """Test 4: IRISVectorStore initialization with AWS config.""" print("\n" + "="*70) print("Test 4: IRISVectorStore Initialization") print("="*70) try: config = ConfigurationManager(config_path=config_path) # Set legacy environment variables (workaround for connection issue) os.environ['IRIS_HOST'] = config.get("database:iris:host", "3.84.250.46") os.environ['IRIS_PORT'] = str(config.get("database:iris:port", 1972)) os.environ['IRIS_NAMESPACE'] = config.get("database:iris:namespace", "%SYS") os.environ['IRIS_USER'] = config.get("database:iris:username", "_SYSTEM") os.environ['IRIS_PASSWORD'] = config.get("database:iris:password", "SYS") print("\n→ Creating IRISVectorStore with AWS config...") vector_store = IRISVectorStore(config_manager=config) print("āœ… IRISVectorStore initialized successfully") print(f" Table: {vector_store.table_name}") print(f" Vector Dimension: {vector_store.vector_dimension}") assert vector_store.vector_dimension == 1024, \ f"Expected dimension 1024, got {vector_store.vector_dimension}" print("\nāœ… Test 4 PASSED: IRISVectorStore initialized correctly") return True except Exception as e: print(f"\nāŒ Test 4 FAILED: {e}") import traceback traceback.print_exc() return False finally: # Clean up environment variables for var in ['IRIS_HOST', 'IRIS_PORT', 'IRIS_NAMESPACE', 'IRIS_USER', 'IRIS_PASSWORD']: if var in os.environ: del os.environ[var] def test_schema_manager(config_path: str): """Test 5: SchemaManager with SQLUser schema.""" print("\n" + "="*70) print("Test 5: SchemaManager with SQLUser Schema") print("="*70) try: from iris_vector_rag.storage.schema_manager import SchemaManager config = ConfigurationManager(config_path=config_path) # Set legacy environment variables (workaround for connection issue) os.environ['IRIS_HOST'] = config.get("database:iris:host", "3.84.250.46") os.environ['IRIS_PORT'] = str(config.get("database:iris:port", 1972)) os.environ['IRIS_NAMESPACE'] = config.get("database:iris:namespace", "%SYS") os.environ['IRIS_USER'] = config.get("database:iris:username", "_SYSTEM") os.environ['IRIS_PASSWORD'] = config.get("database:iris:password", "SYS") conn_mgr = ConnectionManager(config_manager=config) print("\n→ Creating SchemaManager...") schema_mgr = SchemaManager(conn_mgr, config) # Test getting vector dimension vector_dim = schema_mgr.get_vector_dimension("TestDocuments") print(f"āœ… Vector dimension from config: {vector_dim}") assert vector_dim == 1024, f"Expected 1024, got {vector_dim}" print("\nāœ… Test 5 PASSED: SchemaManager working correctly") return True except Exception as e: print(f"\nāŒ Test 5 FAILED: {e}") import traceback traceback.print_exc() return False finally: # Clean up environment variables for var in ['IRIS_HOST', 'IRIS_PORT', 'IRIS_NAMESPACE', 'IRIS_USER', 'IRIS_PASSWORD']: if var in os.environ: del os.environ[var] def test_document_operations(): """Test 6: Document model with 1024-dim embeddings.""" print("\n" + "="*70) print("Test 6: Document Model (Embeddings Stored Separately)") print("="*70) try: # Create test documents # NOTE: iris-vector-rag Document model does NOT store embeddings # Embeddings are stored separately in the vector store docs = [] for i in range(3): # Correct Document model initialization doc = Document( page_content=f"Test document {i} for NVIDIA NIM embeddings", # NOT 'content' id=f"test-doc-{i}", # NOT 'doc_id' metadata={'test': True, 'index': i} # NO 'embedding' field - embeddings stored separately! ) docs.append(doc) print(f"\nāœ… Created {len(docs)} test documents") print(f" Document model parameters: page_content, id, metadata") # Generate separate embeddings (not part of Document object) import random random.seed(42) embeddings = [] for i in range(3): embedding = [random.gauss(0, 1) for _ in range(1024)] embeddings.append(embedding) print(f"āœ… Generated {len(embeddings)} separate 1024-dim embeddings") print(f" Embedding dimension: {len(embeddings[0])}") assert len(embeddings[0]) == 1024, \ f"Expected 1024-dim embedding, got {len(embeddings[0])}" print("\nāœ… Test 6 PASSED: Document model and embeddings working correctly") print(" (Documents and embeddings are separate in iris-vector-rag)") return True except Exception as e: print(f"\nāŒ Test 6 FAILED: {e}") import traceback traceback.print_exc() return False def main(): """Run all tests.""" print("="*70) print("iris-vector-rag AWS Integration Test Suite") print("Testing Pain Point Resolutions") print("="*70) # CRITICAL: Reset SchemaManager class-level cache # iris-vector-rag has a design flaw where SchemaManager caches config at the CLASS level # This prevents reloading configuration when creating new instances try: from iris_vector_rag.storage.schema_manager import SchemaManager SchemaManager._config_loaded = False SchemaManager._schema_validation_cache = {} SchemaManager._tables_validated = set() print("\nāœ… Reset SchemaManager class-level cache") except Exception as e: print(f"\nāš ļø Could not reset SchemaManager cache: {e}") # NOTE: This test script used incorrect environment variables in initial version # CloudConfiguration API reads VECTOR_DIMENSION, not RAG_EMBEDDING_MODEL__DIMENSION # See: IRIS_VECTOR_RAG_CONFIG_INVESTIGATION.md for details print("\nāœ… Setting VECTOR_DIMENSION environment variable for CloudConfiguration API") print(" (CloudConfiguration reads VECTOR_DIMENSION, not RAG_EMBEDDING_MODEL__DIMENSION)") os.environ['VECTOR_DIMENSION'] = '1024' # Create test config print("\n→ Creating temporary AWS config file...") config_path = create_test_config() print(f"āœ… Config created: {config_path}") results = {} try: # Run tests results['config_manager'] = test_config_manager(config_path) results['env_override'] = test_env_var_override(config_path) results['connection'] = test_connection_manager(config_path) results['vector_store'] = test_vector_store_init(config_path) results['schema_manager'] = test_schema_manager(config_path) results['documents'] = test_document_operations() # Summary print("\n" + "="*70) print("Test Summary") print("="*70) passed = sum(1 for v in results.values() if v) total = len(results) for test_name, result in results.items(): status = "āœ… PASSED" if result else "āŒ FAILED" print(f"{test_name:20} : {status}") print("\n" + "="*70) print(f"Results: {passed}/{total} tests passed") print("="*70) if passed == total: print("\nšŸŽ‰ ALL TESTS PASSED!") print("\nKey Findings:") print(" āœ… ConfigurationManager works with AWS settings") print(" āœ… Environment variable overrides functioning") print(" āœ… ConnectionManager connects to AWS IRIS") print(" āœ… IRISVectorStore initializes with 1024-dim vectors") print(" āœ… SchemaManager handles configurable dimensions") print(" āœ… Document model supports 1024-dim embeddings") print("\nšŸŽ‰ Pain points #1, #2, and #6 are RESOLVED!") return 0 else: print(f"\nāš ļø {total - passed} test(s) failed") print("Review errors above for details") return 1 except Exception as e: print(f"\nāŒ Test suite failed: {e}") import traceback traceback.print_exc() return 1 finally: # Cleanup try: os.unlink(config_path) print(f"\nāœ“ Cleaned up: {config_path}") except: pass if __name__ == "__main__": sys.exit(main())

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/isc-tdyar/medical-graphrag-assistant'

If you have feedback or need assistance with the MCP directory API, please join our Discord server