packages/chat-next-api/src/embedding.ts

import type OpenAI from 'openai'; import type { EmbeddingProvider } from '@portfolio/chat-data';

type EmbeddingClient = OpenAI | null;

export function createOpenAIEmbeddingProvider(params: { model: string; getClient: () => Promise; logScope: string; }): EmbeddingProvider { const { model, getClient, logScope } = params; return { async embedTexts(texts: string[]): Promise<number[][]> { if (!texts.length) { return []; } let client: EmbeddingClient; try { client = await getClient(); } catch (error) { console.warn([${logScope}] Failed to resolve embedding client., error); return texts.map(() => []); } if (!client) { return texts.map(() => []); } try { const response = await client.embeddings.create({ model, input: texts, }); return response.data.map((item) => item.embedding ?? []); } catch (error) { console.warn([${logScope}] Query embedding failed., error); return texts.map(() => []); } }, }; }