Skip to content

Commit 49370ca

Browse files
authored
Merge pull request #47 from nowscott/development
fix:避免了流被中止的错误
2 parents 08d02ab + f76fea3 commit 49370ca

File tree

4 files changed

+43
-17
lines changed

4 files changed

+43
-17
lines changed

src/components/ChatAPI.js

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@ import { useEffect } from 'react';
22
import { sendSiliconMessage } from 'service/silicon';
33
import { sendGroqMessage } from 'service/groq';
44

5-
const systemPrompt0 = `
6-
1. 每当用户提供对话记录时,优先使用提供的对话记录进行回答。
7-
2. 如果用户询问“我说过什么”或类似问题,检查提供的对话记录,并根据记录内容进行回答。
8-
3. 不需要提供类似“AI:”的前缀!!!
9-
`;
5+
// 默认的系统提示词,可以注释掉或者删除
6+
let systemPrompt0 = '';
7+
// systemPrompt0 = `
8+
// 1. 每当用户提供对话记录时,优先使用提供的对话记录进行回答。
9+
// 2. 如果用户询问“我说过什么”或类似问题,检查提供的对话记录,并根据记录内容进行回答。
10+
// 3. 不需要提供类似“AI:”的前缀!!!
11+
// `;
1012

1113
const ChatAPI = ({
1214
source,
@@ -20,9 +22,10 @@ const ChatAPI = ({
2022
topP,
2123
topK,
2224
frequencyPenalty,
23-
systemPrompt,
25+
systemPrompt, // 可以为空
2426
}) => {
25-
const fullSystemPrompt = `${systemPrompt0}\n${systemPrompt}`;
27+
// 使用自定义系统提示,如果提供了的话
28+
const fullSystemPrompt = systemPrompt ? `${systemPrompt0}\n${systemPrompt}` : '';
2629

2730
useEffect(() => {
2831
if (!prompt) {
@@ -72,7 +75,7 @@ const ChatAPI = ({
7275
topP,
7376
topK,
7477
frequencyPenalty,
75-
fullSystemPrompt,
78+
fullSystemPrompt, // 作为依赖项
7679
onContentUpdate,
7780
onTokenUpdate,
7881
onCompletion,

src/pages/ChatPage.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// src/pages/ChatPage.js
2-
import React, { useState, useCallback} from 'react';
2+
import React, { useState, useCallback } from 'react';
33
import ChatAPI from 'components/ChatAPI';
44
import NavBar from 'components/layout/NavBar';
55
import MessageList from 'components/layout/MessageList';
@@ -15,6 +15,7 @@ const ChatPage = () => {
1515
const [aiMessageMid, setAiMessageMid] = useState(null);
1616
const [isSettingsOpen, setIsSettingsOpen] = useState(false);
1717
const [isMessageComplete, setIsMessageComplete] = useState(false);
18+
const [shouldSubmit, setShouldSubmit] = useState(false);
1819

1920
const handleContentUpdate = useCallback((newContent) => {
2021
if (!isMessageComplete) {
@@ -41,6 +42,7 @@ const ChatPage = () => {
4142
const fullPrompt = `${chatHistory}\n你: ${prompt}`;
4243
setIsMessageComplete(false);
4344
setSubmittedPrompt(fullPrompt);
45+
setShouldSubmit(true);
4446
};
4547

4648
const handleSettingsClick = () => {
@@ -53,14 +55,15 @@ const ChatPage = () => {
5355

5456
const handleCompletion = useCallback(() => {
5557
setIsMessageComplete(true);
58+
setShouldSubmit(false);
5659
}, []);
5760

5861
return (
5962
<div className="flex flex-col h-svh justify-between overflow-hidden bg-stone-200 dark:bg-stone-800">
6063
<NavBar onSettingsClick={handleSettingsClick} />
6164
<MessageList messages={messages} onDelete={deleteMessage} />
6265
<InputPrompt onSend={handleSend} onClear={clearMessages} />
63-
{submittedPrompt && !isSettingsOpen && (
66+
{submittedPrompt && shouldSubmit && !isSettingsOpen && (
6467
<ChatAPI
6568
source={settings.source}
6669
prompt={submittedPrompt}

src/service/groq.js

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,14 @@ export function sendGroqMessage({
2222
}) {
2323
const controller = new AbortController();
2424

25+
if (!prompt.trim()) {
26+
console.error("提示信息为空,未发送请求");
27+
return () => {};
28+
}
29+
2530
const fetchChatCompletion = async () => {
2631
try {
27-
console.log(model,'API 请求中...');
32+
console.log(model, 'API 请求中...');
2833
const chatCompletion = await groq.chat.completions.create({
2934
messages: [
3035
{ role: 'system', content: systemPrompt },
@@ -42,16 +47,16 @@ export function sendGroqMessage({
4247

4348
for await (const chunk of chatCompletion) {
4449
const content = chunk.choices[0]?.delta?.content || '';
45-
// console.log('content', content);
4650
buffer += content;
4751
onContentUpdate(buffer);
4852
buffer = '';
4953
if (chunk.x_groq && chunk.x_groq.usage) {
5054
onTokenUpdate(chunk.x_groq.usage.total_tokens);
55+
console.log(chunk.x_groq.usage.total_tokens, 'API 请求成功');
5156
}
5257
}
5358
onCompletion();
54-
console.log(model,'API 请求成功');
59+
console.log(model, 'API 请求成功');
5560
} catch (error) {
5661
console.error('API 请求失败:', error);
5762
onCompletion({ error: '请求失败,请稍后重试。' });

src/service/silicon.js

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ export const sendSiliconMessage = ({
1818
}) => {
1919
const controller = new AbortController();
2020
const { signal } = controller;
21+
let shouldStop = false;
2122

2223
const options = {
2324
method: 'POST',
@@ -51,12 +52,16 @@ export const sendSiliconMessage = ({
5152
})
5253
.then(reader => {
5354
const decoder = new TextDecoder('utf-8');
54-
const read = () => {
55-
reader.read().then(({ done, value }) => {
55+
const read = async () => {
56+
if (shouldStop) return;
57+
58+
try {
59+
const { done, value } = await reader.read();
5660
if (done) {
5761
onCompletion && onCompletion();
5862
return;
5963
}
64+
6065
const text = decoder.decode(value, { stream: true });
6166
text.split('\n').forEach(line => {
6267
if (line.trim() && line.trim() !== 'data: [DONE]') {
@@ -70,15 +75,25 @@ export const sendSiliconMessage = ({
7075
onTokenUpdate(jsonResponse.usage.total_tokens);
7176
}
7277
if (jsonResponse.choices[0].finish_reason === "stop") {
78+
shouldStop = true;
7379
return;
7480
}
7581
} catch (error) {
7682
console.error('解析 JSON 时出错:', error, '行:', line);
7783
}
7884
}
7985
});
80-
read();
81-
});
86+
87+
if (!shouldStop) {
88+
read();
89+
}
90+
} catch (err) {
91+
if (err.name === 'AbortError') {
92+
console.log('请求被中止');
93+
} else {
94+
console.error('读取流时出错:', err);
95+
}
96+
}
8297
};
8398
read();
8499
})

0 commit comments

Comments
 (0)