首页 > 编程语言 >聊聊微信小程序的流式(stream)响应请求

聊聊微信小程序的流式(stream)响应请求

时间:2024-02-19 18:36:49浏览次数:24  
标签:stream 微信 chunk 流式 openai chat message config

场景:类似ChatGPT的逐字显示效果。

流程:服务端我用Python的flask框架(向外提供API接口)实现,服务部署在replit上,Python调用azure 的chatgpt服务(需要申请),并以流式的形式返回,小程序再调用这个流式接口实现。

我会提供最小能运行的完整代码示例。

我本地的Python版本:3.10.11、Flask版本:2.3.2、openai版本:0.27.8。

python部分:

/main.py:

from data.chat_completion import ChatCompletion

@app.route("/chat", methods=['POST'])

@log_streaming_request

def love_chat():

  message_list = request.json.get('message_list', [])

  message = []

  message.extend(message_list)

  try:

    response = ChatCompletion().create(message, True)

    def generate():

    for chunk in response:

      if not chunk['id']:

      	continue

      if 'delta' in chunk["choices"][0] and 'content' in chunk['choices'][0]['delta']:

      	yield chunk['choices'][0]['delta']['content']

      return generate()

  except Exception as e:

    print("chat Exception:{}".format(str(e)))

    return Response("异常了,请重试", status=500)


if __name__ == "__main__":

app.run(debug=True, port=5000, host="0.0.0.0")

/chat/chat_completion.py:

import openai

import setting

openai.api_key = setting.API_KEY

openai.api_base = setting.API_BASE

openai.api_type = setting.API_TYPE

openai.api_version = "2023-05-15" # 版本对应 2023-05-15、

class ChatCompletion:

  temperature_default = 0.6 # 默认值

  deployment_name = "gpt-35-turbo16k" # 可选 gpt-35(4kb)、gpt-35-turbo16k(16kb,更大的上下文)

  def create(self, message, stream=False, temperature_default=None):

    """

    创建一个流式的响应

    :param message:

    :param stream: 是否以流式的形式响应

    :param temperature_default:

    :return:

    """

    if not temperature_default:

    	temperature_default = self.temperature_default

    return openai.ChatCompletion.create(

      engine=self.deployment_name,

      messages=message,

      # max_tokens=10,

      temperature=temperature_default,

      stream=stream,

    )

/setting.py:

API_KEY = "xxxxxxxxxxxxxxxxxxxx"

API_BASE = "https://xxxxx.openai.azure.com/"

API_TYPE = "azure"

到此Python部分结束了。

下面是小程序部分,核心部分,可兼容同步请求:

chat.js:

/**

* 支持流式获取响应内容

* @param {message_list} 消息列表

* @param {success_cb} 请求成功的回调

* @param {err_cb} 请求失败的回调

*/

export const love_chat_stream = (data, config, success_cb = () => {}, err_cb = () => {}) => {

  if (!config.hasOwnProperty('ai_report_chunk')) {

  	config.ai_report_chunk = false // 如果没有传入,则默认不支持流式

  }

  return wx.request({

    url: "填入自己服务器的地址" + '/chat',

    responseType: config.ai_report_chunk ? "arraybuffer" : "text/html",

    method: 'POST',

    enableChunked: config.ai_report_chunk,

    header: {

    	'content-type': 'application/json'

    },

    enableQuic: true,

    enableCache: true,

    data: data,

    timeout: get_request_config().openai_request_time_out,

    success: (res) => {

      if (res.statusCode != 200) {

      	err_cb(config, res.errMsg)

      } else {

      if (!config.ai_report_chunk) {

      	// 非流式

     	 res = res.data

    }

    success_cb(config, res)

    }

    },

    fail: (err) => {

    	err_cb(config, err)

    },

    complete: () => {}

  });

}

效果如下:

 

这篇文章就到这里啦!如果你对文章内容有疑问或想要深入讨论,欢迎在评论区留言,我会尽力回答。同时,如果你觉得这篇文章对你有帮助,不妨点个赞并分享给其他同学,让更多人受益。

想要了解更多相关知识,可以查看我以往的文章,其中有许多精彩内容。记得关注我,获取及时更新,我们可以一起学习、讨论技术,共同进步。

