From f4f056449f6b6ca87c012223828bd6f982b98637 Mon Sep 17 00:00:00 2001 From: ManishMadan2882 Date: Mon, 15 Jan 2024 20:23:18 +0530 Subject: [PATCH] integrate /api/search endpoint, get sources post stream --- frontend/src/conversation/conversationApi.ts | 78 +++++++++++++++---- .../src/conversation/conversationSlice.ts | 39 +++++----- 2 files changed, 84 insertions(+), 33 deletions(-) diff --git a/frontend/src/conversation/conversationApi.ts b/frontend/src/conversation/conversationApi.ts index 542a3a99..a01d034a 100644 --- a/frontend/src/conversation/conversationApi.ts +++ b/frontend/src/conversation/conversationApi.ts @@ -12,20 +12,20 @@ export function fetchAnswerApi( promptId: string | null, ): Promise< | { - result: any; - answer: any; - sources: any; - conversationId: any; - query: string; - } + result: any; + answer: any; + sources: any; + conversationId: any; + query: string; + } | { - result: any; - answer: any; - sources: any; - query: string; - conversationId: any; - title: any; - } + result: any; + answer: any; + sources: any; + query: string; + conversationId: any; + title: any; + } > { let namePath = selectedDocs.name; if (selectedDocs.language === namePath) { @@ -128,7 +128,6 @@ export function fetchAnswerSteaming( conversation_id: conversationId, prompt_id: promptId, }; - fetch(apiHost + '/stream', { method: 'POST', headers: { @@ -183,7 +182,58 @@ export function fetchAnswerSteaming( }); }); } +export function searchEndpoint( + question: string, + apiKey: string, + selectedDocs: Doc, + conversation_id: string | null, + history: Array = [], +) { + /* + "active_docs": "default", + "question": "Summarise", + "conversation_id": null, + "history": "[]" */ + let namePath = selectedDocs.name; + if (selectedDocs.language === namePath) { + namePath = '.project'; + } + let docPath = 'default'; + if (selectedDocs.location === 'local') { + docPath = 'local' + '/' + selectedDocs.name + '/'; + } else if (selectedDocs.location === 'remote') { + docPath = + selectedDocs.language + + '/' + + namePath + + '/' + + selectedDocs.version + + '/' + + selectedDocs.model + + '/'; + } + + const body = { + question: question, + active_docs: docPath, + conversation_id, + history + }; + return fetch(`${apiHost}/api/search`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify( + body + ), + }).then((response) => response.json()) + .then((data) => { + return data; + }) + .catch(err => console.log(err)) +} export function sendFeedback( prompt: string, response: string, diff --git a/frontend/src/conversation/conversationSlice.ts b/frontend/src/conversation/conversationSlice.ts index ca92092b..3f840d3c 100644 --- a/frontend/src/conversation/conversationSlice.ts +++ b/frontend/src/conversation/conversationSlice.ts @@ -1,6 +1,7 @@ import { createAsyncThunk, createSlice, PayloadAction } from '@reduxjs/toolkit'; import store from '../store'; import { fetchAnswerApi, fetchAnswerSteaming } from './conversationApi'; +import { searchEndpoint } from './conversationApi'; import { Answer, ConversationState, Query, Status } from './conversationModels'; import { getConversations } from '../preferences/preferenceApi'; import { setConversations } from '../preferences/preferenceSlice'; @@ -29,6 +30,7 @@ export const fetchAnswer = createAsyncThunk( (event) => { const data = JSON.parse(event.data); + // check if the 'end' event has been received if (data.type === 'end') { // set status to 'idle' @@ -40,24 +42,22 @@ export const fetchAnswer = createAsyncThunk( .catch((error) => { console.error('Failed to fetch conversations: ', error); }); - } else if (data.type === 'source') { - // check if data.metadata exists - let result; - if (data.metadata && data.metadata.title) { - const titleParts = data.metadata.title.split('/'); - result = { - title: titleParts[titleParts.length - 1], - text: data.doc, - }; - } else { - result = { title: data.doc, text: data.doc }; - } - dispatch( - updateStreamingSource({ - index: state.conversation.queries.length - 1, - query: { sources: [result] }, - }), - ); + + searchEndpoint( //search for sources post streaming + question, + state.preference.apiKey, + state.preference.selectedDocs!, + state.conversation.conversationId, + state.conversation.queries + ).then(sources => { + //dispatch streaming sources + dispatch( + updateStreamingSource({ + index: state.conversation.queries.length - 1, + query: { sources }, + }), + ); + }); } else if (data.type === 'id') { dispatch( updateConversationId({ @@ -165,9 +165,10 @@ export const conversationSlice = createSlice({ state, action: PayloadAction<{ index: number; query: Partial }>, ) { + const { index, query } = action.payload; if (!state.queries[index].sources) { - state.queries[index].sources = [query.sources![0]]; + state.queries[index].sources = query?.sources; } else { state.queries[index].sources!.push(query.sources![0]); }