diff --git a/extensions/void/src/common/sendLLMMessage.ts b/extensions/void/src/common/sendLLMMessage.ts index 00e6eb59..59fa7de8 100644 --- a/extensions/void/src/common/sendLLMMessage.ts +++ b/extensions/void/src/common/sendLLMMessage.ts @@ -151,9 +151,7 @@ const sendOpenAIMsg: SendLLMMessageFnTypeInternal = ({ }) => { const { apikey, model } = apiConfig.openAI; - if (!apikey) { - return handleMissingApiKey('OpenAI', onError); - } + let didAbort = false; let fullText = ''; @@ -167,6 +165,9 @@ const sendOpenAIMsg: SendLLMMessageFnTypeInternal = ({ if (apiConfig.whichApi === 'openAI') { + if (!apikey) { + return handleMissingApiKey('OpenAI', onError); + } openai = new OpenAI({ apiKey: apiConfig.openAI.apikey, dangerouslyAllowBrowser: true }); options = { model: apiConfig.openAI.model, messages: messages, stream: true, } } @@ -185,7 +186,7 @@ const sendOpenAIMsg: SendLLMMessageFnTypeInternal = ({ options = { model: apiConfig.openAICompatible.model, messages: messages, stream: true, } } else { - console.error(`sendOpenAIMsg: invalid whichApi: ${apiConfig.whichApi}`) + onError(`Invalid API: ${apiConfig.whichApi}`) throw new Error(`apiConfig.whichAPI was invalid: ${apiConfig.whichApi}`) } @@ -207,7 +208,7 @@ const sendOpenAIMsg: SendLLMMessageFnTypeInternal = ({ onFinalMessage(fullText); } } catch (error) { - onError(`Error in OpenAI stream: ${error}`); + onError(`Error in stream: ${error}`); console.error('Error in OpenAI stream:', error); if (!didAbort) { onFinalMessage(fullText); @@ -216,9 +217,9 @@ const sendOpenAIMsg: SendLLMMessageFnTypeInternal = ({ }) .catch((responseError) => { if (responseError.status === 401) { - onError('Unauthorized: Invalid OpenAI API key'); + onError('Unauthorized: Invalid API key'); } else if (responseError.status === 400 && responseError.param === 'stream') { - onError(`The OpenAI model '${model}' does not support streamed responses.`); + onError(`The model '${model}' does not support streamed responses.`); } else { onError(responseError.message); } diff --git a/extensions/void/src/sidebar/Sidebar.tsx b/extensions/void/src/sidebar/Sidebar.tsx index e36af692..6b376d48 100644 --- a/extensions/void/src/sidebar/Sidebar.tsx +++ b/extensions/void/src/sidebar/Sidebar.tsx @@ -119,10 +119,9 @@ const Sidebar = () => { // state of chat const [messageStream, setMessageStream] = useState('') const [isLoading, setIsLoading] = useState(false) + const [isThreadSelectorOpen, setIsThreadSelectorOpen] = useState(false) const [requestFailed, setRequestFailed] = useState(false) const [requestFailedReason, setRequestFailedReason] = useState('') - const [isThreadSelectorOpen, setIsThreadSelectorOpen] = useState(false) - const abortFnRef = useRef<(() => void) | null>(null) @@ -201,7 +200,7 @@ const Sidebar = () => { const newHistoryElt: ChatMessage = { role: 'user', content, displayContent: instructions, selection, files } addMessageToHistory(newHistoryElt) - // send message to LLM + // send message to claude let { abort } = sendLLMMessage({ messages: [...(currentThread?.messages ?? []).map(m => ({ role: m.role, content: m.content })), { role: 'user', content }], onText: (newText, fullText) => setMessageStream(fullText), @@ -278,6 +277,12 @@ const Sidebar = () => { )} /> )} } + {/* error message */} + {requestFailed && ( +
+
{`${requestFailedReason}`}
+
+ )}
{ - {/* error message */} - {requestFailed && ( -
-
{`${requestFailedReason}`}
-
- )} - { if (e.key === 'Enter' && !e.shiftKey) onSubmit(e) }} - - onSubmit={(e) => { - console.log('submit!') - e.preventDefault(); - onSubmit(e) - }}> - - {/* input */} -