UNPKG

aisapi

Version:

A JavaScript/TypeScript API library for multiple AI providers

286 lines 11.4 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.SparkProvider = exports.SparkModel = void 0; const base_1 = require("./base"); const crypto = __importStar(require("crypto")); /** * 星火API可用模型 */ var SparkModel; (function (SparkModel) { SparkModel["LITE"] = "spark-lite"; SparkModel["PRO"] = "spark-pro"; SparkModel["PRO_128K"] = "spark-pro-128k"; SparkModel["MAX"] = "spark-max"; SparkModel["MAX_32K"] = "spark-max-32k"; SparkModel["ULTRA"] = "spark-ultra"; // 4.0 Ultra版本,8k上下文 })(SparkModel || (exports.SparkModel = SparkModel = {})); /** * 讯飞星火API提供商实现 */ class SparkProvider extends base_1.BaseProvider { /** * 创建讯飞星火API提供商实例 */ constructor(options = {}) { super(options); this.name = 'Spark'; this.model = options.model || SparkModel.PRO; this.appId = options.appId; this.apiSecret = options.apiSecret; if (!this.appId) { console.warn(`[${this.name}] 警告: 未提供 AppID,某些功能可能不可用。`); } if (!this.apiSecret) { console.warn(`[${this.name}] 警告: 未提供 API Secret,某些功能可能不可用。`); } } /** * @inheritdoc */ getDefaultBaseUrl() { return 'https://spark-api.xf-yun.com/v3.5'; } /** * 获取请求头,包括鉴权信息 */ getAuthHeaders() { return __awaiter(this, void 0, void 0, function* () { if (!this.apiKey || !this.appId || !this.apiSecret) { throw new Error('需要提供 API Key、AppID 和 API Secret 才能使用讯飞星火API'); } // 计算当前时间戳 const currentTime = Math.floor(Date.now() / 1000); // 过期时间:当前时间 + 1小时 const expireTime = currentTime + 3600; // 构建鉴权URL和Body const host = new URL(this.baseUrl).host; const path = new URL(this.baseUrl).pathname; const authUrl = `host: ${host}\ndate: ${currentTime}\nPOST ${path} HTTP/1.1`; // 使用HMAC-SHA256哈希算法,使用API Secret作为密钥对authUrl签名 const hmac = crypto.createHmac('sha256', this.apiSecret); const authBody = hmac.update(authUrl).digest('base64'); // 构建鉴权字符串 const authString = `api_key="${this.apiKey}", algorithm="hmac-sha256", headers="host date request-line", signature="${authBody}", date="${currentTime}", expire_time="${expireTime}"`; return { 'Content-Type': 'application/json', 'Authorization': authString, 'X-AppId': this.appId }; }); } /** * @inheritdoc */ generateText(params) { return __awaiter(this, void 0, void 0, function* () { const model = params.model || this.model; // 准备请求体 const messages = [ { role: 'user', content: params.prompt } ]; // 如果有系统消息,添加到消息列表开头 if (params.systemMessage) { messages.unshift({ role: 'system', content: params.systemMessage }); } // 使用聊天完成API return this.chatCompletion({ model, messages, maxTokens: params.maxTokens, temperature: params.temperature, topP: params.topP, stream: params.stream }); }); } /** * 聊天完成API */ chatCompletion(params) { return __awaiter(this, void 0, void 0, function* () { var _a; // 构建星火API特定请求体 const requestBody = { header: { app_id: this.appId, uid: `user_${Date.now()}` // 可以使用更稳定的用户标识 }, parameter: { chat: { domain: this.getSparkDomain(params.model || this.model), temperature: (_a = params.temperature) !== null && _a !== void 0 ? _a : 0.7, top_k: 4, max_tokens: params.maxTokens || 2048, auditing: 'default' } }, payload: { message: { text: this.convertMessagesToSparkFormat(params.messages) } } }; // 获取带有鉴权信息的请求头 const headers = yield this.getAuthHeaders(); // 发送请求 try { const controller = new AbortController(); const timeoutId = setTimeout(() => controller.abort(), this.timeout); const response = yield fetch(this.baseUrl, { method: 'POST', headers, body: JSON.stringify(requestBody), signal: controller.signal }); clearTimeout(timeoutId); if (!response.ok) { throw new Error(`API请求失败: ${response.status} ${response.statusText}`); } const data = yield response.json(); // 处理星火API特定的响应格式 if (data.header.code !== 0) { throw new Error(`星火API错误: ${data.header.message} (代码: ${data.header.code})`); } // 提取回复文本 const text = data.payload.choices.text[0].content; // 返回统一格式的响应 return { text, usage: { promptTokens: data.payload.usage.text.prompt_tokens || 0, completionTokens: data.payload.usage.text.completion_tokens || 0, totalTokens: data.payload.usage.text.total_tokens || 0 }, rawResponse: data }; } catch (error) { if (error instanceof Error) { throw new Error(`[${this.name}] ${error.message}`); } throw error; } }); } /** * 转换消息格式为星火API格式 */ convertMessagesToSparkFormat(messages) { return messages.map(msg => { // 星火API使用不同的角色名称 let role = msg.role; if (role === 'system') { role = 'assistant'; // 星火API使用assistant作为系统消息 } else if (role === 'assistant') { role = 'assistant'; // 保持一致 } else { role = 'user'; // 默认为用户 } return { role, content: msg.content }; }); } /** * 获取星火API的领域/模型代码 */ getSparkDomain(modelName) { switch (modelName) { case SparkModel.LITE: return 'generalv3.5'; case SparkModel.PRO: return 'generalv3'; case SparkModel.PRO_128K: return 'generalv3.5'; case SparkModel.MAX: return 'generalv2'; case SparkModel.MAX_32K: return 'generalv2.5'; case SparkModel.ULTRA: return 'generalv4.0'; default: return 'generalv3'; // 默认使用Pro版本 } } /** * 生成JSON格式输出 */ generateJSON(params) { return __awaiter(this, void 0, void 0, function* () { const model = params.model || this.model; // 构建系统消息,指示返回JSON格式 const systemMessage = params.systemMessage ? `${params.systemMessage}\n请以有效的JSON格式返回回复。` : '请以有效的JSON格式返回回复。'; const messages = [ { role: 'system', content: systemMessage }, { role: 'user', content: params.prompt } ]; const response = yield this.chatCompletion({ model, messages, maxTokens: params.maxTokens, temperature: params.temperature || 0.1, // 降低温度以获得更确定的响应 topP: params.topP, stream: false }); try { // 尝试解析响应文本为JSON return JSON.parse(response.text); } catch (error) { // 如果解析失败,返回原始文本 console.warn(`[${this.name}] 无法解析响应为JSON: ${error instanceof Error ? error.message : '未知错误'}`); return { text: response.text, error: '解析JSON失败' }; } }); } } exports.SparkProvider = SparkProvider; //# sourceMappingURL=spark.js.map