const { createClient } = require('@supabase/supabase-js'); // Load environment variables require('dotenv').config(); const supabaseUrl = process.env.SUPABASE_URL; const supabaseServiceKey = process.env.SUPABASE_SERVICE_KEY; const supabase = createClient(supabaseUrl, supabaseServiceKey); async function testVectorSearch() { console.log('๐Ÿ” Testing vector search function...'); // Create a test embedding (1536 dimensions with small random values) const testEmbedding = new Array(1536).fill(0).map(() => Math.random() * 0.1); console.log('๐Ÿ“Š Test embedding created with', testEmbedding.length, 'dimensions'); // Test the vector search function const { data, error } = await supabase.rpc('match_document_chunks', { query_embedding: testEmbedding, match_threshold: 0.1, match_count: 5 }); if (error) { console.log('โŒ Vector search function error:', error); if (error.code === '42883') { console.log('๐Ÿ“ match_document_chunks function does not exist'); console.log(''); console.log('๐Ÿ› ๏ธ Please create the function in Supabase SQL Editor:'); console.log(''); console.log(`-- First enable pgvector extension CREATE EXTENSION IF NOT EXISTS vector; -- Create vector similarity search function CREATE OR REPLACE FUNCTION match_document_chunks( query_embedding VECTOR(1536), match_threshold FLOAT DEFAULT 0.7, match_count INTEGER DEFAULT 10 ) RETURNS TABLE ( id UUID, document_id TEXT, content TEXT, metadata JSONB, chunk_index INTEGER, similarity FLOAT ) LANGUAGE SQL STABLE AS $$ SELECT document_chunks.id, document_chunks.document_id, document_chunks.content, document_chunks.metadata, document_chunks.chunk_index, 1 - (document_chunks.embedding <=> query_embedding) AS similarity FROM document_chunks WHERE document_chunks.embedding IS NOT NULL AND 1 - (document_chunks.embedding <=> query_embedding) > match_threshold ORDER BY document_chunks.embedding <=> query_embedding LIMIT match_count; $$;`); } } else { console.log('โœ… Vector search function works!'); console.log('๐Ÿ“Š Search results:', data ? data.length : 0, 'matches found'); if (data && data.length > 0) { console.log('First result:', data[0]); } } // Also test basic insert with embedding console.log('๐Ÿงช Testing insert with embedding...'); const testChunk = { document_id: 'test-doc-with-embedding', content: 'This is a test chunk with an embedding vector', chunk_index: 1, embedding: testEmbedding, metadata: { test: true, hasEmbedding: true } }; const { data: insertData, error: insertError } = await supabase .from('document_chunks') .insert(testChunk) .select(); if (insertError) { console.log('โŒ Insert with embedding failed:', insertError); } else { console.log('โœ… Insert with embedding successful!'); console.log('Inserted chunk ID:', insertData[0].id); // Test search again with data console.log('๐Ÿ” Testing search with actual data...'); const { data: searchData, error: searchError } = await supabase.rpc('match_document_chunks', { query_embedding: testEmbedding, match_threshold: 0.5, match_count: 5 }); if (searchError) { console.log('โŒ Search with data failed:', searchError); } else { console.log('โœ… Search with data successful!'); console.log('Found', searchData ? searchData.length : 0, 'results'); if (searchData && searchData.length > 0) { console.log('Best match similarity:', searchData[0].similarity); } } // Clean up test data const { error: deleteError } = await supabase .from('document_chunks') .delete() .eq('document_id', 'test-doc-with-embedding'); if (deleteError) { console.log('โš ๏ธ Could not clean up test data:', deleteError.message); } else { console.log('๐Ÿงน Test data cleaned up'); } } } testVectorSearch();