my harness for niri
1import OpenAI from "openai"
2import { MEMORY_EMBEDDING_DIMENSIONS } from "./db.js"
3
4export const EMBEDDING_MODEL = process.env.EMBEDDING_MODEL ?? "google/gemini-embedding-2-preview"
5export const EMBEDDING_DIMENSIONS = parseInt(
6 process.env.EMBEDDING_DIMENSIONS ?? String(MEMORY_EMBEDDING_DIMENSIONS),
7 10,
8)
9
10const EMBEDDING_BASE_URL = process.env.EMBEDDING_BASE_URL ?? "https://openrouter.ai/api/v1"
11const EMBEDDING_API_KEY = process.env.EMBEDDING_API_KEY
12
13const embeddingClient = EMBEDDING_API_KEY
14 ? new OpenAI({
15 baseURL: EMBEDDING_BASE_URL,
16 apiKey: EMBEDDING_API_KEY,
17 defaultHeaders: {
18 ...(process.env.EMBEDDING_OPENAI_REFERER ? { "HTTP-Referer": process.env.EMBEDDING_OPENAI_REFERER } : {}),
19 ...(process.env.EMBEDDING_TITLE ? { "X-Title": process.env.EMBEDDING_TITLE } : {}),
20 },
21 })
22 : null
23
24export function embeddingsConfigured(): boolean {
25 return Boolean(embeddingClient) && EMBEDDING_DIMENSIONS > 0
26}
27
28export async function embedTexts(texts: string[]): Promise<number[][]> {
29 if (!embeddingClient || texts.length === 0) return []
30
31 const response = await embeddingClient.embeddings.create({
32 model: EMBEDDING_MODEL,
33 input: texts,
34 dimensions: EMBEDDING_DIMENSIONS,
35 encoding_format: "float",
36 })
37
38 return response.data.map((item) => item.embedding)
39}