yowot0088

yowot0088

V2EX 第 431234 号会员,加入于 2019-07-22 22:52:38 +08:00
今日活跃度排名 8395
根据 yowot0088 的设置,主题列表被隐藏
二手交易 相关的信息,包括已关闭的交易,不会被隐藏
yowot0088 最近回复了
3 小时 54 分钟前
回复了 pengyuedenai1234 创建的主题 宽带症候群 运营商正在屏蔽 ipv6 直播源
肥羊 allinone
30 天前
回复了 spike0100 创建的主题 macOS macos chatgpt app 原生拼音输入法打字丢字
same
188 天前
回复了 412999826 创建的主题 Apple macOS 15 beta3 ARC 浏览器很多按钮鼠标无法点击
target 是_blank 的 a 标签,点击之后会弹一个小窗出来,右上角有一个按钮可以放大,但是我怎么点都是关闭( macOS 15 Developer Beta3 + Arc 1.52.0 (51895))
2023-07-03 20:45:44 +08:00
回复了 s609926202 创建的主题 Node.js 使用 fetch 请求 openai stream 响应时,内容偶尔会被“切断”
附上我做的 ws api 的源码

```js
wss.on('connection', ws => {
let isConnected = true

ws.on('message', async e => {
let message = JSON.parse(e.toString())
if(message.type == 'conversation') {
let es = await fetch('https://api.openai.com/v1/chat/completions', {
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + 'YOUR_OPENAI_API_KEY'
},
method: 'POST',
body: JSON.stringify({
model: message.data.model,
messages: message.data.messages,
stream: true
})
})

const reader = es.body.pipeThrough(new TextDecoderStream()).getReader()

let errObj = ''

while(true) {
if(!isConnected) {
process.stdout.write('\n')
break
}
const res = await reader.read()
if(res.done) {
break
}
let chunk = res.value
chunk = chunk.replace(/data: /g, '').split('\n')

chunk.map(item => {
if(item != '[DONE]' && item != '' && item != undefined) {
let json

try {
if(errObj != '') {
item = errObj + item
errObj = ''
}

json = JSON.parse(item)

if(json.choices[0].delta.content == undefined) return
ws.send(JSON.stringify({
type: 'conversation',
data: {
type: 'continue',
text: json.choices[0].delta.content
}
}))
process.stdout.write(json.choices[0].delta.content)
}catch {
errObj = item
return
}

}else if(item == '[DONE]') {
ws.send(JSON.stringify({
type: 'conversation',
data: {
type: 'done',
text: null
}
}))
process.stdout.write('\n')
}
})
}
}
})

ws.onclose = () => {
isConnected = false
}
})
```
2023-07-03 20:44:06 +08:00
回复了 s609926202 创建的主题 Node.js 使用 fetch 请求 openai stream 响应时,内容偶尔会被“切断”
我的解决方法是,先判断一个 chunk 里最后的 data: 是否为一个合法的 json ,如果不是,则将下一次最开始接收到的字符串与前一次的非法 json 拼接,可以完美解决
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1530 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 10ms · UTC 16:51 · PVG 00:51 · LAX 08:51 · JFK 11:51
Developed with CodeLauncher
♥ Do have faith in what you're doing.