UNPKG

doomiaichat

Version:

Doomisoft OpenAI

86 lines (83 loc) 3.61 kB
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 }