12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- import type { NextApiRequest, NextApiResponse } from 'next';
- import { OpenAIEmbeddings } from 'langchain/embeddings';
- import { SupabaseVectorStore } from 'langchain/vectorstores';
- import { openai } from '@/utils/openai-client';
- import { supabaseClient } from '@/utils/supabase-client';
- import { makeChain } from '@/utils/makechain';
- export default async function handler(
- req: NextApiRequest,
- res: NextApiResponse,
- ) {
- const { question, history } = req.body;
- if (!question) {
- return res.status(400).json({ message: 'No question in the request' });
- }
- // OpenAI recommends replacing newlines with spaces for best results
- const sanitizedQuestion = question.trim().replaceAll('\n', ' ');
- /* create vectorstore*/
- const vectorStore = await SupabaseVectorStore.fromExistingIndex(
- supabaseClient,
- new OpenAIEmbeddings(),
- );
- res.writeHead(200, {
- 'Content-Type': 'text/event-stream',
- 'Cache-Control': 'no-cache, no-transform',
- Connection: 'keep-alive',
- });
- const sendData = (data: string) => {
- res.write(`data: ${data}\n\n`);
- };
- sendData(JSON.stringify({ data: '' }));
- const model = openai;
- // create the chain
- const chain = makeChain(vectorStore, (token: string) => {
- sendData(JSON.stringify({ data: token }));
- });
- try {
- //Ask a question
- const response = await chain.call({
- question: sanitizedQuestion,
- chat_history: history || [],
- });
- console.log('response', response);
- } catch (error) {
- console.log('error', error);
- } finally {
- sendData('[DONE]');
- res.end();
- }
- }
|