场景:类似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)响应请求的更多相关文章

  1. 微信小程序 - 非入侵式布局

    非入侵式布局,就是不影响原有内容以及代码,增加用户体验感(UE)的一种方式. 例如我们每个接口必须返回: 0:请求成功 -1:请求失败 .... 这样就便于前端判断数据是否加载成功,然后以客观的方式提 ...

  2. 微信小程序:wx.request之post请求后端无法获取数据的问题

    前言:小程序的开发中总是踩到各种坑,看文档也不知所云: 例如当我们在写微信小程序接口时,method请求方式有POST和GET两种,为了数据安全,我们会偏向于使用POST请求方式访问服务器端: 问题: ...

  3. 微信小程序开发——使用mock数据模拟api请求

    前言: 微信小程序开发中,后端提供了接口设计文档,前端可以先mock数据模拟api请求进行开发调试,而且可以根据需要设计mock文件的格式和内容,这样在后端接口开发完成之前,前端可以最大限度的完成前端 ...

  4. 微信小程序如何调用API实现数据请求-wx.request()

    前言 微信小程序不存在ajax,那么它是如何实现数据请求功能的呢?在微信中提供了API的调用wx.request(OBJECT),这个是很不错的.下面就讲一下如何请求数据,简单到不行. wx.requ ...

  5. 微信小程序中使用Async-await方法异步请求变为同步请求

    微信小程序中有些 Api 是异步的,无法直接进行同步处理.例如:wx.request.wx.showToast.wx.showLoading等.如果需要同步处理,可以使用如下方法: 注意: Async ...

  6. 微信小程序开发 [05] wx.request发送请求和妹纸图

    1.wx.request 微信小程序中用于发起网络请求的API就是wx.request了,具体的参数太多,此处就不再一一详举了,基本使用示例如下: wx.request({ url: 'test.ph ...

  7. 微信小程序开发调试阶段不校验请求域名

    在微信小程序开发官网上有说明: 在开发者工具的右上角有详情选项,可以勾选不校验合法域名,之后就可以与本地ip进行通信了!

  8. WeChat-SmallProgram:微信小程序中使用Async-await方法异步请求变为同步请求

    微信小程序中有些 Api 是异步的,无法直接进行同步处理.例如:wx.request.wx.showToast.wx.showLoading 等.如果需要同步处理,可以使用如下方法: 提示:Async ...

  9. 微信小程序开发——使用promise封装异步请求

    前言: 有在学vue的网友问如何封装网络请求,这里以正在写的小程序为例,做一个小程序的请求封装. 关于小程序发起 HTTPS 网络请求的Api,详情可以参考官方文档:wx.request(Object ...

  10. 微信小程序踩坑之一[wx.request]请求模式

    最近在做小程序时,使用wx.request()方法请求时, 当使传输string类型时,一定要声明method请求模式为post,否则会一直报错,而不声明时默认为get, 已填坑 =,= wx.req ...

随机推荐

  1. 【JS 逆向百例】有道翻译接口参数逆向

    逆向目标 目标:有道翻译接口参数 主页:https://fanyi.youdao.com/ 接口:https://fanyi.youdao.com/translate_o?smartresult=di ...

  2. TienChin 渠道管理-查看渠道接口

    自定义 hasPermission 校验规则 自定义一个 Spring Security hasPermission 校验规则: 在 tienchin-framework 模块当中进行自定义,新建 C ...

  3. Linux的信号管理 [补档-2023-07-30]

    信号 11-1简介: ​ 信号只是表示某个信号,不可以携带大量信息,信号需要满足特点的条件才会产生.是一种特别的通信手 段. 11-2 信号机制: ​ 假设有两个进程A,B,现在进程A给进程B发送信号 ...

  4. 5个前端开源项目带你在Web上体验Windows

    本文来分享五个 yyds 的开源项目,这些项目把 Windows 带到了 Web 平台上.让我们一起感受这些项目带来的回忆和创新,重温 Windows 93.98.XP 和 7 的经典界面,甚至探索现 ...

  5. ECMAScript 2023 新特性预览

    ECMAScript 2023 的最终版本预计将于今年 6 月底发布.会议基本已经确定 了 ECMAScript 2023 的新功能列表,预计不会再有任何重大的编辑更改. 着该提案已被 ECMAScr ...

  6. (python)每日代码||2024.1.29||斐波那契数列第i个数函数

    def fib(n): a, b = 0, 1 for _ in range(n): a, b = b, a + b return a

  7. MySQL-生成随机数字、字符串、日期、验证码及 UUID的方法

    一.生成随机数字 1. 生成 0 到 1 之间的随机数 MySQL 中的 RAND 函数可以用于生成一个大于等于 0 小于 1 的随机数字.例如: SELECT rand(); 该函数返回的数据类型为 ...

  8. NEMU PA 3-3 实验报告

    一.实验目的 在上一章PA3-2中,我们实现了分段机制,将48位的虚拟地址vaddr转换成了laddr.为什么不是paddr呢?这就要说到这一章要完成的东西:**分页机制 **. 从80386开始,计 ...

  9. NC50381 道路和航线

    题目链接 题目 题目描述 FarmerJohn正在一个新的销售区域对他的牛奶销售方案进行调查.他想把牛奶送到T个城镇,编号为1到T.这些城镇之间通过R条道路(编号为1到R)和P条航线(编号为1到P)连 ...

  10. Shiro-00-shiro 概览

    RBAC RBCA RBCA zh_CN Shiro Apache Shiro 是一个强大且易于使用的 Java 安全框架,负责执行身份验证.授权.加密和会话管理. 通过 Shiro 的易于理解的 A ...