Files
adminandClaude Sonnet 4.6 d10c690c12 feat: switch embeddings from Voyage AI to Google Gemini text-embedding-004
- 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
2026-07-13 06:50:35 +08:00

19 lines
720 B
TypeScript

export async function embedText(text: string, apiKey?: string): Promise<number[]> {
const key = apiKey ?? process.env.GOOGLE_AI_API_KEY
if (!key) throw new Error('GOOGLE_AI_API_KEY is not set')
const res = await fetch(
`https://generativelanguage.googleapis.com/v1beta/models/text-embedding-004:embedContent?key=${key}`,
{
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
model: 'models/text-embedding-004',
content: { parts: [{ text }] },
}),
}
)
if (!res.ok) throw new Error(`Gemini embed failed: ${res.status}`)
const json = await res.json() as { embedding: { values: number[] } }
return json.embedding.values
}