Spaces:
Running
Running
File size: 1,462 Bytes
52b4c36 3ba9c0c 52b4c36 a8e1cb0 52b4c36 f3a9ef2 52b4c36 a8e1cb0 3ba9c0c 52b4c36 3ba9c0c 52b4c36 3ba9c0c 52b4c36 a8e1cb0 52b4c36 42501f7 52b4c36 a8e1cb0 52b4c36 a8e1cb0 52b4c36 a8e1cb0 3c9f03f f3a9ef2 3c9f03f f3a9ef2 52b4c36 a8e1cb0 52b4c36 a8e1cb0 52b4c36 3ba9c0c |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
import { OpenAIStream, StreamingTextResponse } from 'ai';
import OpenAI from 'openai';
import { auth } from '@/auth';
import {
ChatCompletionMessageParam,
ChatCompletionContentPart,
ChatCompletionContentPartImage,
} from 'openai/resources';
import { MessageWithSelectedDataset } from '../../../lib/types';
export const runtime = 'edge';
const openai = new OpenAI({
apiKey: process.env.OPENAI_API_KEY,
});
export async function POST(req: Request) {
const json = await req.json();
const { messages } = json as {
messages: MessageWithSelectedDataset[];
};
const userId = (await auth())?.user.id;
if (!userId) {
return new Response('Unauthorized', {
status: 401,
});
}
const formattedMessage: ChatCompletionMessageParam[] = messages.map(
message => {
const { dataset, ...rest } = message;
const contentWithImage: ChatCompletionContentPart[] = [
{
type: 'text',
text: message.content as string,
},
...(dataset ?? []).map(
entity =>
({
type: 'image_url',
image_url: { url: entity.url },
}) satisfies ChatCompletionContentPartImage,
),
];
return {
role: 'user',
content: contentWithImage,
};
},
);
const res = await openai.chat.completions.create({
model: 'gpt-4-vision-preview',
messages: formattedMessage,
temperature: 0.3,
stream: true,
max_tokens: 300,
});
const stream = OpenAIStream(res);
return new StreamingTextResponse(stream);
}
|