聊聊微信小程序的流式(stream)响应请求
场景:类似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)响应请求的更多相关文章
- 微信小程序 - 非入侵式布局
非入侵式布局,就是不影响原有内容以及代码,增加用户体验感(UE)的一种方式. 例如我们每个接口必须返回: 0:请求成功 -1:请求失败 .... 这样就便于前端判断数据是否加载成功,然后以客观的方式提 ...
- 微信小程序:wx.request之post请求后端无法获取数据的问题
前言:小程序的开发中总是踩到各种坑,看文档也不知所云: 例如当我们在写微信小程序接口时,method请求方式有POST和GET两种,为了数据安全,我们会偏向于使用POST请求方式访问服务器端: 问题: ...
- 微信小程序开发——使用mock数据模拟api请求
前言: 微信小程序开发中,后端提供了接口设计文档,前端可以先mock数据模拟api请求进行开发调试,而且可以根据需要设计mock文件的格式和内容,这样在后端接口开发完成之前,前端可以最大限度的完成前端 ...
- 微信小程序如何调用API实现数据请求-wx.request()
前言 微信小程序不存在ajax,那么它是如何实现数据请求功能的呢?在微信中提供了API的调用wx.request(OBJECT),这个是很不错的.下面就讲一下如何请求数据,简单到不行. wx.requ ...
- 微信小程序中使用Async-await方法异步请求变为同步请求
微信小程序中有些 Api 是异步的,无法直接进行同步处理.例如:wx.request.wx.showToast.wx.showLoading等.如果需要同步处理,可以使用如下方法: 注意: Async ...
- 微信小程序开发 [05] wx.request发送请求和妹纸图
1.wx.request 微信小程序中用于发起网络请求的API就是wx.request了,具体的参数太多,此处就不再一一详举了,基本使用示例如下: wx.request({ url: 'test.ph ...
- 微信小程序开发调试阶段不校验请求域名
在微信小程序开发官网上有说明: 在开发者工具的右上角有详情选项,可以勾选不校验合法域名,之后就可以与本地ip进行通信了!
- WeChat-SmallProgram:微信小程序中使用Async-await方法异步请求变为同步请求
微信小程序中有些 Api 是异步的,无法直接进行同步处理.例如:wx.request.wx.showToast.wx.showLoading 等.如果需要同步处理,可以使用如下方法: 提示:Async ...
- 微信小程序开发——使用promise封装异步请求
前言: 有在学vue的网友问如何封装网络请求,这里以正在写的小程序为例,做一个小程序的请求封装. 关于小程序发起 HTTPS 网络请求的Api,详情可以参考官方文档:wx.request(Object ...
- 微信小程序踩坑之一[wx.request]请求模式
最近在做小程序时,使用wx.request()方法请求时, 当使传输string类型时,一定要声明method请求模式为post,否则会一直报错,而不声明时默认为get, 已填坑 =,= wx.req ...
随机推荐
- React数据通信父传子和子传父的使用
组件中的props 在react中,props的特点是: 1.可以给组件传递任意类型的数据 2.props是只读的对象,只能够读取属性的值,无法修改对象 如过我们强行修改数据,会报错,告诉我们该属性是 ...
- vue中jsx
//item.vue 文件如下 <template> <div> <h1 v-if="id===1"> <slot></slo ...
- typeof的用法和注意点
基本数据类型和查看数据类型 1==>js有六种基本数据类型. String Boolean Number null underfined Symbol [6种] 但是<你不知道的javas ...
- 【K哥爬虫普法】孤注一掷的爬虫er,究竟还要误入歧途多远?
我国目前并未出台专门针对网络爬虫技术的法律规范,但在司法实践中,相关判决已屡见不鲜,K 哥特设了"K哥爬虫普法"专栏,本栏目通过对真实案例的分析,旨在提高广大爬虫工程师的法律意识, ...
- 【JS 逆向百例】网洛者反爬练习平台第二题:JJEncode 加密
关注微信公众号:K哥爬虫,持续分享爬虫进阶.JS/安卓逆向等技术干货! 声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后 ...
- slices in Go 1.21
Go 1.21中新增的 slices包中提供了很多与切片相关的函数,适用于任意类型的切片. 本文内容来自官方文档 BinarySearch 函数签名如下: func BinarySearch[S ~[ ...
- Hadoop超详细讲解之单节点搭建
1 Hadoop介绍 Hadoop是Apache旗下的一个用java语言实现开源软件框架,是一个开发和运行处理大规模数据的软件平台.允许使用简单的编程模型在大量计算机集群上对大型数据集进行分布式处理. ...
- Java并发编程面试题
Synchronized 用过吗,其原理是什么? Synchronized是jvm实现的一种互斥同步访问方式,底层是基于对象的监视器monitor实现的. 被synchronize修饰的代码在反编译后 ...
- pymysql基本使用规则
1.执行SQL #!/usr/bin/env python # -*- coding:utf-8 -*- import pymysql # 创建连接 conn = pymysql.connect(ho ...
- 三星发布990 EVO SSD:同时支持PCIe 4.0和PCIe 5.0
1月8日消息,三星发布了新款产品--990 EVO SSD,这是首款同时支持了PCIe 4.0 x4及PCIe 5.0 x2通道的SSD. 据了解,990 EVO面向中端市场,为2280 M.2规格, ...