聊聊微信小程序的流式(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 ...
随机推荐
- Vue3类型判断和ref的两个作用
1.类型判断的四种方法 isRef: 检查一个值是否为一个ref对象 isReactive:检查一个对象是否是由 reactive 创建的响应式代理 isReadonly: 检查一个对象是否是由 re ...
- ClickHouse(08)ClickHouse表引擎概况
目录 合并树家族 日志引擎系列 集成的表引擎 其他特殊的引擎 资料分享 参考文章 目前ClickHouse的表引擎主要有下面四个系列,合并树家族.日志引擎系列.集成的表引擎和其他特殊的引擎. 合并树家 ...
- Docker 安装 MySQL8 数据库
创建数据卷 mkdir -p /usr/mysql/conf /usr/mysql/data chmod -R 755 /usr/mysql/ 创建配置文件 vim /usr/mysql/conf/m ...
- Metasploit 生成带SSL加密载荷
1.下载证书.Impersonate_SSL模块,下载指定网站的证书. msf6> use auxiliary/gather/impersonate_ssl msf6 auxiliary(gat ...
- nginx+uwsgi环境部署
WSGI django自带的wsgiref 在调试模式下使用的wsgi的文件,网关接口,协议 uwsgi:协议 uWSGI:具体实现方式 安装 ``` pip3 install uwsgi -i ht ...
- Python3.11.3解决ModuleNotFoundError: No module named 'Crypto'
安装了Crypto但程序还提示 ModuleNotFoundError: No module named 'Crypto' 反复卸载安装都不行,最后修改了文件夹的名称解决了. 找到Python的安装路 ...
- centos多网卡时修改网卡的优先级
我有个服务器有多个网卡,分别配置了多个网段的IP地址,发现有一个网段ping不通.最后发现是路由优先级的问题. 查看路由 查看本机路由route主要看Metric的值,值越小表示优先级越高,取值范围1 ...
- 关于elementui日期组件 date.getHours() is not a function 等问题
问题 日期控件中,假设当前显示日期为2020-01-01,现在需要修改为2020-01-03:点开日期组件框点击选择其他日期时, 控制台有可能会报错,显示 date.getHours() is n ...
- Dash 2.15版本新特性介绍
本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/dash-master 大家好我是费老师,Dash不久前发布了其2.15.0版本,新增了一些实用的特性 ...
- go中的 位预算,反码、补码、原码
https://baike.baidu.com/item/%E4%BD%8D%E8%BF%90%E7%AE%97/6888804 首先关于"位运算",看下百度百科就行了. 总结:在 ...