enh: add to conversation

This commit is contained in:
Timothy Jaeryang Baek 2024-12-20 15:09:17 -08:00
parent ad5cc9d79e
commit 47318daef0
7 changed files with 103 additions and 5 deletions

View File

@ -985,6 +985,70 @@
} }
}; };
const addMessages = async ({ modelId, messages }) => {
const model = $models.filter((m) => m.id === modelId).at(0);
const messageList = createMessagesList(history.currentId);
let parentMessage = messageList.length !== 0 ? messageList.at(-1) : null;
let parentId = parentMessage ? parentMessage.id : null;
for (const message of messages) {
let messageId = uuidv4();
if (message.role === 'user') {
const userMessage = {
id: messageId,
parentId: parentId,
childrenIds: [],
timestamp: Math.floor(Date.now() / 1000),
...message
};
if (parentMessage) {
parentMessage.childrenIds.push(messageId);
history.messages[parentMessage.id] = parentMessage;
}
history.messages[messageId] = userMessage;
parentMessage = userMessage;
parentId = messageId;
} else {
const responseMessage = {
id: messageId,
parentId: parentId,
childrenIds: [],
done: true,
model: model.id,
modelName: model.name ?? model.id,
modelIdx: 0,
timestamp: Math.floor(Date.now() / 1000),
...message
};
if (parentMessage) {
parentMessage.childrenIds.push(messageId);
history.messages[parentMessage.id] = parentMessage;
}
history.messages[messageId] = responseMessage;
parentMessage = responseMessage;
parentId = messageId;
}
}
history.currentId = parentId;
await tick();
if (autoScroll) {
scrollToBottom();
}
if (messages.length === 0) {
await initChatHandler();
} else {
await saveChatHandler($chatId);
}
};
const chatCompletionEventHandler = async (data, message, chatId) => { const chatCompletionEventHandler = async (data, message, chatId) => {
const { id, done, choices, sources, selectedModelId, error, usage } = data; const { id, done, choices, sources, selectedModelId, error, usage } = data;
@ -1937,6 +2001,7 @@
{regenerateResponse} {regenerateResponse}
{mergeResponses} {mergeResponses}
{chatActionHandler} {chatActionHandler}
{addMessages}
bottomPadding={files.length > 0} bottomPadding={files.length > 0}
/> />
</div> </div>

View File

@ -26,6 +26,7 @@
let prompt = ''; let prompt = '';
let responseContent = null; let responseContent = null;
let responseDone = false;
const askHandler = async () => { const askHandler = async () => {
if (!model) { if (!model) {
@ -69,6 +70,7 @@
for (const line of lines) { for (const line of lines) {
if (line.startsWith('data: ')) { if (line.startsWith('data: ')) {
if (line.startsWith('data: [DONE]')) { if (line.startsWith('data: [DONE]')) {
responseDone = true;
continue; continue;
} else { } else {
// Parse the JSON chunk // Parse the JSON chunk
@ -145,6 +147,7 @@
for (const line of lines) { for (const line of lines) {
if (line.startsWith('data: ')) { if (line.startsWith('data: ')) {
if (line.startsWith('data: [DONE]')) { if (line.startsWith('data: [DONE]')) {
responseDone = true;
continue; continue;
} else { } else {
// Parse the JSON chunk // Parse the JSON chunk
@ -181,7 +184,7 @@
}; };
const addHandler = async () => { const addHandler = async () => {
newMessages = [ const messages = [
{ {
role: 'user', role: 'user',
content: prompt content: prompt
@ -192,13 +195,15 @@
} }
]; ];
responseContent = null; onAdd({
modelId: model,
onAdd(); messages: messages
});
}; };
export const closeHandler = () => { export const closeHandler = () => {
responseContent = null; responseContent = null;
responseDone = false;
floatingInput = false; floatingInput = false;
floatingInputValue = ''; floatingInputValue = '';
}; };
@ -306,6 +311,17 @@
{:else} {:else}
<Markdown id={`${id}-float-response`} content={responseContent} /> <Markdown id={`${id}-float-response`} content={responseContent} />
{/if} {/if}
{#if responseDone}
<div class="flex justify-end pt-3 text-sm font-medium">
<button
class="px-3.5 py-1.5 text-sm font-medium bg-black hover:bg-gray-900 text-white dark:bg-white dark:text-black dark:hover:bg-gray-100 transition rounded-full"
on:click={addHandler}
>
{$i18n.t('Add')}
</button>
</div>
{/if}
</div> </div>
</div> </div>
</div> </div>

View File

@ -33,6 +33,7 @@
export let chatActionHandler: Function; export let chatActionHandler: Function;
export let showMessage: Function = () => {}; export let showMessage: Function = () => {};
export let submitMessage: Function = () => {}; export let submitMessage: Function = () => {};
export let addMessages: Function = () => {};
export let readOnly = false; export let readOnly = false;
@ -404,6 +405,7 @@
{regenerateResponse} {regenerateResponse}
{continueResponse} {continueResponse}
{mergeResponses} {mergeResponses}
{addMessages}
{triggerScroll} {triggerScroll}
{readOnly} {readOnly}
/> />

View File

@ -16,7 +16,9 @@
export let save = false; export let save = false;
export let floatingButtons = true; export let floatingButtons = true;
export let onSourceClick = () => {}; export let onSourceClick = () => {};
export let onAddMessages = () => {};
let contentContainerElement; let contentContainerElement;
@ -163,7 +165,9 @@
{id} {id}
model={model?.id} model={model?.id}
messages={createMessagesList(history, id)} messages={createMessagesList(history, id)}
onSave={() => { onAdd={({ modelId, messages }) => {
console.log(modelId, messages);
onAddMessages({ modelId, messages });
closeFloatingButtons(); closeFloatingButtons();
}} }}
/> />

View File

@ -35,6 +35,7 @@
export let continueResponse; export let continueResponse;
export let mergeResponses; export let mergeResponses;
export let addMessages;
export let triggerScroll; export let triggerScroll;
export let readOnly = false; export let readOnly = false;
</script> </script>
@ -79,6 +80,7 @@
{submitMessage} {submitMessage}
{continueResponse} {continueResponse}
{regenerateResponse} {regenerateResponse}
{addMessages}
{readOnly} {readOnly}
/> />
{:else} {:else}
@ -97,6 +99,7 @@
{regenerateResponse} {regenerateResponse}
{mergeResponses} {mergeResponses}
{triggerScroll} {triggerScroll}
{addMessages}
{readOnly} {readOnly}
/> />
{/if} {/if}

View File

@ -36,6 +36,8 @@
export let regenerateResponse: Function; export let regenerateResponse: Function;
export let mergeResponses: Function; export let mergeResponses: Function;
export let addMessages: Function;
export let triggerScroll: Function; export let triggerScroll: Function;
const dispatch = createEventDispatcher(); const dispatch = createEventDispatcher();
@ -233,6 +235,7 @@
groupedMessageIdsIdx[modelIdx] = groupedMessageIdsIdx[modelIdx] =
groupedMessageIds[modelIdx].messageIds.length - 1; groupedMessageIds[modelIdx].messageIds.length - 1;
}} }}
{addMessages}
{readOnly} {readOnly}
/> />
{/if} {/if}

View File

@ -118,6 +118,8 @@
export let continueResponse: Function; export let continueResponse: Function;
export let regenerateResponse: Function; export let regenerateResponse: Function;
export let addMessages: Function;
export let isLastMessage = true; export let isLastMessage = true;
export let readOnly = false; export let readOnly = false;
@ -634,6 +636,9 @@
sourceButton.click(); sourceButton.click();
} }
}} }}
onAddMessages={({ modelId, messages }) => {
addMessages({ modelId, messages });
}}
on:update={(e) => { on:update={(e) => {
const { raw, oldContent, newContent } = e.detail; const { raw, oldContent, newContent } = e.detail;