Spaces:
Running
Running
File size: 1,815 Bytes
52b4c36 3ba9c0c 52b4c36 f3a9ef2 52b4c36 3ba9c0c 52b4c36 3ba9c0c 52b4c36 3ba9c0c 52b4c36 f3a9ef2 52b4c36 f3a9ef2 52b4c36 42501f7 52b4c36 f3a9ef2 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 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
import { OpenAIStream, StreamingTextResponse } from 'ai';
import OpenAI from 'openai';
import { auth } from '@/auth';
import { nanoid } from '@/lib/utils';
import {
ChatCompletionContentPart,
ChatCompletionContentPartImage,
ChatCompletionMessageParam,
} from 'openai/resources';
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, dataset } = json as {
messages: ChatCompletionMessageParam[];
dataset: string[];
};
const userId = (await auth())?.user.id;
if (!userId) {
return new Response('Unauthorized', {
status: 401,
});
}
const messagesWithImage: ChatCompletionMessageParam[] = messages.map(
message => {
if (message.role !== 'user') return message;
const contentWithImage: ChatCompletionContentPart[] = [
{
type: 'text',
text: message.content as string,
},
...dataset.map(
image =>
({
type: 'image_url',
image_url: { url: image },
}) satisfies ChatCompletionContentPartImage,
),
];
return {
role: 'user',
content: contentWithImage,
};
},
);
const res = await openai.chat.completions.create({
model: 'gpt-4-vision-preview',
messages: messagesWithImage,
temperature: 0.7,
stream: true,
max_tokens: 300,
});
const stream = OpenAIStream(res, {
async onCompletion(completion) {
const title = json.messages[0].content.substring(0, 100);
const id = json.id ?? nanoid();
const createdAt = Date.now();
const payload = {
id,
title,
userId,
createdAt,
messages: [
...messages,
{
content: completion,
role: 'assistant',
},
],
};
},
});
return new StreamingTextResponse(stream);
}
|