doomiaichat
Version:
Doomisoft OpenAI
86 lines (83 loc) • 3.61 kB
text/typescript
import { ApiResult, CacheProvider, request } from "./declare";
import GptBase from "./gptbase"
const TOKEN_CACHE_KEY = "key:_doomisoft:baiduwenxin:"
export default class BaiduWenXinAI extends GptBase {
protected credential: ApiCredential;
private Cacher: CacheProvider|undefined;
/**
*
* @param credential 调用OpenAI 的key
* @param cacher 用作accesstoken的缓存
* @param apiOption 用作accesstoken的缓存
*/
constructor(credential: ApiCredential, cacher?:CacheProvider) {
super();
this.credential = credential;
this.Cacher = cacher;
}
/**
* 获取调用Api的Token
*/
async getAccessToken():Promise<AccessTokenResult>{
////如果当前应用是一个委托到第三方的
///公众号或小程序,则需要用关联的第三方平台来获取api调用的accesstoken
////如果是需要缓存token,则首先看缓存中是否有AccessToken
const accesstoken = this.Cacher ? (await this.Cacher.get(TOKEN_CACHE_KEY+this.credential.apikey)):null;
if (accesstoken) return { successed: true, access_token: accesstoken };
const option = {
url: `https://wenxin.baidu.com/moduleApi/portal/api/oauth/token?grant_type=client_credentials&client_id=${this.credential.apikey}&client_secret=${this.credential.securitykey}`,
method:"post",
};
const tokenData = await request(option);
if (tokenData.successed == true && !tokenData.data.code) {
///把api accesstoken缓存起来
if (this.Cacher){
this.Cacher.set(TOKEN_CACHE_KEY + this.credential.apikey, tokenData.data.data,3600*20);
}
return { successed: true, access_token: tokenData.data.data };
}
return { successed: false, error: tokenData.data.msg }
}
/**
* 请求GPT接口
*/
public async chatRequest(chatText: string | Array<any>, _paramOption: any, axiosOption: any = {}): Promise<ApiResult> {
console.log('call baidu')
if (!chatText) return { successed: false, error: { errcode: 2, errmsg: '缺失聊天的内容' } };
const accessToken = await this.getAccessToken();
if (!accessToken.successed || !accessToken.access_token) return {successed:false,error:'accesstoken get failed'}
try {
let param = {
...axiosOption,
method: "post",
data: {
text: `问题:${chatText}\n回答:`,
seq_len: 512,
topp: 0.5,
penalty_score: 1.2,
min_dec_len: 12,
min_dec_penalty_text: "。?:![<S>]",
task_prompt: "qa",
mask_type: "paragraph"
},
url:`https://wenxin.baidu.com/moduleApi/portal/api/rest/1.0/ernie/3.0.25/zeus?access_token=${accessToken.access_token}`
};
console.log('param', param)
const response = await request(param)
if (response.successed && !response.data.code) {
return { successed: true, ...response.data };
}
return { successed: false, ...response.data };
} catch (error) {
console.log('result is error ', error)
return { successed: false, error };
}
}
}
export interface AccessTokenResult extends ApiResult {
'access_token'?: string
}
export interface ApiCredential{
'apikey':string,
'securitykey': string
}