aisapi
Version:
A JavaScript/TypeScript API library for multiple AI providers
209 lines • 8.08 kB
JavaScript
;
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.ZhipuProvider = exports.ZhipuModel = void 0;
const base_1 = require("./base");
/**
* 智谱AI可用模型
*/
var ZhipuModel;
(function (ZhipuModel) {
ZhipuModel["GLM_4"] = "glm-4";
ZhipuModel["GLM_3_TURBO"] = "glm-3-turbo";
ZhipuModel["CHATGLM_PRO"] = "chatglm_pro"; // 旧版对话优化模型
})(ZhipuModel || (exports.ZhipuModel = ZhipuModel = {}));
/**
* 智谱AI API实现
*/
class ZhipuProvider extends base_1.BaseProvider {
/**
* 创建智谱AI提供商实例
*/
constructor(options = {}) {
super(options);
this.name = 'Zhipu';
this.model = options.model || ZhipuModel.GLM_3_TURBO;
}
/**
* @inheritdoc
*/
getDefaultBaseUrl() {
return 'https://open.bigmodel.cn/api/paas/v4';
}
/**
* 获取请求头
*/
getHeaders() {
const headers = {
'Content-Type': 'application/json',
'Authorization': `Bearer ${this.apiKey}`
};
return headers;
}
/**
* @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, _b, _c, _d;
const requestBody = {
model: params.model || this.model,
messages: params.messages,
max_tokens: params.maxTokens,
temperature: (_a = params.temperature) !== null && _a !== void 0 ? _a : 0.7,
top_p: params.topP,
stream: params.stream || false
};
// 移除undefined字段
Object.keys(requestBody).forEach(key => {
if (requestBody[key] === undefined) {
delete requestBody[key];
}
});
// 发送请求
try {
const controller = new AbortController();
const timeoutId = setTimeout(() => controller.abort(), this.timeout);
const response = yield fetch(`${this.baseUrl}/chat/completions`, {
method: 'POST',
headers: this.getHeaders(),
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();
return {
text: data.choices[0].message.content || '',
usage: {
promptTokens: ((_b = data.usage) === null || _b === void 0 ? void 0 : _b.prompt_tokens) || 0,
completionTokens: ((_c = data.usage) === null || _c === void 0 ? void 0 : _c.completion_tokens) || 0,
totalTokens: ((_d = data.usage) === null || _d === void 0 ? void 0 : _d.total_tokens) || 0
},
rawResponse: data
};
}
catch (error) {
if (error instanceof Error) {
throw new Error(`[${this.name}] ${error.message}`);
}
throw error;
}
});
}
/**
* 流式聊天完成
*/
createStreamingChatCompletion(params) {
return __awaiter(this, void 0, void 0, function* () {
var _a;
const requestBody = {
model: params.model || this.model,
messages: params.messages,
max_tokens: params.maxTokens,
temperature: (_a = params.temperature) !== null && _a !== void 0 ? _a : 0.7,
top_p: params.topP,
stream: true
};
// 移除undefined字段
Object.keys(requestBody).forEach(key => {
if (requestBody[key] === undefined) {
delete requestBody[key];
}
});
const headers = this.getHeaders();
const url = `${this.baseUrl}/chat/completions`;
try {
const controller = new AbortController();
const timeoutId = setTimeout(() => controller.abort(), this.timeout);
const response = yield fetch(url, {
method: 'POST',
headers,
body: JSON.stringify(requestBody),
signal: controller.signal
});
clearTimeout(timeoutId);
if (!response.ok) {
throw new Error(`API请求失败: ${response.status} ${response.statusText}`);
}
return response.body;
}
catch (error) {
if (error instanceof Error) {
throw new Error(`[${this.name}] ${error.message}`);
}
throw error;
}
});
}
/**
* 生成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.ZhipuProvider = ZhipuProvider;
//# sourceMappingURL=zhipu.js.map