当前位置:   article > 正文

手把手教你搭建微信聊天机器人系列(五):对接文心一言4.0_文心一言接入微信群

文心一言接入微信群

        之前的章节算是已经比较完整的实现了聊天功能,本来打算直接结束的。前几天听说文心一言4.0开放了公测,所以也去申请了一下,2天后就收到了通过短信。通过以后,可以在之前申请的应用列表中,点击“详情”,在“服务配置”的最后一行可以看到ERNIE-Bot 4.0

目前一直到10月底,4.0接口是免费的,大家抓紧时间体验。

        我们看一下API文档,发现调用方式和之前的类似,我们可以调整一下代码底层,将其配置化,以方便我们在不同的模型间进行切换。

config/config.default.js调整代码如下:

  1. config.ernie = {
  2. client_id: '填入您的API Key', //API Key
  3. client_secret: '填入您的Secret Key',//Secret Key
  4. access_token: '', //先置空,后续由程序填充
  5. expire_day: 30, //access_token过期时长(天)
  6. gpt_model: 'ERNIE-Bot-4', //此处值对应gpt_list中的type
  7. gpt_list: [{
  8. type: 'ERNIE-Bot-4', //文心一言4.0
  9. url: 'https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions_pro'
  10. }, {
  11. type: 'ERNIE-Bot', //文心一言
  12. url: 'https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions'
  13. }, {
  14. type: 'ERNIE-Bot-turbo', //文心一言轻量版
  15. url: 'https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/eb-instant'
  16. }]
  17. }

app/service/ernie.js全部代码如下:

  1. const {
  2. Service
  3. } = require('egg');
  4. const moment = require('moment');
  5. class ErnieService extends Service {
  6. async getAccessToken() {
  7. console.log('===================ErnieService getAccessToken=====================');
  8. let ctx = this.ctx;
  9. try {
  10. const res = await ctx.curl(
  11. `https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=${ctx.app.config.ernie.client_id}&client_secret=${ctx.app.config.ernie.client_secret}`, {
  12. method: 'GET',
  13. rejectUnauthorized: false,
  14. data: {},
  15. headers: {},
  16. timeout: 30000,
  17. contentType: 'json',
  18. dataType: 'json',
  19. })
  20. console.log(res)
  21. if (res.data.access_token) {
  22. console.log('access_token', ctx.app.config.ernie.access_token)
  23. return res.data.access_token;
  24. }
  25. } catch (error) {
  26. console.log(error)
  27. }
  28. return null;
  29. }
  30. async sendMsg(msg) {
  31. console.log('===================ErnieService sendMsg=====================');
  32. console.log(JSON.stringify(msg));
  33. let ctx = this.ctx;
  34. let gpt_url;
  35. for (let i of ctx.app.config.ernie.gpt_list) {
  36. if (i.type === ctx.app.config.ernie.gpt_model) {
  37. gpt_url = i.url;
  38. break;
  39. }
  40. }
  41. if (!gpt_url) {
  42. console.log('您设置的gpt_model值不存在');
  43. return null;
  44. }
  45. try {
  46. const res = await ctx.curl(
  47. `${gpt_url}?access_token=${ctx.app.config.ernie.access_token}`, {
  48. method: 'POST',
  49. rejectUnauthorized: false,
  50. data: {
  51. "messages": msg
  52. },
  53. timeout: 30000,
  54. contentType: 'json',
  55. dataType: 'json',
  56. })
  57. console.log(res)
  58. if (res.data) {
  59. if (res.data.error_code == '111') { //token过期
  60. await ctx.service.ernie.checkAccessToken(true);
  61. }
  62. return res.data;
  63. }
  64. return null;
  65. } catch (error) {
  66. console.log(error)
  67. return null;
  68. }
  69. }
  70. async checkAccessToken(forceReflesh) { //forceReflesh强制刷新
  71. console.log('===================ErnieService checkAccessToken=====================');
  72. let ctx = this.ctx;
  73. const query = {};
  74. const accessToken = await ctx.model.AccessToken.findOne(query);
  75. if (accessToken) {
  76. console.log('accessToken', accessToken.access_token, accessToken.updated_at);
  77. if (moment(new Date()).diff(moment(accessToken.updated_at), 'days') >= ctx.app.config.ernie.expire_day -
  78. 1 || forceReflesh) { //提前一天刷新
  79. console.log('accessToken已失效,重新获取中')
  80. const accessTokenStr = await ctx.service.ernie.getAccessToken();
  81. if (accessTokenStr) {
  82. await accessToken.update({
  83. accessToken: accessTokenStr,
  84. updated_at: moment().format('YYYY-MM-DD HH:mm:ss')
  85. });
  86. ctx.app.config.ernie.access_token = accessTokenStr;
  87. console.log('accessToken更新成功');
  88. } else {
  89. console.log('accessToken获取失败');
  90. }
  91. } else {
  92. ctx.app.config.ernie.access_token = accessToken.access_token;
  93. console.log('accessToken在有效期内');
  94. }
  95. } else {
  96. console.log('accessToken不存在');
  97. const accessTokenStr = await ctx.service.ernie.getAccessToken();
  98. if (accessTokenStr) {
  99. const queryData = await ctx.model.AccessToken.create({
  100. access_token: accessTokenStr
  101. });
  102. ctx.app.config.ernie.access_token = accessTokenStr;
  103. console.log('accessToken更新成功');
  104. } else {
  105. console.log('accessToken获取失败');
  106. }
  107. }
  108. }
  109. }
  110. module.exports = ErnieService;

最近发现access_token有时候莫名其妙的就过期,所以我们加入了强制刷新的逻辑。我们在app.js中也可以加入强制刷新,让服务一启动就刷新access_token。

app.js部分代码:

  1. app.ready(async () => {
  2. console.log("==app ready==");
  3. let ctx = app.createAnonymousContext();
  4. await ctx.service.ernie.checkAccessToken(true); //强制刷新AccessToken
  5. await ctx.service.wechat.startBot(); //初始化BOT
  6. })

至此,我们已经可以在三种不同的模型直接快速切换,仅需要调整config.ernie.gpt_model配置项。

 ​ 本章完整代码在这里下载。运行前请先申请文心一言4.0测试资格,配置好config/config.default.js里面config.ernie下的client_id和client_secret配置项。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/316786?site
推荐阅读
相关标签
  

闽ICP备14008679号