| | import { Answer, FEEDBACK } from './conversationModels'; |
| | import { Doc } from '../preferences/preferenceApi'; |
| |
|
| | const apiHost = import.meta.env.VITE_API_HOST || 'https://docsapi.arc53.com'; |
| |
|
| | export function fetchAnswerApi( |
| | question: string, |
| | apiKey: string, |
| | selectedDocs: Doc, |
| | history: Array<any> = [], |
| | conversationId: string | null, |
| | promptId: string | null, |
| | ): Promise< |
| | | { |
| | result: any; |
| | answer: any; |
| | sources: any; |
| | conversationId: any; |
| | query: string; |
| | } |
| | | { |
| | result: any; |
| | answer: any; |
| | sources: any; |
| | query: string; |
| | conversationId: any; |
| | title: any; |
| | } |
| | > { |
| | 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 + |
| | '/'; |
| | } |
| | |
| | history = history.map((item) => { |
| | return { prompt: item.prompt, response: item.response }; |
| | }); |
| |
|
| | return fetch(apiHost + '/api/answer', { |
| | method: 'POST', |
| | headers: { |
| | 'Content-Type': 'application/json', |
| | }, |
| | body: JSON.stringify({ |
| | question: question, |
| | api_key: apiKey, |
| | embeddings_key: apiKey, |
| | history: history, |
| | active_docs: docPath, |
| | conversation_id: conversationId, |
| | prompt_id: promptId, |
| | }), |
| | }) |
| | .then((response) => { |
| | if (response.ok) { |
| | return response.json(); |
| | } else { |
| | return Promise.reject(new Error(response.statusText)); |
| | } |
| | }) |
| | .then((data) => { |
| | const result = data.answer; |
| | return { |
| | answer: result, |
| | query: question, |
| | result, |
| | sources: data.sources, |
| | conversationId: data.conversation_id, |
| | }; |
| | }); |
| | } |
| |
|
| | export function fetchAnswerSteaming( |
| | question: string, |
| | apiKey: string, |
| | selectedDocs: Doc, |
| | history: Array<any> = [], |
| | conversationId: string | null, |
| | promptId: string | null, |
| | onEvent: (event: MessageEvent) => void, |
| | ): Promise<Answer> { |
| | 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 + |
| | '/'; |
| | } |
| |
|
| | history = history.map((item) => { |
| | return { prompt: item.prompt, response: item.response }; |
| | }); |
| |
|
| | return new Promise<Answer>((resolve, reject) => { |
| | const body = { |
| | question: question, |
| | api_key: apiKey, |
| | embeddings_key: apiKey, |
| | active_docs: docPath, |
| | history: JSON.stringify(history), |
| | conversation_id: conversationId, |
| | prompt_id: promptId, |
| | }; |
| | fetch(apiHost + '/stream', { |
| | method: 'POST', |
| | headers: { |
| | 'Content-Type': 'application/json', |
| | }, |
| | body: JSON.stringify(body), |
| | }) |
| | .then((response) => { |
| | if (!response.body) throw Error('No response body'); |
| |
|
| | const reader = response.body.getReader(); |
| | const decoder = new TextDecoder('utf-8'); |
| | let counterrr = 0; |
| | const processStream = ({ |
| | done, |
| | value, |
| | }: ReadableStreamReadResult<Uint8Array>) => { |
| | if (done) { |
| | console.log(counterrr); |
| | return; |
| | } |
| |
|
| | counterrr += 1; |
| |
|
| | const chunk = decoder.decode(value); |
| |
|
| | const lines = chunk.split('\n'); |
| |
|
| | for (let line of lines) { |
| | if (line.trim() == '') { |
| | continue; |
| | } |
| | if (line.startsWith('data:')) { |
| | line = line.substring(5); |
| | } |
| |
|
| | const messageEvent: MessageEvent = new MessageEvent('message', { |
| | data: line, |
| | }); |
| |
|
| | onEvent(messageEvent); |
| | } |
| |
|
| | reader.read().then(processStream).catch(reject); |
| | }; |
| |
|
| | reader.read().then(processStream).catch(reject); |
| | }) |
| | .catch((error) => { |
| | console.error('Connection failed:', error); |
| | reject(error); |
| | }); |
| | }); |
| | } |
| | export function searchEndpoint( |
| | question: string, |
| | apiKey: string, |
| | selectedDocs: Doc, |
| | conversation_id: string | null, |
| | history: Array<any> = [], |
| | ) { |
| | |
| | |
| | |
| | |
| | |
| | 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, |
| | feedback: FEEDBACK, |
| | ) { |
| | return fetch(`${apiHost}/api/feedback`, { |
| | method: 'POST', |
| | headers: { |
| | 'Content-Type': 'application/json', |
| | }, |
| | body: JSON.stringify({ |
| | question: prompt, |
| | answer: response, |
| | feedback: feedback, |
| | }), |
| | }).then((response) => { |
| | if (response.ok) { |
| | return Promise.resolve(); |
| | } else { |
| | return Promise.reject(); |
| | } |
| | }); |
| | } |
| |
|