mirror of
				https://github.com/SillyTavern/SillyTavern.git
				synced 2025-06-05 21:59:27 +02:00 
			
		
		
		
	Stop button fix for window.ai. Refactor the generation function
This commit is contained in:
		| @@ -526,6 +526,90 @@ function checkQuotaError(data) { | ||||
|     } | ||||
| } | ||||
|  | ||||
| async function sendWindowAIRequest(openai_msgs_tosend, signal, stream) { | ||||
|     if (!('ai' in window)) { | ||||
|         return showWindowExtensionError(); | ||||
|     } | ||||
|  | ||||
|     let content = ''; | ||||
|     let lastContent = ''; | ||||
|     let finished = false; | ||||
|  | ||||
|     async function* windowStreamingFunction() { | ||||
|         while (true) { | ||||
|             if (signal.aborted) { | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|             // unhang UI thread | ||||
|             await delay(1); | ||||
|  | ||||
|             if (lastContent !== content) { | ||||
|                 yield content; | ||||
|             } | ||||
|  | ||||
|             lastContent = content; | ||||
|  | ||||
|             if (finished) { | ||||
|                 return; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     const onStreamResult = (res, err) => { | ||||
|         if (err) { | ||||
|             handleWindowError(err); | ||||
|         } | ||||
|  | ||||
|         const thisContent = res?.message?.content; | ||||
|  | ||||
|         if (res?.isPartial) { | ||||
|             content += thisContent; | ||||
|         } | ||||
|         else { | ||||
|             content = thisContent; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     const generatePromise = window.ai.generateText( | ||||
|         { | ||||
|             messages: openai_msgs_tosend, | ||||
|         }, | ||||
|         { | ||||
|             temperature: parseFloat(oai_settings.temp_openai), | ||||
|             maxTokens: oai_settings.openai_max_tokens, | ||||
|             onStreamResult: onStreamResult, | ||||
|         } | ||||
|     ); | ||||
|  | ||||
|     const handleGeneratePromise = (resolve, reject) => { | ||||
|         generatePromise | ||||
|             .then((res) => { | ||||
|                 content = res[0]?.message?.content; | ||||
|                 finished = true; | ||||
|                 resolve && resolve(content); | ||||
|             }) | ||||
|             .catch((err) => { | ||||
|                 handleWindowError(err); | ||||
|                 finished = true; | ||||
|                 reject && reject(err); | ||||
|             }); | ||||
|     }; | ||||
|  | ||||
|     if (stream) { | ||||
|         handleGeneratePromise(); | ||||
|         return windowStreamingFunction; | ||||
|     } else { | ||||
|         return new Promise((resolve, reject) => { | ||||
|             signal.addEventListener('abort', (reason) => { | ||||
|                 reject(reason); | ||||
|             }); | ||||
|  | ||||
|             handleGeneratePromise(resolve, reject); | ||||
|         }); | ||||
|     } | ||||
| } | ||||
|  | ||||
| async function sendOpenAIRequest(type, openai_msgs_tosend, signal) { | ||||
|     // Provide default abort signal | ||||
|     if (!signal) { | ||||
| @@ -539,6 +623,12 @@ async function sendOpenAIRequest(type, openai_msgs_tosend, signal) { | ||||
|     let logit_bias = {}; | ||||
|     const stream = type !== 'quiet' && oai_settings.stream_openai; | ||||
|  | ||||
|     // If we're using the window.ai extension, use that instead | ||||
|     // Doesn't support logit bias yet | ||||
|     if (oai_settings.use_window_ai) { | ||||
|         return sendWindowAIRequest(openai_msgs_tosend, signal, stream); | ||||
|     } | ||||
|  | ||||
|     if (oai_settings.bias_preset_selected | ||||
|         && Array.isArray(oai_settings.bias_presets[oai_settings.bias_preset_selected]) | ||||
|         && oai_settings.bias_presets[oai_settings.bias_preset_selected].length) { | ||||
| @@ -559,77 +649,6 @@ async function sendOpenAIRequest(type, openai_msgs_tosend, signal) { | ||||
|         "logit_bias": logit_bias, | ||||
|     }; | ||||
|  | ||||
|     if (oai_settings.use_window_ai) { | ||||
|         if (!('ai' in window)) { | ||||
|             return showWindowExtensionError(); | ||||
|         } | ||||
|  | ||||
|         let content = ''; | ||||
|         let lastContent = ''; | ||||
|         let finished = false; | ||||
|  | ||||
|         async function* windowStreamingFunction() { | ||||
|             while (true) { | ||||
|                 if (signal.aborted) { | ||||
|                     return; | ||||
|                 } | ||||
|  | ||||
|                 // unhang UI thread | ||||
|                 await delay(1); | ||||
|  | ||||
|                 if (lastContent !== content) { | ||||
|                     yield content; | ||||
|                 } | ||||
|  | ||||
|                 lastContent = content; | ||||
|  | ||||
|                 if (finished) { | ||||
|                     return; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         const generatePromise = window.ai.generateText( | ||||
|             { | ||||
|                 messages: openai_msgs_tosend, | ||||
|             }, | ||||
|             { | ||||
|                 temperature: parseFloat(oai_settings.temp_openai), | ||||
|                 maxTokens: oai_settings.openai_max_tokens, | ||||
|                 onStreamResult: (res, err) => { | ||||
|                     if (err) { | ||||
|                         handleWindowError(err); | ||||
|                     } | ||||
|  | ||||
|                     const thisContent = res?.message?.content; | ||||
|  | ||||
|                     if (res?.isPartial) { | ||||
|                         content += thisContent; | ||||
|                     } | ||||
|                     else { | ||||
|                         content = thisContent; | ||||
|                     } | ||||
|                 }, | ||||
|             } | ||||
|         ); | ||||
|  | ||||
|         try { | ||||
|             if (stream) { | ||||
|                 generatePromise.then((res) => { | ||||
|                     content = res[0]?.message?.content; | ||||
|                     finished = true; | ||||
|                 }).catch(handleWindowError); | ||||
|                 return windowStreamingFunction; | ||||
|             } else { | ||||
|                 const result = await generatePromise; | ||||
|                 content = result[0]?.message?.content; | ||||
|                 return content; | ||||
|             } | ||||
|         } catch (err) { | ||||
|             handleWindowError(err); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     const generate_url = '/generate_openai'; | ||||
|     const response = await fetch(generate_url, { | ||||
|         method: 'POST', | ||||
| @@ -1486,7 +1505,7 @@ $(document).ready(function () { | ||||
|         saveSettingsDebounced(); | ||||
|     }); | ||||
|  | ||||
|     $("#wi_format_textarea").on('input', function (){ | ||||
|     $("#wi_format_textarea").on('input', function () { | ||||
|         oai_settings.wi_format = $('#wi_format_textarea').val(); | ||||
|         saveSettingsDebounced(); | ||||
|     }); | ||||
| @@ -1555,7 +1574,7 @@ $(document).ready(function () { | ||||
|         saveSettingsDebounced(); | ||||
|     }); | ||||
|  | ||||
|     $("#wi_format_restore").on('click', function() { | ||||
|     $("#wi_format_restore").on('click', function () { | ||||
|         oai_settings.wi_format = default_wi_format; | ||||
|         $('#wi_format_textarea').val(oai_settings.wi_format); | ||||
|         saveSettingsDebounced(); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user