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

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

import express from 'express'
import * as dotenv from 'dotenv'
import cors from 'cors'
import {
	Configuration,
	OpenAIApi
} from 'openai'

dotenv.config()

const configuration = new Configuration({
	apiKey: process.env.OPENAI_API_KEY,
	baseOptions: {
		proxy: {
			host: '127.0.0.1', // 这里在window上搜索代理可查看自己的代理地址和端口,一般应该是一样的
			port: 7890
		}
	}
});

const openai = new OpenAIApi(configuration);

const app = express()
app.use(cors())
app.use(express.json())

app.get('/', async (req, res) => {
	res.status(200).send({
		message: 'Hello from MY-OPENAI!'
	})
})

app.post('/', async (req, res) => {
	// 设置响应头
	res.set({
		'Transfer-Encoding': 'chunked',
		'Cache-Control': 'no-cache',
		Connection: 'keep-alive',
		'Access-Control-Allow-Credentials': 'true',
		'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',
		'Access-Control-Allow-Headers': ' Content-Type',
	});
	try {
		const prompt = req.body.prompt;
		const params = {
			stream: true,
			messages: [{
				role: "user",
				content: `${prompt}`
			}],
			model: "gpt-3.5-turbo",
			logprobs: true,
			top_logprobs: 2,
		};
		const response = await openai.createChatCompletion(params, {
			// 使openai接口返回值为流式对象
			responseType: "stream",
		});
		// 实时监听流式对象response.data
		response.data.on("data", (data) => {
			res.write(data);
		});
		// res.status(200).send(
		// 	response.data
		// );
	} catch (error) {
		console.error(error)
		res.status(500).send(error || 'Something went wrong');
	}
})

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与预期的一样多次触发,成功接收多次的流式数据。

参考文章:滑动验证页面

  • 10
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值