草庐IT

微信小程序_调用openAi搭建虚拟伙伴聊天

yma16 2023-04-14 原文

微信小程序_调用openAi搭建虚拟伙伴聊天

背景

从2022年的年底,网上都是chagpt的传说,个人理解这个chatgpt是模型优化训练,我们在用chatgpt的时候就在优化这个模型,这个是付费的,换言之,我们都是chagpt的韭菜,OpenAI 是一个研究组织,chagpt是他们的一个产品工具。
带着好奇心做了个小程序的聊天页面。

效果

像个机器人聊天

关于账号注册

由于国内电话不支持绑定openAi的邮箱,需要虚拟号码激活具体步骤网上都有教程

接口实现

8行python搞定

install openai,获取apiKey,调用即可向openai发送请求

def getOpenAiText(request):
    if request.method == 'GET':
        text = request.GET.get('text', default='')
        responseText = openai.Completion.create(
            model="text-davinci-003",
            prompt=text,
            max_tokens=100,
            temperature=0
        )
        return JsonResponse({"data": responseText, "code": 200,"msg":'success'})
    return JsonResponse({"data": {}, "code": 0,"msg":'not allowed'})

小程序实现

设计思路:灵感来源微信对话框模式一对一
只需要设计数据结构为
[{
question:‘’,
answer:‘’,
isEdit:false
}]
可以显示问答的状态
在添加一个currentIndex标识编辑的状态,遍历数字显示,加上时间绑定即可实现,
缓存采用storage。

页面结构

<view class="container-future">
  <view class="form-container-api">
    <view>
      <button style="width: 100%;" type="primary" formType="submit">openai调用</button>
    </view>
    <view class="chat-container">
      <view wx:for="{{ chatObjConfig.option }}" wx:for-index="index" wx:for-item="item" wx:key="index">
        <view class="form-request">
          <view wx:if="{{item.isEdit}}">问:$ <input bindinput="bindKeyInput" placeholder="输入关键词" data-column-index="{{index}}" disabled="{{isLoading}}" /></view> 
          <view wx:else class='questioned'>
          <view>
            问:$ {{item.question}}
          </view>
          </view>
        </view>
        <view class="form-response">
          
          <view class='questioned'>openai回答:$ {{item.answer}}</view>
        </view>
      </view>
    </view>
    <view class="form-submit">
      <button style="width: 100%;" type="primary" bindtap="search" loading="{{isLoading}}" disabled="{{isLoading}}">发送</button>
    </view>
  </view>
  <view class="loading" wx:if="{{isLoading}}">
    <view class="loader-child" />
    <view class="loader-child" />
    <view class="loader-child" />
  </view>
</view>

数据逻辑

// pages/future/future.js
const app = getApp();
const baseUrl = app.remoteConfig.baseUrl;
Component({

  /**
  * 继承父级样式
  */
  options: {
    addGlobalClass: true,
  },
  /**
   *组件的初始数据
   */
  data: {
    searchOpenAiText:'',
    responseText:'',
    // questions,answer,index
    chatObjConfig:{
      option:[{
        question:'',
        answer:'',
        isEdit:true
      }],
      currentIndex:0
    }
  },
  lifetimes: {
    // 生命周期函数,可以为函数,或一个在 methods 段中定义的方法名
    attached: function () {
      if(wx.getStorageSync('openAiOptions')){
        this.setData(
          {
            chatObjConfig:wx.getStorageSync('openAiOptions')
          }
        )
      }
    },
    moved: function () { },
    detached: function () {
      wx.setStorageSync('openAiOptions', this.data.chatObjConfig)
    },
  },

  methods: {
    bindKeyInput(e) {
      const {columnIndex}=e.currentTarget.dataset
      console.log('this.data.chatObjConfig',this.data.chatObjConfig)
      const option=this.data.chatObjConfig.option
      option.some((item,index)=>{
        if(columnIndex===index){
          item.question=e.detail.value
          item.isEdit=true
          return true
        }
        return false
      })
      this.setData({
        searchOpenAiText:e.detail.value,
        chatObjConfig:{
          option:option,
          currentIndex:columnIndex
        }
      })
    },
    search(e){
      console.log(this.data.searchOpenAiText)
      if(!this.data.searchOpenAiText){
        wx.showModal({
          cancelColor: 'cancelColor',
          title:'请输入!'
        })
      }
      wx.showLoading({
        title: '加载中',
      })
      this.setData({
        isLoading: true
      })
      console.log(e)
      const path = '/common-api/searchOpenAiText/'
      const headers = { 'Content-Type': 'application/json;charset=UTF-8' }
      const params={
        "text":this.data.searchOpenAiText
      }
      const thisBack=this
      return new Promise((resolve, reject) => {
        wx.request({
          url: baseUrl + path,
          headers: headers,
          data:params,
          method: 'GET',
          success: (res) => {
            console.log(res,'res')
            const data=res.data.data
            const option=thisBack.data.chatObjConfig.option
            const currentIndex=thisBack.data.chatObjConfig.currentIndex
            const choices=data.choices
            console.log('choices',choices)
            option.some((item,index)=>{
              if(currentIndex===index){
                item.answer=choices?choices.map(choicesItem=>{return choicesItem.text}).join('\n'):'。。。未知'
                item.isEdit=false
                return true
              }
              return false
            })
            const chatObjConfig={
              option:option,
              currentIndex:currentIndex+1
            }
            option.push({
              question:'',
              answer:'',
              isEdit:true
            })
            thisBack.setData(
              {
                isLoading: false,
                chatObjConfig:chatObjConfig
              }
            )
            setTimeout(function () {
              wx.hideLoading()
            }, 2000)
            resolve(res)
          },
          fail: error => {
            thisBack.setData({
              isLoading: false
            })
            setTimeout(function () {
              wx.hideLoading()
            }, 2000)
            reject(error)
          }
        });
      })
    }
  }
})

