Skip to content

Commit

Permalink
Merge pull request #13 from OVINC-CN/feat_re_generate
Browse files Browse the repository at this point in the history
feat: re-generate last completion
  • Loading branch information
OrenZhang authored Oct 8, 2023
2 parents c465a2e + 1f0710b commit 3491634
Show file tree
Hide file tree
Showing 4 changed files with 76 additions and 4 deletions.
15 changes: 14 additions & 1 deletion src/components/ChatInput.vue
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ const props = defineProps({
});
// emits
const emits = defineEmits(['addMessage', 'setChatLoading', 'saveMessage', 'clearMessages', 'toggleUserBehavior']);
const emits = defineEmits(['addMessage', 'setChatLoading', 'saveMessage', 'clearMessages', 'toggleUserBehavior', 'replaceMessages', 'setPromptForm']);
// i18n
const i18n = useI18n();
Expand Down Expand Up @@ -129,6 +129,16 @@ const doChat = async () => {
.finally(() => emits('setChatLoading', false));
};
const reGenerate = () => {
if (!props.localMessages.length) {
return;
}
emits('setChatLoading', true);
emits('replaceMessages', props.localMessages.slice(0, props.localMessages.length - 2));
promptForm.value.content = props.localMessages[props.localMessages.length -2].content;
doChat();
};
// auto submit
const lastMeta = ref(false);
const allowSubmitKeys = ref(['Shift', 'Alt', 'Control', 'Meta']);
Expand All @@ -144,6 +154,8 @@ const onKeydown = (event) => {
};
const showEditBox = ref(true);
defineExpose({reGenerate, promptForm});
</script>

<template>
Expand All @@ -166,6 +178,7 @@ const showEditBox = ref(true);
:auto-size="{minRows: 6, maxRows: 6}"
:disabled="chatLoading"
@keydown="onKeydown"
@input="emits('toggleUserBehavior', false); emits('setPromptForm', promptForm)"
@focus="emits('toggleUserBehavior', false)"
/>
</a-form-item>
Expand Down
23 changes: 23 additions & 0 deletions src/components/MessageContent.vue
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,16 @@ const props = defineProps({
content: '',
}),
},
isLast: {
type: Boolean,
default: false,
},
});
const store = useStore();
const user = computed(() => store.state.user);
const emits = defineEmits(['reGenerate']);
</script>

<template>
Expand Down Expand Up @@ -54,6 +60,11 @@ const user = computed(() => store.state.user);
>
{{ user.nick_name }}
</a-avatar>
<icon-refresh
@click="emits('reGenerate')"
v-if="isLast && message.role === Role.Assistant"
class="message-content-content-icon-refresh"
/>
</div>
</template>

Expand Down Expand Up @@ -84,4 +95,16 @@ const user = computed(() => store.state.user);
background: var(--color-fill-3);
margin: 20px 0;
}
.message-content-content-icon-refresh {
min-width: 18px;
min-height: 18px;
margin: 6px 0 0 6px;
cursor: pointer;
color: var(--color-neutral-4);
}
.message-content-content-icon-refresh:hover {
color: var(--color-neutral-10);
}
</style>
26 changes: 23 additions & 3 deletions src/components/MessageDisplay.vue
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
<script setup>
import MessageContent from './MessageContent.vue';
import {onMounted, onUnmounted, watch} from 'vue';
import {Role} from '../constants';
// props
const props = defineProps({
Expand All @@ -12,20 +13,33 @@ const props = defineProps({
type: Boolean,
default: false,
},
promptForm: {
type: Object,
default: () => ({
content: '',
}),
},
});
// emits
const emits = defineEmits(['toggleUserBehavior']);
const emits = defineEmits(['toggleUserBehavior', 'reGenerate']);
// scroll
watch(() => props.localMessages, () => {
const doScroll = () => {
if (props.userBehavior) {
return;
}
const el = document.getElementById('chat-display');
if (el) {
el.scrollTop = el.scrollHeight;
}
};
watch(() => props.localMessages, () => {
doScroll();
}
, {deep: true, immediate: true});
watch(() => props.promptForm.content, () => {
doScroll();
}, {deep: true, immediate: true});
onMounted(() => {
const el = document.getElementById('chat-display');
Expand Down Expand Up @@ -53,9 +67,15 @@ onUnmounted(() => {
v-show="localMessages.length > 0"
>
<message-content
v-for="message in localMessages"
v-for="(message, index) in localMessages"
:key="message"
:message="message"
:is-last="index === localMessages.length - 1"
@re-generate="emits('reGenerate')"
/>
<message-content
v-show="promptForm.content"
:message="{role: Role.User, content: promptForm.content}"
/>
</a-space>
<div
Expand Down
16 changes: 16 additions & 0 deletions src/views/Chat.vue
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@ const localMessageKey = ref('local-message');
const addMessage = (message) => {
localMessages.value.push(message);
};
const replaceMessages = (messages) => {
localMessages.value = messages;
};
const saveMessage = () => localStorage.setItem(localMessageKey.value, JSON.stringify(localMessages.value));
const clearMessages = () => {
localMessages.value = [];
Expand All @@ -29,6 +32,14 @@ const setChatLoading = (status) => handleLoading(chatLoading, status);
// scroll
const userBehavior = ref(false);
const toggleUserBehavior = (status) => userBehavior.value = status;
// reGenerate
const chatInputRef = ref();
const reGenerate = () => {
chatInputRef.value.reGenerate();
};
const promptForm = ref({});
const setPromptForm = (data) => promptForm.value = data;
</script>

<template>
Expand All @@ -37,17 +48,22 @@ const toggleUserBehavior = (status) => userBehavior.value = status;
<message-display
:local-messages="localMessages"
:user-behavior="userBehavior"
:prompt-form="promptForm"
@toggle-user-behavior="toggleUserBehavior"
@re-generate="reGenerate"
/>
<a-divider />
<chat-input
ref="chatInputRef"
:local-messages="localMessages"
:chat-loading="chatLoading"
@add-message="addMessage"
@set-chat-loading="setChatLoading"
@save-message="saveMessage"
@clear-messages="clearMessages"
@toggle-user-behavior="toggleUserBehavior"
@replace-messages="replaceMessages"
@set-prompt-form="setPromptForm"
/>
</div>
</div>
Expand Down

0 comments on commit 3491634

Please sign in to comment.