UNPKG

@agentkai/core

Version:

AgentKai核心包,提供AI助手系统的基础功能

92 lines (91 loc) 2.92 kB
import { Logger } from '../../utils/logger'; import OpenAI from 'openai'; /** * OpenAI嵌入向量提供者 * 使用OpenAI的API生成文本的嵌入向量 */ export class OpenAIEmbeddingProvider { /** * 创建OpenAI嵌入向量提供者 * @param apiKey OpenAI API密钥 * @param model 嵌入模型名称 * @param baseURL API基础URL(对于阿里云DashScope需要设置) * @param dimensions 向量维度(根据模型不同而不同) */ constructor(apiKey, model = 'text-embedding-ada-002', baseURL, dimensions = 1024) { Object.defineProperty(this, "client", { enumerable: true, configurable: true, writable: true, value: void 0 }); Object.defineProperty(this, "model", { enumerable: true, configurable: true, writable: true, value: void 0 }); Object.defineProperty(this, "dimensions", { enumerable: true, configurable: true, writable: true, value: void 0 }); Object.defineProperty(this, "logger", { enumerable: true, configurable: true, writable: true, value: void 0 }); this.client = new OpenAI({ apiKey: apiKey, baseURL: baseURL, dangerouslyAllowBrowser: true, }); this.model = model; this.dimensions = dimensions; this.logger = new Logger('OpenAIEmbeddingProvider'); this.logger.info(`初始化OpenAI嵌入提供者,模型: ${model}, 维度: ${this.dimensions}`); } /** * 获取文本的嵌入向量 * @param text 要嵌入的文本 * @returns 向量表示 */ async getEmbedding(text) { try { if (!text || text.trim() === '') { throw new Error('文本内容不能为空'); } this.logger.debug(`生成嵌入向量,文本长度: ${text.length}`); const response = await this.client.embeddings.create({ model: this.model, input: text }); const embedding = response.data[0].embedding; // 验证向量维度 if (embedding.length !== this.dimensions) { this.logger.warn(`返回的向量维度(${embedding.length})与预期维度(${this.dimensions})不匹配`); } return embedding; } catch (error) { this.logger.error('生成嵌入向量失败:', error); throw error; } } /** * 获取向量维度 * @returns 向量维度 */ getDimensions() { return this.dimensions; } /** * 获取提供者名称 * @returns 提供者名称 */ getName() { return `OpenAIEmbedding:${this.model}`; } }