V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  yowot0088  ›  全部回复第 1 页 / 共 1 页
回复总数  4
20 小时 45 分钟前
回复了 spike0100 创建的主题 macOS macos chatgpt app 原生拼音输入法打字丢字
same
159 天前
回复了 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   ·   实用小工具   ·   3068 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 13ms · UTC 12:51 · PVG 20:51 · LAX 04:51 · JFK 07:51
Developed with CodeLauncher
♥ Do have faith in what you're doing.