enh: abililty to stop merge response

This commit is contained in:
Timothy Jaeryang Baek 2025-08-05 22:25:51 +04:00
parent 8b46a9010e
commit d0657054a5
3 changed files with 18 additions and 3 deletions

View file

@ -128,6 +128,9 @@
let showCommands = false; let showCommands = false;
let generating = false;
let generationController = null;
let chat = null; let chat = null;
let tags = []; let tags = [];
@ -1857,6 +1860,12 @@
scrollToBottom(); scrollToBottom();
} }
} }
if (generating) {
generating = false;
generationController?.abort();
generationController = null;
}
}; };
const submitMessage = async (parentId, prompt) => { const submitMessage = async (parentId, prompt) => {
@ -1947,6 +1956,7 @@
history.messages[messageId] = message; history.messages[messageId] = message;
try { try {
generating = true;
const [res, controller] = await generateMoACompletion( const [res, controller] = await generateMoACompletion(
localStorage.token, localStorage.token,
message.model, message.model,
@ -1954,11 +1964,14 @@
responses responses
); );
if (res && res.ok && res.body) { if (res && res.ok && res.body && generating) {
generationController = controller;
const textStream = await createOpenAITextStream(res.body, $settings.splitLargeChunks); const textStream = await createOpenAITextStream(res.body, $settings.splitLargeChunks);
for await (const update of textStream) { for await (const update of textStream) {
const { value, done, sources, error, usage } = update; const { value, done, sources, error, usage } = update;
if (error || done) { if (error || done) {
generating = false;
generationController = null;
break; break;
} }
@ -2190,6 +2203,7 @@
transparentBackground={$settings?.backgroundImageUrl ?? transparentBackground={$settings?.backgroundImageUrl ??
$config?.license_metadata?.background_image_url ?? $config?.license_metadata?.background_image_url ??
false} false}
{generating}
{stopResponse} {stopResponse}
{createMessagePair} {createMessagePair}
onChange={(data) => { onChange={(data) => {

View file

@ -82,6 +82,7 @@
export let stopResponse: Function; export let stopResponse: Function;
export let autoScroll = false; export let autoScroll = false;
export let generating = false;
export let atSelectedModel: Model | undefined = undefined; export let atSelectedModel: Model | undefined = undefined;
export let selectedModels: ['']; export let selectedModels: [''];
@ -1820,7 +1821,7 @@
</Tooltip> </Tooltip>
{/if} {/if}
{#if (taskIds && taskIds.length > 0) || (history.currentId && history.messages[history.currentId]?.done != true)} {#if (taskIds && taskIds.length > 0) || (history.currentId && history.messages[history.currentId]?.done != true) || generating}
<div class=" flex items-center"> <div class=" flex items-center">
<Tooltip content={$i18n.t('Stop')}> <Tooltip content={$i18n.t('Stop')}>
<button <button

View file

@ -16,7 +16,7 @@
<div class={outerClassName}> <div class={outerClassName}>
<label class="sr-only" for="password-input">{placeholder || $i18n.t('Password')}</label> <label class="sr-only" for="password-input">{placeholder || $i18n.t('Password')}</label>
<input <input
class={`${inputClassName} ${show ? '' : 'password'} ${($settings?.highContrastMode ?? false) ? 'placeholder:text-gray-700 dark:placeholder:text-gray-100' : ' outline-hidden placeholder:text-gray-300 dark:placeholder:text-gray-700'}`} class={`${inputClassName} ${show ? '' : 'password'} ${($settings?.highContrastMode ?? false) ? 'placeholder:text-gray-700 dark:placeholder:text-gray-100' : ' outline-hidden placeholder:text-gray-300 dark:placeholder:text-gray-600'}`}
{placeholder} {placeholder}
id="password-input" id="password-input"
bind:value bind:value