当前位置:   article > 正文

记录Uniapp和node实现微信小程序对接ChatGpt的流式输出的简单服务器端配置_小程序流式输出怎么弄

小程序流式输出怎么弄

         服务器端(node+express)与openai接口对接部分代码:

  1. import express from 'express'
  2. import * as dotenv from 'dotenv'
  3. import cors from 'cors'
  4. import {
  5. Configuration,
  6. OpenAIApi
  7. } from 'openai'
  8. dotenv.config()
  9. const configuration = new Configuration({
  10. apiKey: process.env.OPENAI_API_KEY,
  11. baseOptions: {
  12. proxy: {
  13. host: '127.0.0.1', // 这里在window上搜索代理可查看自己的代理地址和端口,一般应该是一样的
  14. port: 7890
  15. }
  16. }
  17. });
  18. const openai = new OpenAIApi(configuration);
  19. const app = express()
  20. app.use(cors())
  21. app.use(express.json())
  22. app.get('/', async (req, res) => {
  23. res.status(200).send({
  24. message: 'Hello from MY-OPENAI!'
  25. })
  26. })
  27. app.post('/', async (req, res) => {
  28. // 设置响应头
  29. res.set({
  30. 'Transfer-Encoding': 'chunked',
  31. 'Cache-Control': 'no-cache',
  32. Connection: 'keep-alive',
  33. 'Access-Control-Allow-Credentials': 'true',
  34. 'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',
  35. 'Access-Control-Allow-Headers': ' Content-Type',
  36. });
  37. try {
  38. const prompt = req.body.prompt;
  39. const params = {
  40. stream: true,
  41. messages: [{
  42. role: "user",
  43. content: `${prompt}`
  44. }],
  45. model: "gpt-3.5-turbo",
  46. logprobs: true,
  47. top_logprobs: 2,
  48. };
  49. const response = await openai.createChatCompletion(params, {
  50. // 使openai接口返回值为流式对象
  51. responseType: "stream",
  52. });
  53. // 实时监听流式对象response.data
  54. response.data.on("data", (data) => {
  55. res.write(data);
  56. });
  57. // res.status(200).send(
  58. // response.data
  59. // );
  60. } catch (error) {
  61. console.error(error)
  62. res.status(500).send(error || 'Something went wrong');
  63. }
  64. })
  65. app.listen(5000, () => console.log('AI server started on http://localhost:5000'))

       前端部分在uni.request内开启enableChunked: true,并且在requestTask.onHeadersReceived内部监听分块传输的各个数据chunk即可。

       调试一天,分块的数据总是一次全部传输,最终发现问题在于服务器端没有实时监听openai接口返回的流式对象,配置responseType: "stream"和 response.data.on("data", (data) => {res.write(data);});后,requestTask.onHeadersReceived与预期的一样多次触发,成功接收多次的流式数据。

参考文章:滑动验证页面

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/1019132
推荐阅读
相关标签
  

闽ICP备14008679号