Spaces:
Build error
Build error
| import { createHuggingFace } from '@ai-sdk/huggingface'; | |
| import { createOpenAI } from '@ai-sdk/openai'; | |
| import { createAnthropic } from '@ai-sdk/anthropic'; | |
| import { createGoogleGenerativeAI } from '@ai-sdk/google'; | |
| import { streamText, toTextStreamResponse } from 'ai'; | |
| import { NextRequest } from 'next/server'; | |
| // Create provider instances with proper configuration | |
| const huggingface = createHuggingFace({ | |
| apiKey: process.env.HUGGINGFACE_API_KEY, | |
| // Use the default base URL: https://router.huggingface.co/v1 | |
| }); | |
| const openai = createOpenAI({ | |
| apiKey: process.env.OPENAI_API_KEY, | |
| }); | |
| const anthropic = createAnthropic({ | |
| apiKey: process.env.ANTHROPIC_API_KEY, | |
| }); | |
| const google = createGoogleGenerativeAI({ | |
| apiKey: process.env.GOOGLE_API_KEY, | |
| }); | |
| // Get provider and model from request | |
| const getProviderForModel = (modelName: string) => { | |
| if (modelName.includes('deepseek-ai') || modelName.includes('Qwen') || | |
| modelName.includes('moonshotai') || modelName.includes('zai-org') || | |
| modelName.includes('MiniMaxAI') || modelName.includes('meta-llama') || | |
| modelName.includes('gemma')) { | |
| return huggingface; | |
| } | |
| if (modelName.includes('gpt')) { | |
| return openai; | |
| } | |
| if (modelName.includes('claude')) { | |
| return anthropic; | |
| } | |
| if (modelName.includes('gemini')) { | |
| return google; | |
| } | |
| // Default to Hugging Face for unknown models | |
| return huggingface; | |
| }; | |
| export async function POST(req: NextRequest) { | |
| try { | |
| const { messages, model } = await req.json(); | |
| if (!model) { | |
| return new Response('Model is required', { status: 400 }); | |
| } | |
| if (!messages || !Array.isArray(messages)) { | |
| return new Response('Messages array is required', { status: 400 }); | |
| } | |
| const provider = getProviderForModel(model); | |
| // Convert messages to the format expected by AI SDK | |
| const systemMessage = messages.find((m: any) => m.role === 'system'); | |
| const userMessages = messages | |
| .filter((m: any) => m.role === 'user') | |
| .map((m: any) => m.content) | |
| .join('\n\n'); | |
| const messagesToSend = systemMessage ? [systemMessage.content, userMessages] : [userMessages]; | |
| // Use streamText with proper Hugging Face streaming | |
| const result = await streamText({ | |
| model: provider(model), | |
| messages: messagesToSend, | |
| maxTokens: 2000, | |
| temperature: 0.7, | |
| topP: 0.9, | |
| presencePenalty: 0.1, | |
| frequencyPenalty: 0.1, | |
| onError: ({ error }) => { | |
| console.error('Stream error:', error); | |
| }, | |
| }); | |
| // Return the streaming response | |
| return result.toTextStreamResponse(); | |
| } catch (error) { | |
| console.error('AI API Error:', error); | |
| // Return a helpful error message | |
| const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred'; | |
| return new Response(JSON.stringify({ | |
| error: 'Failed to process AI request', | |
| details: errorMessage, | |
| message: 'Please check your API keys and model configuration. Make sure you have a valid API key for the selected model provider.', | |
| model: model || 'unknown', | |
| provider: model ? getProviderForModel(model).constructor.name : 'unknown' | |
| }), { | |
| status: 500, | |
| headers: { | |
| 'Content-Type': 'application/json', | |
| }, | |
| }); | |
| } | |
| } | |
| // Support both POST and GET for compatibility | |
| export async function GET(req: NextRequest) { | |
| return POST(req); | |
| } |