ai / app /api /chat /route.ts
Hamed744's picture
Update app/api/chat/route.ts
b3806c9 verified
// Next.js Edge Runtime
// See https://nextjs.org/docs/app/api-reference/file-conventions/route-segment-config
export const runtime = 'edge';
// URL مستقیم به API اسپیس هاگینگ فیس
const HUGGING_FACE_API_URL = 'https://umint-ai.hf.space/api/chat';
// تعریف نوع داده برای پیام‌های ورودی از assistant-ui
interface AssistantMessagePart {
type: 'text' | 'file';
text?: string;
url?: string; // Data URL for images
mediaType?: string;
}
interface AssistantMessage {
role: 'user' | 'assistant' | 'system';
parts: AssistantMessagePart[];
}
export async function POST(req: Request) {
try {
// پیام‌ها را از بدنه درخواست JSON استخراج می‌کنیم
const { messages }: { messages: AssistantMessage[] } = await req.json();
// بدنه درخواستی که به اسپیس هاگینگ فیس ارسال می‌شود را می‌سازیم
const requestBody = {
messages: messages.map((msg) => ({
role: msg.role,
parts: msg.parts.map((part) => {
if (part.type === 'file' && part.url) {
return {
type: 'file',
url: part.url,
mediaType: part.mediaType || 'image/jpeg',
};
}
return {
type: 'text',
text: part.text || '',
};
}),
})),
id: 'chat_' + Date.now(),
trigger: 'submit-message',
};
// درخواست را به API هاگینگ فیس ارسال می‌کنیم
const response = await fetch(HUGGING_FACE_API_URL, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(requestBody),
});
// بررسی می‌کنیم که آیا درخواست موفقیت‌آمیز بوده است
if (!response.ok) {
const errorText = await response.text();
return new Response(
`Error from Hugging Face API: ${response.status} ${errorText}`,
{ status: response.status },
);
}
// پاسخ جریانی (stream) را مستقیماً به کلاینت (رابط کاربری) برمی‌گردانیم
// این روش جدید و ساده‌تر برای بازگرداندن stream است
return new Response(response.body, {
headers: {
'Content-Type': 'text/event-stream; charset=utf-8',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive',
},
});
} catch (error) {
console.error('Error in chat API route:', error);
return new Response('An internal error occurred.', { status: 500 });
}
}