- embedText: call Gemini REST API (768-dim) instead of Voyage (1024-dim) - Migration: drop+recreate incidents.embedding as vector(768), update match_incidents function, swap VOYAGE_API_KEY → GOOGLE_AI_API_KEY in app_settings - Settings UI: relabel to "Google AI API Key (Embeddings)" - All call sites updated (incidents POST, similar GET) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CPf5Rc8QPx6V8KLEEgfKEQ
50 lines
1.3 KiB
PL/PgSQL
50 lines
1.3 KiB
PL/PgSQL
-- Migrate embeddings from Voyage AI (1024-dim) to Gemini text-embedding-004 (768-dim)
|
|
|
|
-- Drop dependent objects first
|
|
drop index if exists incidents_embedding_idx;
|
|
drop function if exists match_incidents;
|
|
|
|
-- Replace column (dimension change requires drop+add)
|
|
alter table incidents drop column if exists embedding;
|
|
alter table incidents add column embedding vector(768);
|
|
|
|
-- Recreate index
|
|
create index incidents_embedding_idx
|
|
on incidents using ivfflat (embedding vector_cosine_ops)
|
|
with (lists = 10);
|
|
|
|
-- Recreate similarity function at 768-dim
|
|
create or replace function match_incidents(
|
|
query_embedding vector(768),
|
|
exclude_id uuid,
|
|
match_count int default 5
|
|
)
|
|
returns table (
|
|
id uuid,
|
|
reference_no text,
|
|
incident_type text,
|
|
description text,
|
|
severity int,
|
|
similarity float
|
|
)
|
|
language sql
|
|
security definer
|
|
as $$
|
|
select
|
|
i.id,
|
|
i.reference_no,
|
|
i.incident_type,
|
|
i.description,
|
|
i.severity,
|
|
1 - (i.embedding <=> query_embedding) as similarity
|
|
from incidents i
|
|
where i.id != exclude_id
|
|
and i.embedding is not null
|
|
order by i.embedding <=> query_embedding
|
|
limit match_count;
|
|
$$;
|
|
|
|
-- Register Gemini key slot, remove Voyage slot
|
|
insert into app_settings (key, value) values ('GOOGLE_AI_API_KEY', '') on conflict (key) do nothing;
|
|
delete from app_settings where key = 'VOYAGE_API_KEY';
|