error handling

This commit is contained in:
Jing Hua 2023-03-04 08:54:48 +08:00
parent 8a9dac15f7
commit f5c8bec819
4 changed files with 40 additions and 18 deletions

View file

@ -12,7 +12,12 @@ export const parseEventSource = (
.map((line) => line.replace(/^data: /, '')) .map((line) => line.replace(/^data: /, ''))
.join(''); .join('');
if (jsonString === '[DONE]') return jsonString; if (jsonString === '[DONE]') return jsonString;
else return JSON.parse(jsonString); try {
const json = JSON.parse(jsonString);
return json;
} catch {
return '[ERROR]';
}
}); });
return result; return result;
}; };

View file

@ -1,4 +1,4 @@
import React from 'react'; import React, { useState } from 'react';
import ScrollToBottom from 'react-scroll-to-bottom'; import ScrollToBottom from 'react-scroll-to-bottom';
import useStore from '@store/store'; import useStore from '@store/store';
@ -24,6 +24,7 @@ const ChatContent = () => {
state.setMessages, state.setMessages,
] ]
); );
const [error, setError] = useState<string>('');
const handleSubmit = async () => { const handleSubmit = async () => {
const updatedMessages: MessageInterface[] = JSON.parse( const updatedMessages: MessageInterface[] = JSON.parse(
@ -33,26 +34,26 @@ const ChatContent = () => {
setMessages(updatedMessages); setMessages(updatedMessages);
let stream; let stream;
if (apiFree) { try {
stream = await getChatCompletionStreamFree(messages); if (apiFree) {
} else if (apiKey) { stream = await getChatCompletionStreamFree(messages);
stream = await getChatCompletionStreamCustom(apiKey, messages); } else if (apiKey) {
} stream = await getChatCompletionStreamCustom(apiKey, messages);
}
if (stream) { if (stream) {
const reader = stream.getReader(); const reader = stream.getReader();
let reading = true; let reading = true;
while (reading) { while (reading) {
const { done, value } = await reader.read(); const { done, value } = await reader.read();
try {
const result = parseEventSource(new TextDecoder().decode(value)); const result = parseEventSource(new TextDecoder().decode(value));
if (result === '[DONE]' || done) { if (result === '[DONE]' || done) {
reading = false; reading = false;
} else { } else {
const resultString = result.reduce((output: string, curr) => { const resultString = result.reduce((output: string, curr) => {
if (curr === '[DONE]') return output; if (typeof curr === 'string') return output;
else { else {
const content = curr.choices[0].delta.content; const content = curr.choices[0].delta.content;
if (content) output += content; if (content) output += content;
@ -66,10 +67,15 @@ const ChatContent = () => {
updatedMessages[updatedMessages.length - 1].content += resultString; updatedMessages[updatedMessages.length - 1].content += resultString;
setMessages(updatedMessages); setMessages(updatedMessages);
} }
} catch (e: unknown) {
console.log((e as Error).message);
} }
} }
} catch (e: unknown) {
const err = (e as Error).message;
console.log(err);
setError(err);
setTimeout(() => {
setError(''), 10000;
});
} }
}; };
@ -95,6 +101,12 @@ const ChatContent = () => {
))} ))}
<Message role={inputRole} content='' messageIndex={-1} sticky /> <Message role={inputRole} content='' messageIndex={-1} sticky />
{error !== '' && (
<div className='bg-red-600/50 p-2 rounded-sm w-3/5 mt-3 text-gray-900 dark:text-gray-300 text-sm'>
Invalid API key!
</div>
)}
<div className='text-center mt-6 flex justify-center gap-2'> <div className='text-center mt-6 flex justify-center gap-2'>
<button <button
className='btn relative btn-primary mt-2' className='btn relative btn-primary mt-2'

View file

@ -26,7 +26,11 @@ const Message = ({
return ( return (
<div <div
className={`w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group ${backgroundStyle[role]}`} className={`w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group ${backgroundStyle[role]}`}
key={Math.random()} key={
messageIndex !== -1
? `${messageIndex}-${content}`
: 'sticky-message-text-area'
}
> >
<div className='text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0'> <div className='text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0'>
<Avatar role={role} /> <Avatar role={role} />

View file

@ -264,11 +264,12 @@ const EditView = ({
); );
if (sticky) { if (sticky) {
updatedMessages.push({ role: inputRole, content: _content }); updatedMessages.push({ role: inputRole, content: _content });
_setContent('');
} else { } else {
updatedMessages[messageIndex].content = _content; updatedMessages[messageIndex].content = _content;
setIsEdit(false);
} }
setMessages(updatedMessages); setMessages(updatedMessages);
setIsEdit(false);
}} }}
> >
<div className='flex items-center justify-center gap-2'>Save</div> <div className='flex items-center justify-center gap-2'>Save</div>