结束

最后我的小程序:yma16
欢迎大家访问!

有关微信小程序_调用openAi搭建虚拟伙伴聊天的更多相关文章

  1. 使用 ACL 调用 upload_file 时出现 Ruby S3 "Access Denied"错误 - 2

    我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file

  2. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  3. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  4. ruby - 调用其他方法的 TDD 方法的正确方法 - 2

    我需要一些关于TDD概念的帮助。假设我有以下代码defexecute(command)casecommandwhen"c"create_new_characterwhen"i"display_inventoryendenddefcreate_new_character#dostufftocreatenewcharacterenddefdisplay_inventory#dostufftodisplayinventoryend现在我不确定要为什么编写单元测试。如果我为execute方法编写单元测试,那不是几乎涵盖了我对create_new_character和display_invent

  5. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  6. C51单片机——实现用独立按键控制LED亮灭(调用函数篇) - 2

    说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时

  7. 在VMware16虚拟机安装Ubuntu详细教程 - 2

    在VMware16.2.4安装Ubuntu一、安装VMware1.打开VMwareWorkstationPro官网,点击即可进入。2.进入后向下滑动找到Workstation16ProforWindows,点击立即下载。3.下载完成,文件大小615MB,如下图:4.鼠标右击,以管理员身份运行。5.点击下一步6.勾选条款,点击下一步7.先勾选,再点击下一步8.去掉勾选,点击下一步9.点击下一步10.点击安装11.点击许可证12.在百度上搜索VM16许可证,复制填入,然后点击输入即可,亲测有效。13.点击完成14.重启系统,点击是15.双击VMwareWorkstationPro图标,进入虚拟机主

  8. 微信小程序通过字典表匹配对应数据 - 2

    前言一般来说,前端根据后台返回code码展示对应内容只需要在前台判断code值展示对应的内容即可,但要是匹配的code码比较多或者多个页面用到时,为了便于后期维护,后台就会使用字典表让前端匹配,下面我将在微信小程序中通过wxs的方法实现这个操作。为什么要使用wxs?{{method(a,b)}}可以看到,上述代码是一个调用方法传值的操作,在vue中很常见,多用于数据之间的转换,但由于微信小程序诸多限制的原因,你并不能优雅的这样操作,可能有人会说,为什么不用if判断实现呢?但是if判断的局限性在于如果存在数据量过大时,大量重复性操作和if判断会让你的代码显得异常冗余。wxswxs相当于是一个独立

  9. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  10. 微信小程序开发入门与实战(Behaviors使用) - 2

    @作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors    1、什么是behaviors    2、behaviors的工作方式    3、创建behavior    4、导入并使用behavior    5、behavior中所有可用的节点    6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors    1、什么是behaviorsbehaviors是小程序中,用于实现

随机推荐