echo "URL=$SUPABASE_URL"; echo "REF=$SUPABASE_PROJECT_REF"; echo "DB_URL=$SUPABASE_DB_URL"; echo "ANON_LEN=${#SUPABASE_ANON_KEY}"; echo "SRV_LEN=${#SUPABASE_SERVICE_ROLE_KEY}"URL=https://<ref>.supabase.co REF=<ref> DB_URL=<redacted:SUPABASE_DB_URL> ANON_LEN=208 SRV_LEN=219
export PGPASSWORD="$SUPABASE_DB_PASSWORD" psql "$SUPABASE_DB_URL" -c "SELECT id, title, embedding_json FROM public.documents ORDER BY id;"
id | title | embedding_json ----+---------+------------------ 1 | alpha | [10, 0.5, 0, 0] 2 | bravo | [0.9, 0.3, 0, 0] 3 | delta | [20, 60, 0, 0] 4 | echo | [0, 1, 0, 0] 5 | foxtrot | [-5, 0.1, 0, 0] 6 | golf | [0.1, 0.1, 3, 4] (6 rows)
export PGPASSWORD="$SUPABASE_DB_PASSWORD" psql "$SUPABASE_DB_URL" <<'SQL' -- 1) Enable pgvector CREATE EXTENSION IF NOT EXISTS vector; -- 2) Add the column and populate from embedding_json ALTER TABLE public.documents ADD COLUMN IF NOT EXISTS embedding vector(4); UPDATE public.documents SET embedding = ( SELECT array_agg(v)::text::vector(4) FROM jsonb_array_elements_text(embedding_json) AS v ) WHERE embedding IS NULL; -- sanity SELECT id, title, embedding FROM public.documents ORDER BY id; SQL
CREATE EXTENSION ALTER TABLE id | title | embedding ----+---------+----------- 1 | alpha | 2 | bravo | 3 | delta | 4 | echo | 5 | foxtrot | 6 | golf | (6 rows)
ERROR: invalid input syntax for type vector: "{10,0.5,0,0}"
DETAIL: Vector contents must start with "[".
export PGPASSWORD="$SUPABASE_DB_PASSWORD" psql "$SUPABASE_DB_URL" <<'SQL' -- Build the vector literal as '[a,b,c,d]' from jsonb elements UPDATE public.documents SET embedding = ( SELECT '[' || string_agg(elem::text, ',') || ']' FROM jsonb_array_elements_text(embedding_json) AS elem )::vector(4) WHERE embedding IS NULL; SELECT id, title, embedding FROM public.documents ORDER BY id; SQL
UPDATE 6 id | title | embedding ----+---------+--------------- 1 | alpha | [10,0.5,0,0] 2 | bravo | [0.9,0.3,0,0] 3 | delta | [20,60,0,0] 4 | echo | [0,1,0,0] 5 | foxtrot | [-5,0.1,0,0] 6 | golf | [0.1,0.1,3,4] (6 rows)
export PGPASSWORD="$SUPABASE_DB_PASSWORD" psql "$SUPABASE_DB_URL" <<'SQL' -- 3) HNSW index with cosine distance CREATE INDEX IF NOT EXISTS documents_embedding_hnsw ON public.documents USING hnsw (embedding vector_cosine_ops); -- 4) SQL function for nearest neighbors by cosine distance CREATE OR REPLACE FUNCTION public.match_documents( query_embedding vector(4), match_count int ) RETURNS TABLE(id int, title text, distance float8) LANGUAGE sql STABLE AS $$ SELECT d.id, d.title, (d.embedding <=> query_embedding)::float8 AS distance FROM public.documents d ORDER BY d.embedding <=> query_embedding ASC LIMIT match_count; $$; -- Grant to anon & authenticated for REST/RPC GRANT EXECUTE ON FUNCTION public.match_documents(vector(4), int) TO anon, authenticated; SQL
CREATE INDEX CREATE FUNCTION GRANT
cat > /tmp/req.json <<'EOF'
{"query_embedding": [1, 1, 0, 0], "match_count": 3}
EOF
curl -sS -X POST "$SUPABASE_URL/rest/v1/rpc/match_documents" \
-H "apikey: $SUPABASE_ANON_KEY" \
-H "Authorization: Bearer $SUPABASE_ANON_KEY" \
-H "Content-Type: application/json" \
--data @/tmp/req.json
echo
echo "--- different query (cosine focus, length-invariant) ---"
cat > /tmp/req2.json <<'EOF'
{"query_embedding": [10, 1, 0, 0], "match_count": 6}
EOF
curl -sS -X POST "$SUPABASE_URL/rest/v1/rpc/match_documents" \
-H "apikey: $SUPABASE_ANON_KEY" \
-H "Authorization: Bearer $SUPABASE_ANON_KEY" \
-H "Content-Type: application/json" \
--data @/tmp/req2.json
echo[{"id":2,"title":"bravo","distance":0.105572761611626},
{"id":3,"title":"delta","distance":0.105572809000084},
{"id":1,"title":"alpha","distance":0.258464220876229}]
--- different query (cosine focus, length-invariant) ---
[{"id":1,"title":"alpha","distance":0.00123530040237119},
{"id":2,"title":"bravo","distance":0.0245589650066704},
{"id":3,"title":"delta","distance":0.590944095907091},
{"id":4,"title":"echo","distance":0.900496280979001},
{"id":6,"title":"golf","distance":0.978117932618253},
{"id":5,"title":"foxtrot","distance":1.99284859178635}]
1 earlier narration turn(s) are in the raw transcript.
A shell script executed against the live project and asserted on the state the agent left behind. No model judged another model.
Raw transcript · Task definition and verifier · Every attempt