mirror of
https://github.com/voideditor/void
synced 2026-05-24 09:58:23 +00:00
fixed merge conflicts
This commit is contained in:
parent
b3fd408cf7
commit
6c2ca794f5
2 changed files with 16 additions and 54 deletions
|
|
@ -151,9 +151,7 @@ const sendOpenAIMsg: SendLLMMessageFnTypeInternal = ({
|
||||||
}) => {
|
}) => {
|
||||||
const { apikey, model } = apiConfig.openAI;
|
const { apikey, model } = apiConfig.openAI;
|
||||||
|
|
||||||
if (!apikey) {
|
|
||||||
return handleMissingApiKey('OpenAI', onError);
|
|
||||||
}
|
|
||||||
|
|
||||||
let didAbort = false;
|
let didAbort = false;
|
||||||
let fullText = '';
|
let fullText = '';
|
||||||
|
|
@ -167,6 +165,9 @@ const sendOpenAIMsg: SendLLMMessageFnTypeInternal = ({
|
||||||
|
|
||||||
|
|
||||||
if (apiConfig.whichApi === 'openAI') {
|
if (apiConfig.whichApi === 'openAI') {
|
||||||
|
if (!apikey) {
|
||||||
|
return handleMissingApiKey('OpenAI', onError);
|
||||||
|
}
|
||||||
openai = new OpenAI({ apiKey: apiConfig.openAI.apikey, dangerouslyAllowBrowser: true });
|
openai = new OpenAI({ apiKey: apiConfig.openAI.apikey, dangerouslyAllowBrowser: true });
|
||||||
options = { model: apiConfig.openAI.model, messages: messages, stream: 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, }
|
options = { model: apiConfig.openAICompatible.model, messages: messages, stream: true, }
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
console.error(`sendOpenAIMsg: invalid whichApi: ${apiConfig.whichApi}`)
|
onError(`Invalid API: ${apiConfig.whichApi}`)
|
||||||
throw new Error(`apiConfig.whichAPI was invalid: ${apiConfig.whichApi}`)
|
throw new Error(`apiConfig.whichAPI was invalid: ${apiConfig.whichApi}`)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -207,7 +208,7 @@ const sendOpenAIMsg: SendLLMMessageFnTypeInternal = ({
|
||||||
onFinalMessage(fullText);
|
onFinalMessage(fullText);
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
onError(`Error in OpenAI stream: ${error}`);
|
onError(`Error in stream: ${error}`);
|
||||||
console.error('Error in OpenAI stream:', error);
|
console.error('Error in OpenAI stream:', error);
|
||||||
if (!didAbort) {
|
if (!didAbort) {
|
||||||
onFinalMessage(fullText);
|
onFinalMessage(fullText);
|
||||||
|
|
@ -216,9 +217,9 @@ const sendOpenAIMsg: SendLLMMessageFnTypeInternal = ({
|
||||||
})
|
})
|
||||||
.catch((responseError) => {
|
.catch((responseError) => {
|
||||||
if (responseError.status === 401) {
|
if (responseError.status === 401) {
|
||||||
onError('Unauthorized: Invalid OpenAI API key');
|
onError('Unauthorized: Invalid API key');
|
||||||
} else if (responseError.status === 400 && responseError.param === 'stream') {
|
} 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 {
|
} else {
|
||||||
onError(responseError.message);
|
onError(responseError.message);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -119,10 +119,9 @@ const Sidebar = () => {
|
||||||
// state of chat
|
// state of chat
|
||||||
const [messageStream, setMessageStream] = useState('')
|
const [messageStream, setMessageStream] = useState('')
|
||||||
const [isLoading, setIsLoading] = useState(false)
|
const [isLoading, setIsLoading] = useState(false)
|
||||||
|
const [isThreadSelectorOpen, setIsThreadSelectorOpen] = useState(false)
|
||||||
const [requestFailed, setRequestFailed] = useState(false)
|
const [requestFailed, setRequestFailed] = useState(false)
|
||||||
const [requestFailedReason, setRequestFailedReason] = useState('')
|
const [requestFailedReason, setRequestFailedReason] = useState('')
|
||||||
const [isThreadSelectorOpen, setIsThreadSelectorOpen] = useState(false)
|
|
||||||
|
|
||||||
|
|
||||||
const abortFnRef = useRef<(() => void) | null>(null)
|
const abortFnRef = useRef<(() => void) | null>(null)
|
||||||
|
|
||||||
|
|
@ -201,7 +200,7 @@ const Sidebar = () => {
|
||||||
const newHistoryElt: ChatMessage = { role: 'user', content, displayContent: instructions, selection, files }
|
const newHistoryElt: ChatMessage = { role: 'user', content, displayContent: instructions, selection, files }
|
||||||
addMessageToHistory(newHistoryElt)
|
addMessageToHistory(newHistoryElt)
|
||||||
|
|
||||||
// send message to LLM
|
// send message to claude
|
||||||
let { abort } = sendLLMMessage({
|
let { abort } = sendLLMMessage({
|
||||||
messages: [...(currentThread?.messages ?? []).map(m => ({ role: m.role, content: m.content })), { role: 'user', content }],
|
messages: [...(currentThread?.messages ?? []).map(m => ({ role: m.role, content: m.content })), { role: 'user', content }],
|
||||||
onText: (newText, fullText) => setMessageStream(fullText),
|
onText: (newText, fullText) => setMessageStream(fullText),
|
||||||
|
|
@ -278,6 +277,12 @@ const Sidebar = () => {
|
||||||
)} />
|
)} />
|
||||||
)}
|
)}
|
||||||
</div>}
|
</div>}
|
||||||
|
{/* error message */}
|
||||||
|
{requestFailed && (
|
||||||
|
<div className="bg-gray-800 text-red-500 text-center p-4 mb-4 rounded-md shadow-md">
|
||||||
|
<div className="text-lg">{`${requestFailedReason}`}</div>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
<form
|
<form
|
||||||
ref={formRef}
|
ref={formRef}
|
||||||
className="flex flex-row items-center rounded-md p-2"
|
className="flex flex-row items-center rounded-md p-2"
|
||||||
|
|
@ -319,50 +324,6 @@ const Sidebar = () => {
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{/* error message */}
|
|
||||||
{requestFailed && (
|
|
||||||
<div className="bg-gray-800 text-red-500 text-center p-4 mb-4 rounded-md shadow-md">
|
|
||||||
<div className="text-lg">{`${requestFailedReason}`}</div>
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
<form
|
|
||||||
ref={formRef}
|
|
||||||
className="flex flex-row items-center rounded-md p-2 input"
|
|
||||||
onKeyDown={(e) => { if (e.key === 'Enter' && !e.shiftKey) onSubmit(e) }}
|
|
||||||
|
|
||||||
onSubmit={(e) => {
|
|
||||||
console.log('submit!')
|
|
||||||
e.preventDefault();
|
|
||||||
onSubmit(e)
|
|
||||||
}}>
|
|
||||||
|
|
||||||
{/* input */}
|
|
||||||
<textarea
|
|
||||||
onChange={(e) => { setInstructions(e.target.value) }}
|
|
||||||
className="w-full p-2 leading-tight resize-none max-h-[50vh] overflow-hidden bg-transparent border-none !outline-none"
|
|
||||||
placeholder="Ctrl+L to select"
|
|
||||||
rows={1}
|
|
||||||
onInput={e => { e.currentTarget.style.height = 'auto'; e.currentTarget.style.height = e.currentTarget.scrollHeight + 'px' }} // Adjust height dynamically
|
|
||||||
/>
|
|
||||||
{/* submit button */}
|
|
||||||
{isLoading ?
|
|
||||||
<button
|
|
||||||
onClick={onStop}
|
|
||||||
className="btn btn-primary rounded-r-lg max-h-10 p-2"
|
|
||||||
type='button'
|
|
||||||
>Stop</button>
|
|
||||||
: <button
|
|
||||||
className="btn btn-primary font-bold size-8 flex justify-center items-center rounded-full p-2 max-h-10"
|
|
||||||
disabled={!instructions}
|
|
||||||
type='submit'
|
|
||||||
>
|
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
|
|
||||||
<line x1="12" y1="19" x2="12" y2="5"></line>
|
|
||||||
<polyline points="5 12 12 5 19 12"></polyline>
|
|
||||||
</svg>
|
|
||||||
</button>
|
|
||||||
}
|
|
||||||
</form>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue