聊聊微信小程序的流式(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 ...
随机推荐
- 【JS 逆向百例】X球投资者社区 cookie 参数 acw_sc__v2 加密分析
关注微信公众号:K哥爬虫,持续分享爬虫进阶.JS/安卓逆向等技术干货! 声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后 ...
- c++ container容器(string,vector,map,queue,stack等等)
STL和c++标准库 标准模板库STL部分包含在C++标准库中的软件库. c++标准库:即以std::开头,但是部分编译器厂商也会把STL的内容放在std:: namespace里面 由于一个常见的误 ...
- pymysql基本使用规则
1.执行SQL #!/usr/bin/env python # -*- coding:utf-8 -*- import pymysql # 创建连接 conn = pymysql.connect(ho ...
- VB6的OfficeMenu控件 - 开源研究系列文章
这次将原来VB6中喜欢和使用到的OfficeMenu的控件做一个使用介绍. 上次介绍了VB6中的控件引擎,但是那个只针对基本的控件,这个OfficeMenu控件在当时是收费的,笔者找度娘好不容易才下载 ...
- PHP基础题目
1.请写一个函数实现以下功能:字符串'open_door'转换成'OpenDoor','make_by_id'转换成'MakeById' function strHandle($str) { $ret ...
- d3d12龙书阅读----数学基础 向量代数、矩阵代数、变换
d3d12龙书阅读----数学基础 向量代数.矩阵代数.变换 directx 采用左手坐标系 点积与叉积 点积与叉积的正交化 使用点积进行正交化 使用叉积进行正交化 矩阵与矩阵乘法 转置矩阵 单位矩阵 ...
- 我的微软 MVP 之路
目录 微软 MVP 大礼包 我的社区经历 如何成为微软 MVP 微软 MVP 权益 总结 微软 MVP 大礼包 今天,我收到了飘洋过海的微软 MVP 大礼包,内心无比激动,礼包内包含了一座水晶奖杯,一 ...
- Windows 10 配置Java 环境变量
下载 JDK 下载地址:https://www.oracle.com/java/technologies/downloads/ 点击下载按钮: 开始安装JDK: 可以设置为你想安装的路径. 环境变量配 ...
- 使用 .NET 8.0 和 OpenGL 创建一个简易的渲染器
前言我个人对三维渲染领域的开发有着浓厚的兴趣,尽管并未在相关行业工作过,我的了解还很片面.去年,在与群友聊天时,他们推荐了一本<Unity Shader入门精要>,说适合像我这样想自学的新 ...
- Sentinel 源码学习
引入依赖 <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-co ...