import OpenAI from 'openai';
import type { EmbeddingProvider } from './provider.js';
export class OpenAIEmbeddingProvider implements EmbeddingProvider {
private client: OpenAI;
private model: string;
constructor(apiKey: string, model = 'text-embedding-3-small', baseURL?: string) {
this.client = new OpenAI({
apiKey,
baseURL,
});
this.model = model;
}
async generateEmbedding(text: string): Promise<number[]> {
try {
const response = await this.client.embeddings.create({
model: this.model,
input: text.replace(/\n/g, ' '),
encoding_format: 'float',
});
return response.data[0].embedding;
} catch (error) {
throw new Error(
`Failed to generate embedding: ${
error instanceof Error ? error.message : 'Unknown error'
}`,
);
}
}
getDimensions(): number {
switch (this.model) {
case 'text-embedding-3-small':
return 1536;
case 'text-embedding-3-large':
return 3072;
case 'text-embedding-ada-002':
return 1536;
default:
return 1536;
}
}
getModelName(): string {
return this.model;
}
static async validateApiKey(apiKey: string, baseURL?: string): Promise<boolean> {
try {
const client = new OpenAI({ apiKey, baseURL });
await client.models.list();
return true;
} catch {
return false;
}
}
}