Skip to content

Commit 4aa0f11

Browse files
fix(rephrase|tutor): fixes rephrase on chat and goback tutor (#71)
1 parent 150fa67 commit 4aa0f11

File tree

8 files changed

+90
-116
lines changed

8 files changed

+90
-116
lines changed

src/components/ChatBuble.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ defineProps<{
1717
isUSer: boolean;
1818
isLast: boolean;
1919
shouldDisable: boolean;
20-
rephrase?: (msg: string) => void;
20+
rephrase?: () => void;
2121
}>();
2222
2323
const copyMessage = (msg: string) => {
@@ -55,7 +55,7 @@ const copyMessage = (msg: string) => {
5555
:aria-label="$t('rephrase')"
5656
isDiscreet
5757
v-if="!isUSer && isLast && !shouldDisable"
58-
@click="rephrase && rephrase(message)"
58+
@click="rephrase && rephrase()"
5959
>
6060
<ReloadIcon class="icon-action" />
6161
<TooltipComponent class="tltip" :tooltipText="$t('rephrase')" isRight />

src/components/ChatComponent.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ const computedStatus = computed(() => store.chatStatus);
3535
v-for="({ content, role }, index) in store.chatMessagesList"
3636
:message="content"
3737
:isUSer="role === 'user'"
38-
:rephrase="store.fetchRephraseStream"
38+
:rephrase="store.fetchRephrase"
3939
:isLast="index === store.chatMessagesList.length - 1"
4040
:shouldDisable="computedStatus !== CHAT_STATUS.DONE"
4141
/>

src/components/tutor/ThirdStep.vue

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ const props = defineProps<{
1010
actionText?: string;
1111
disabled: boolean;
1212
updateSyllabus: () => void;
13+
restart: () => void;
1314
}>();
1415
1516
const isEditable: Ref<boolean> = ref(false);
@@ -60,6 +61,9 @@ const handleTextEdit = (event, index) => {
6061
<textarea class="textarea" v-if="enableFeedback" v-model="feedback"></textarea>
6162

6263
<div class="is-flex is-justify-content-end mt-4 pb-6">
64+
<button class="button mr-auto" @click="restart">
65+
{{ $t('tutor.restartSyllabusCreation') }}
66+
</button>
6367
<button class="button" @click="toggleFeedback">
6468
{{
6569
enableFeedback ? $t('tutor.thirdStep.sendFeedback') : $t('tutor.thirdStep.giveFeedback')

src/localisation/en.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,7 @@ export const en = {
319319
},
320320
textLengthFeedback: 'Please add more text to improve search results.',
321321
tutor: {
322+
restartSyllabusCreation: 'Start a new syllabus creation',
322323
syllabusSteps: 'Syllabus steps:',
323324
BIG_FILE: 'File size exceeds 5 MB.',
324325
BAD_EXTENSION: 'File type not supported. Only PDF, TXT, and DOCX files are allowed.',
@@ -330,6 +331,10 @@ export const en = {
330331
},
331332
loading: {
332333
wait: 'Please wait',
334+
extract: {
335+
title: 'Document content extraction',
336+
description: 'WeLearn extracts the content from your documents to generate a summary.'
337+
},
333338
search: {
334339
title: 'Finding related resources',
335340
description:
@@ -339,6 +344,10 @@ export const en = {
339344
title: 'Generating syllabus',
340345
description:
341346
'WeLearn is generating your syllabus from the documents provided. This step may take a few minutes.'
347+
},
348+
default: {
349+
title: 'Loading',
350+
description: 'WeLearn is getting ready for the next step.'
342351
}
343352
},
344353
summaries: {

src/localisation/fr.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,7 @@ export const fr = {
323323
},
324324
textLengthFeedback: 'Veuillez ajouter davantage de texte pour lancer la recherche.',
325325
tutor: {
326+
restartSyllabusCreation: 'Commencer un nouveau syllabus',
326327
syllabusSteps: 'Étapes du syllabus :',
327328
BIG_FILE: 'La taille du fichier dépasse 5 Mo.',
328329
BAD_EXTENSION:
@@ -336,6 +337,10 @@ export const fr = {
336337
},
337338
loading: {
338339
wait: 'Veuillez patienter',
340+
extract: {
341+
title: 'Extraction du contenu du document',
342+
description: 'WeLearn extrait le contenu de vos documents pour générer un résumé.'
343+
},
339344
search: {
340345
title: 'Recherche de ressources associées',
341346
description:
@@ -345,6 +350,10 @@ export const fr = {
345350
title: 'Génération du syllabus',
346351
description:
347352
'WeLearn génère votre syllabus à partir des documents fournis. Cette étape peut prendre quelques minutes.'
353+
},
354+
default: {
355+
title: 'Chargement',
356+
description: 'WeLearn se prépare pour la prochaine étape.'
348357
}
349358
},
350359
summaries: {

src/stores/chat.ts

Lines changed: 19 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { defineStore } from 'pinia';
22
import { computed, ref, type ComputedRef, type Ref } from 'vue';
33
import type { Document, ErrorDetails, ChatMessage, ReformulateResponse } from '@/types';
4-
import { fetchStream, postAxios } from '@/utils/fetch';
4+
import { postAxios } from '@/utils/fetch';
55
import { getQueryParamValue } from '@/utils/urlsUtils';
66
import { RELEVANCE_FACTOR } from '@/utils/constants';
77
import { getFromStorage, saveToStorage, clearFromStorage } from '@/utils/storage';
@@ -209,6 +209,7 @@ export const useChatStore = defineStore('chat', () => {
209209
}
210210

211211
async function getNoStreamAnswer(userMsg: string) {
212+
chatStatus.value = CHAT_STATUS.FORMULATING_ANSWER;
212213
const bodyContent = {
213214
sources: sourcesList.value || [],
214215
history: getMessageHistory.value,
@@ -218,7 +219,6 @@ export const useChatStore = defineStore('chat', () => {
218219

219220
const respBody = await postAxios('/qna/chat/answer', bodyContent);
220221

221-
console.log(respBody);
222222
chatStatus.value = CHAT_STATUS.FORMULATED_ANSWER;
223223

224224
chatMessagesList.value.push({ role: 'assistant', content: respBody.data });
@@ -236,106 +236,27 @@ export const useChatStore = defineStore('chat', () => {
236236
setQuestionQueues(newQuestions?.data['NEW_QUESTIONS']);
237237
}
238238

239-
// async function fetchChatAnswer(userMsg: string) {
240-
// if (chatStatus.value !== CHAT_STATUS.SEARCHED) return;
241-
242-
// try {
243-
// const bodyContent = JSON.stringify({
244-
// sources: sourcesList.value || [],
245-
// history: getMessageHistory.value,
246-
// query: userMsg,
247-
// ...(storedSubject.value && { subject: storedSubject.value })
248-
// });
249-
250-
// const respBody = await fetchStream('/qna/stream', {
251-
// bodyContent
252-
// });
253-
254-
// if (!respBody) {
255-
// return;
256-
// }
257-
258-
// const reader = respBody.pipeThrough(new TextDecoderStream()).getReader();
259-
260-
// chatMessagesList.value.push({ role: 'assistant', content: '' });
261-
// const assistantsAns = chatMessagesList.value.length - 1;
262-
263-
// // eslint-disable-next-line no-constant-condition
264-
// while (true) {
265-
// chatStatus.value = CHAT_STATUS.FORMULATING_ANSWER;
266-
// const { value, done } = await reader.read();
267-
268-
// if (done) {
269-
// const newQuestions: AxiosResponse<{ NEW_QUESTIONS: string[] }> = await postAxios(
270-
// '/qna/reformulate/questions',
271-
// {
272-
// history: getMessageHistory.value,
273-
// query: reformulatedQuery.value
274-
// }
275-
// );
276-
// chatStatus.value = CHAT_STATUS.FORMULATED_ANSWER;
277-
278-
// setQuestionQueues(newQuestions?.data['NEW_QUESTIONS']);
279-
280-
// saveToStorage('chat', chatMessagesList.value);
281-
// break;
282-
// }
283-
// chatMessagesList.value[assistantsAns].content += value;
284-
// }
285-
// } catch (error) {
286-
// console.error(error);
287-
// chatStatus.value = CHAT_STATUS.ERROR;
288-
// }
289-
// }
290-
291-
async function fetchRephraseStream(message: string) {
292-
if (!chatStatus.value === CHAT_STATUS.DONE) return;
239+
async function fetchRephrase() {
293240
chatStatus.value = CHAT_STATUS.FORMULATING_ANSWER;
294-
try {
295-
const lastAssistantsMessage =
296-
message || chatMessagesList.value[chatMessagesList.value.length - 1].content;
297-
298-
const bodyContent = JSON.stringify({
299-
sources: sourcesList.value,
300-
history: getMessageHistory.value,
301-
query: lastAssistantsMessage,
302-
...(storedSubject.value && { subject: storedSubject.value })
303-
});
304-
305-
let respBody;
306-
try {
307-
respBody = await fetchStream('/qna/chat/rephrase_stream', { bodyContent });
308-
} catch (error) {
309-
console.error(error);
310-
}
311-
312-
if (!respBody) {
313-
return;
314-
}
315-
316-
const reader = respBody.pipeThrough(new TextDecoderStream()).getReader();
241+
// get the content of the message which the role is assistant
242+
const lastAssistantMessage = [...chatMessagesList.value]
243+
.reverse()
244+
.find((msg) => msg.role === 'assistant')?.content;
317245

318-
chatMessagesList.value.push({ role: 'assistant', content: '' });
319-
const assistantsAns = chatMessagesList.value.length - 1;
246+
const bodyContent = {
247+
sources: sourcesList.value,
248+
history: getMessageHistory.value,
249+
query: lastAssistantMessage,
250+
...(storedSubject.value && { subject: storedSubject.value })
251+
};
320252

321-
// eslint-disable-next-line no-constant-condition
322-
while (true) {
323-
const { value, done } = await reader.read();
253+
const respBody = await postAxios('/qna/chat/rephrase', bodyContent);
324254

325-
if (done) {
326-
chatStatus.value = CHAT_STATUS.FORMULATED_ANSWER;
327-
isAnswerStreamed.value = true;
255+
chatMessagesList.value.push({ role: 'assistant', content: respBody.data });
256+
saveToStorage('chat', chatMessagesList.value);
328257

329-
break;
330-
}
331-
chatMessagesList.value[assistantsAns].content += value;
332-
}
333-
} catch (error) {
334-
chatStatus.value = CHAT_STATUS.ERROR;
335-
} finally {
336-
chatStatus.value = CHAT_STATUS.FORMULATED_ANSWER;
337-
chatStatus.value = CHAT_STATUS.DONE;
338-
}
258+
chatStatus.value = CHAT_STATUS.FORMULATED_ANSWER;
259+
chatStatus.value = CHAT_STATUS.DONE;
339260
}
340261

341262
const noResultsAnswer = () => {
@@ -417,7 +338,7 @@ export const useChatStore = defineStore('chat', () => {
417338
corpora,
418339
reformulatedQuery,
419340
onSendMessage,
420-
fetchRephraseStream,
341+
fetchRephrase,
421342
clearInput,
422343
setReformulatedQuery,
423344
shouldDisplayScore,

src/stores/tutor.ts

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ export const useTutorStore = defineStore('tutor', () => {
2020
const description: Ref<string> = ref('');
2121
const courseTitle: Ref<string> = ref('');
2222
const selectedSources: Ref<Document[]> = ref([]);
23+
const extracts: Ref<string[]> = ref([]);
2324

2425
const goBack = () => (step.value = step.value - 1);
2526
const goNext = () => (step.value = step.value + 1);
@@ -119,6 +120,7 @@ export const useTutorStore = defineStore('tutor', () => {
119120
shouldRetryAction.value = true;
120121
throw new Error('retry getFilesContent');
121122
} else {
123+
extracts.value = resp.data.extracts;
122124
const red_summaries = resp.data.extracts.reduce(
123125
(acc: string[], curr: { summary: string }) => {
124126
acc = [...acc, curr.summary];
@@ -141,6 +143,7 @@ export const useTutorStore = defineStore('tutor', () => {
141143
};
142144

143145
const retrieveTutorSearch = async (arg: File[]) => {
146+
setStep(2);
144147
isLoading.value = true;
145148

146149
try {
@@ -179,6 +182,7 @@ export const useTutorStore = defineStore('tutor', () => {
179182
};
180183

181184
const handleSummaryFiles = async () => {
185+
setStep(1);
182186
reloadError.value = false;
183187
selectedSources.value = [];
184188
const arg = Object.values(newFilesToSearch.value).filter((e) => e);
@@ -224,16 +228,32 @@ export const useTutorStore = defineStore('tutor', () => {
224228
hasNewSearch.value = true;
225229
};
226230

231+
const restart = () => {
232+
setStep(1);
233+
scrollToAnchor('target-1');
234+
235+
//reset all refs
236+
tutorSearch.value = undefined;
237+
selectedSources.value = [];
238+
courseTitle.value = '';
239+
level.value = '';
240+
duration.value = '';
241+
description.value = '';
242+
newFilesToSearch.value = {};
243+
searchedFiles.value = [];
244+
extracts.value = [];
245+
};
246+
227247
const retrieveSyllabus = async () => {
228248
if (!tutorSearch.value) {
229249
throw new Error('Body is empty');
230250
}
231251
isLoading.value = true;
232252
try {
233-
console.log(selectedSources.value.length);
234253
const resp = await postAxios(`/tutor/syllabus?lang=${syllabusLanguage.value}`, {
235254
...tutorSearch.value,
236255
documents: selectedSources.value,
256+
extracts: extracts.value,
237257
...(courseTitle.value && { course_title: courseTitle.value }),
238258
...(level.value && { level: level.value }),
239259
...(duration.value && { duration: duration.value }),
@@ -257,6 +277,7 @@ export const useTutorStore = defineStore('tutor', () => {
257277
};
258278

259279
const handleCreateSyllabus = async () => {
280+
setStep(3);
260281
if (
261282
!tutorSearch.value ||
262283
(!tutorSearch.value.documents.length && !searchedFiles.value.length)
@@ -265,11 +286,6 @@ export const useTutorStore = defineStore('tutor', () => {
265286
return;
266287
}
267288

268-
if (!hasNewSearch.value) {
269-
goNext();
270-
return;
271-
}
272-
273289
await retrieveSyllabus();
274290
hasNewSearch.value = false;
275291
goNext();
@@ -318,6 +334,7 @@ export const useTutorStore = defineStore('tutor', () => {
318334
addFile,
319335
removeFile,
320336
fileError,
337+
restart,
321338
reloadError,
322339
handleSearch,
323340
retrieveTutorSearch,

0 commit comments

Comments
 (0)