感谢你的阅读与支持,期待在未来的文章中与你再次相遇!

标签:stream,微信,chunk,流式,openai,chat,message,config
From: https://www.cnblogs.com/shuinanxun/p/18021707

相关文章

  • uniapp的H5端微信与支付宝支付(包括PC端与移动端)
    PC端:大致流程为1、请求创建订单接口传递正确参数(例如openid、金额、开始结束时间等),此接口会返回一个图片,或网络图片,或base64图片,这个图片是一张二维码;2、前端拿到这个二维码渲染到屏幕上并开始启动定时器,每过一秒请求一次查询支付结果接口,查询是否支付成功;3、支付宝支付可能会......
  • 微信自定义关键词,自动回复,微信公众号文章采集,开发已测试,欢迎大家来测试使用!
    本文主要是通过获取本地的句柄然后用来截取微信的消息,所以可以有效做到 零封号 零丢包 零失误  !!!经测试,可以自定义关键词和回复语(一行一个)可无限添加关键词和对应的回复语!回复时间基本在1秒以内,可以做到检测到关键词存在时即时回复的功能,可以获取到微信公众号文章等信......
  • 完美禁止微信网页下拉显示网页由某某提供
    简单理解就是:判断手指触摸移动走向-如果到顶之后-还在继续下拉,就阻止默认的touchmove事件【有用、无用请留言,谢谢】建议写在html页面中,第一时间生效。<script>      //禁用微信下拉      letlastTouchY=0;      wind......
  • 唯一客服系统:Golang开发客服系统源码,支持网页,H5,APP,微信小程序公众号等接入,商家有PC端
    本系统采用GolangGin框架+GORM+MySQL+Vue+ElementUI开发的独立高性能在线客服系统。客服系统访客端支持PC端、移动端、小程序、公众号中接入客服,利用超链接、网页内嵌、二维码、定制对接等方式让网上所有通道都可以快速通过本系统联系到商家。 服务端可编译为二进制程序包,无......
  • 报废车综合管理系统 系统源码加微信820688215 获取商业授权 体验官方地址 www.lvxun.v
    报废车综合管理系统系统源码加微信820688215获取商业授权体验官方地址 www.lvxun.vip  ......
  • 提高Java开发生产力,我选Stream API,真香啊
    Java8引入的StreamAPI提供了一种新的数据处理方式,它以声明式、函数式的编程模型,极大地简化了对集合、数组或其他支持数据源的操作。Stream可以被看作是一系列元素的流水线。允许你高效地对大量数据执行复杂的过滤、映射、排序、聚合等操作,而无需显式地使用循环或者临时变量。St......
  • flutter开发Future与Stream的理解和区别
    flutter开发Future与Stream的理解和区别Future特点Future是表示一个异步操作的单个结果,只返回一次结果。通常用于处理一次性的异步操作。Future通过then()和catchError()方法来处理异步操作的结果和异常。Future使用await关键字来等待异步操作完成。FutureBuilder:通过监听......
  • Streamlit输出可下载xlsx文件到浏览器
    Streamlit以及业界给出的示例大多为针对csv文件的,但在实践中,数据经过处理后以xlsx文件输出的需求也不少。xlsx文件更接地气,更接近最终用户的需求。openpyxl是我最喜爱的xlsx文件处理工具,速度快功能强大,在使用Streamlit自作网站的时候自然优先选用。base64可理解为一种加密工具,将......
  • Ubuntu 安装微信
    1.deepinwine的方式1)运行如下一条命令将移植仓库添加到系统中wget-O-https://deepin-wine.i-m.dev/setup.sh|sh自此以后,你可以像对待普通的软件包一样,使用apt-get系列命令进行各种应用安装、更新和卸载清理了。2)安装微信sudoapt-getinstallcom.qq.weixin.deepin......
  • 支付宝手机网站支付与微信支付对比的优缺点
    介绍:支付宝手机网站支付是指商户在移动端网页展示商品或服务,用户在商户页面确认使用支付宝支付后,浏览器自动跳转支付宝APP或支付宝网页完成付款的支付产品。通常手机支付分为三步:1.创建支付订单2.将支付订单信息给到用户完成支付3.支付渠道回调支付结果/主动查询支付渠道支......