open-prompt / src /app /api /coach /route.ts
GitHub Action
Automated sync to Hugging Face
bcce530
import { NextRequest, NextResponse } from 'next/server'
import { streamText } from 'ai'
import { google } from '@ai-sdk/google'
import { getAuthUser } from '@/lib/auth'
import { checkRateLimit, getClientIdentifier, getRateLimitHeaders } from '@/lib/rate-limit'
// POST /api/coach — AI Prompt Improver
export async function POST(request: NextRequest) {
try {
const authUser = await getAuthUser()
const userId = authUser?.id ?? null
// Rate limiting
const identifier = getClientIdentifier(request, userId ?? undefined)
const rateLimit = await checkRateLimit(identifier, !!userId)
if (!rateLimit.success) {
return new Response(
JSON.stringify({ error: rateLimit.error }),
{ status: 429, headers: { 'Content-Type': 'application/json' } }
)
}
const body = await request.json()
// Support both 'prompt' (legacy) and 'template' (from PromptCoach component)
const { prompt, template, action, category } = body
const inputText = template || prompt
if (!inputText) {
return NextResponse.json({ error: 'Prompt or template is required' }, { status: 400 })
}
let systemPrompt = ''
switch (action) {
case 'improve':
systemPrompt = `You are an expert prompt engineer. Improve the following AI prompt to get better results. Make it clearer, more specific, and add any missing context or instructions. Return ONLY the improved prompt, no explanations.`
break
case 'shorten':
systemPrompt = `You are an expert prompt engineer. Make the following AI prompt more concise while keeping its effectiveness. Remove redundancy and unnecessary words. Return ONLY the shortened prompt, no explanations.`
break
case 'expand':
systemPrompt = `You are an expert prompt engineer. Expand the following AI prompt with more detail, context, and specific instructions to get higher quality results. Return ONLY the expanded prompt, no explanations.`
break
case 'analyze':
default:
systemPrompt = `You are an expert prompt engineer and AI coach.
Give concise, actionable feedback on this prompt in under 120 words.
Focus ONLY on specific weaknesses and how to fix them. Do NOT repeat what is already good.
${category ? `The prompt is for the "${category}" category.` : ''}
End with one concrete rewrite suggestion for the weakest part.`
}
const result = await streamText({
model: google('gemini-2.0-flash'),
system: systemPrompt,
prompt: inputText.slice(0, 2000),
})
const headers = getRateLimitHeaders(rateLimit)
return result.toTextStreamResponse({
headers: Object.fromEntries(headers.entries()),
})
} catch (error) {
console.error('Coach error:', error)
return NextResponse.json({ error: 'Failed to improve prompt' }, { status: 500 })
}
}