my harness for niri
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at main 39 lines 1.3 kB view raw
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}