|
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(); |
|
} |
|
}); |
|
} |
|
|