Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: parse sse #532

Merged
merged 2 commits into from
Oct 30, 2023
Merged

fix: parse sse #532

merged 2 commits into from
Oct 30, 2023

Conversation

bowencool
Copy link
Contributor

@bowencool bowencool commented Oct 17, 2023

请看图中的 Case,每个 chunk 并不是严格以 data: 分隔的:

CleanShot 2023-10-17 at 11 33 12@2x

按照 eventsource-parser 的文档,你应该把 try catch 移动到 onParse 里面。

我是 API 的开发者,虽然这个 API 比较特别,但确实是解析的代码不够规范,我试了其他三四种客户端,均没有出现次问题。

我在本地测试时解决了这个问题。而且貌似还顺带解决了偶尔出现“�”的问题。

@bowencool
Copy link
Contributor Author

bowencool commented Oct 17, 2023

如果你想对比修改前后的效果:

@josStorer josStorer merged commit 0f3ec38 into josStorer:master Oct 30, 2023
1 check passed
@josStorer
Copy link
Owner

感谢反馈!

josStorer added a commit that referenced this pull request Oct 30, 2023
Comment on lines -25 to -34
try {
const formattedData = JSON.parse(
str
.replace(/^"|"$/g, '')
.replaceAll('\\"', '"')
.replaceAll('\\\\u', '\\u')
.replaceAll('\\\\n', '\\n'),
)
const formattedStr = 'data: ' + JSON.stringify(formattedData) + '\n\ndata: [DONE]\n\n'
parser.feed(formattedStr)
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这部分代码实际上是为了使fetchsse也能用于fetch普通的http响应

}
})
let hasStarted = false
for await (const chunk of streamAsyncIterable(resp.body)) {
const str = new TextDecoder().decode(chunk)
if (!str.startsWith('{') && !str.startsWith('"{')) {
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这里是为了检测返回的不是json, 也就是检测是sse, 但这个检测方式确实不好, 已经修改

Comment on lines +16 to +31
if (event.data === '[DONE]') {
onMessage(event.data)
} else {
try {
JSON.parse(event.data)
onMessage(event.data)
} catch (error) {
console.error('json error', error)
onMessage(
event.data
.replace(/^"|"$/g, '')
.replaceAll('\\"', '"')
.replaceAll('\\\\u', '\\u')
.replaceAll('\\\\n', '\\n'),
)
}
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这部分是不需要的, 原来的样子就行, 在fetchSSE具体使用中的回调函数内已经处理了

@josStorer
Copy link
Owner

做了一些调整 90f4880
�出现的问题已经解决, 原因是先前的方式, 对每组chunk解码时, 可能出现一个中文字符分在了两个chunk中, 但先前对每个chunk转为字符串, 然后feed, 导致了parser永远在处理已经被转为乱码的字符串

我对eventsource-parser源码做了轻微修改, 使得feed参数改为了Uint8Array而非string, 以对chunk中单个中文被截断到两个chunk的情况进行处理

关于没有使用其他现成sse fetch库的原因, 上面的code review已做了解释, 主要是为了同时兼容常规fetch请求, 即此处的fakeSseData: 90f4880#diff-97ee404f37a9691da94b62082f3e27eaf3e3e10b05b36b551c4f1db52174175eR31
因为有一些用户希望方便地接入自定义API, 并且有些用户在开发自定义API时, 觉得做成sse有些麻烦

mrichtarsky added a commit to mrichtarsky/chatGPTBox that referenced this pull request Feb 13, 2024
* origin/master:
  Update OpenAI ChatGPT Turbo models (API) (josStorer#620)
  release v2.4.9
  when opening IndependentPanel, if the latest session has been used, automatically create a new session (josStorer#601)
  presearch support (josStorer#592)
  formattedError (josStorer#572)
  safe markdown renderer (josStorer#609, josStorer#403)
  improve the stability of response language (josStorer#611)
  improve bilibili summary
  fix mounting failure caused by DuckDuckGo's initial rendering delay. josStorer#610
  gpt-4 web DALL·E support
  chore
  improve josStorer#603
  improve markdown styles (josStorer#585)
  fix gpt-4 web unusual activity (josStorer#615)
  fix: bilibili reload (josStorer#603)
  refactor(selection-tools): remove redundant `getPreferredLanguage` calls (josStorer#593)
  Fix GPT-4 model name and confusion in names (josStorer#584)
  chore(deps): bump actions/upload-artifact from 3 to 4 (josStorer#594)
  chore(deps): bump actions/setup-python from 4 to 5 (josStorer#586)
  update readme news
  release v2.4.8
  update core content adapters
  fix eventsource meta (josStorer#579, josStorer#567)
  josStorer#573's patch
  release v2.4.7
  fix josStorer#569 and reduce menu items
  add gpt-3.5-turbo-instruct
  fix global side_panel
  patch to josStorer#564
  Update Claude.ai web to Claude v2.1, fix josStorer#570 (josStorer#573)
  Add ChatGLM API (josStorer#567)
  Optimize Logic in `selection-tools` Module (josStorer#564)
  release v2.4.6
  support for chromium side panel (josStorer#111)
  allow filling in the API Key of CustomModel mode (josStorer#561, previously designed for local offline model or custom server, now you can also use it for regular openai API calls and freely fill in the model name(josStorer#563))
  update for chatgpt3.5 web (josStorer#562, josStorer#551#issuecomment-1803668105, josStorer#543#issuecomment-1803666487)
  Added box for gh pr's and issues (josStorer#558)
  Replace legacy gpt-3.5-turbo-0613 with the latest gpt-3.5-turbo-1106
  Add OpenAI API GPT-4 Turbo Preview
  Turkish readme Translation (josStorer#553)
  chore
  firefox patch
  release v2.4.5
  update build scripts
  force scroll to bottom after submission
  docs: phrase translation according language README_IN
  improve render performance (josStorer#265)
  docs: add Japanese README
  Create .gitattributes
  improve chatgpt web user guide
  release v2.4.4
  improve chatgpt web mode compatibility
  improve chatgpt web user guide
  Add site adapters for Golem, EETimes
  release v2.4.3
  fix safari background (josStorer#512 (comment))
  improve fetchSSE (josStorer#532)
  re-order parse process
  fix: parse sse
  Make summarization work for text/plain content
  chore(deps-dev): bump @babel/traverse from 7.21.4 to 7.23.2
  fix josStorer#539 bing web
  blob file read for gitlab (josStorer#544)
  fix chatgpt web mode arkose_token (josStorer#469, josStorer#543, josStorer#545)
  remove BingImageCreator
  disable poe temporarily
  upgrade caniuse-lite
  remove commands permission
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants