146 lines
4.0 KiB
TypeScript
146 lines
4.0 KiB
TypeScript
import { NextRequest, NextResponse } from "next/server";
|
|
import { getServerSession } from "next-auth";
|
|
import { authOptions } from "@/lib/auth";
|
|
import prisma from "@/lib/prisma";
|
|
import { generateWithGemini } from "@/lib/gemini";
|
|
|
|
const GENERATION_PROMPTS = {
|
|
LESSON_PLAN: `Você é um especialista em educação brasileira. Crie um plano de aula completo e detalhado seguindo a estrutura abaixo:
|
|
|
|
## Dados da Aula
|
|
- **Disciplina:** {subject}
|
|
- **Ano/Série:** {grade}
|
|
- **Tema:** {topic}
|
|
- **Duração:** {duration}
|
|
|
|
## Estrutura do Plano
|
|
|
|
### 1. Objetivos de Aprendizagem
|
|
- Objetivo geral
|
|
- Objetivos específicos (3-5)
|
|
- Competências da BNCC relacionadas
|
|
|
|
### 2. Conteúdos
|
|
- Conceituais
|
|
- Procedimentais
|
|
- Atitudinais
|
|
|
|
### 3. Metodologia
|
|
- Abordagem pedagógica
|
|
- Estratégias de ensino
|
|
- Recursos didáticos necessários
|
|
|
|
### 4. Desenvolvimento da Aula
|
|
- Momento inicial (aquecimento/motivação)
|
|
- Desenvolvimento (atividades principais)
|
|
- Fechamento (síntese/avaliação)
|
|
|
|
### 5. Avaliação
|
|
- Critérios de avaliação
|
|
- Instrumentos avaliativos
|
|
- Indicadores de aprendizagem
|
|
|
|
### 6. Referências e Materiais de Apoio
|
|
|
|
Seja detalhado, prático e alinhado às diretrizes da BNCC. Use linguagem clara e objetiva.`,
|
|
|
|
EXAM: `Você é um especialista em avaliação educacional. Crie uma prova/lista de exercícios seguindo os parâmetros:
|
|
|
|
- **Disciplina:** {subject}
|
|
- **Ano/Série:** {grade}
|
|
- **Tema:** {topic}
|
|
- **Número de questões:** {questionCount}
|
|
- **Tipos de questões:** {questionTypes}
|
|
- **Nível de dificuldade:** {difficulty}
|
|
|
|
Para cada questão, inclua:
|
|
- Enunciado claro e objetivo
|
|
- Alternativas (se múltipla escolha)
|
|
- Gabarito
|
|
- Habilidade BNCC relacionada
|
|
|
|
Varie os tipos de questões e níveis de dificuldade progressivamente.`,
|
|
};
|
|
|
|
export async function POST(request: NextRequest) {
|
|
try {
|
|
const session = await getServerSession(authOptions);
|
|
|
|
if (!session?.user?.id) {
|
|
return NextResponse.json({ error: "Não autorizado" }, { status: 401 });
|
|
}
|
|
|
|
const user = await prisma.user.findUnique({
|
|
where: { id: session.user.id },
|
|
select: { credits: true, plan: true },
|
|
});
|
|
|
|
if (!user) {
|
|
return NextResponse.json({ error: "Usuário não encontrado" }, { status: 404 });
|
|
}
|
|
|
|
if (user.credits <= 0 && user.plan === "FREE") {
|
|
return NextResponse.json(
|
|
{ error: "Créditos insuficientes. Faça upgrade para continuar." },
|
|
{ status: 403 }
|
|
);
|
|
}
|
|
|
|
const body = await request.json();
|
|
const { type, ...params } = body;
|
|
|
|
if (!type || !GENERATION_PROMPTS[type as keyof typeof GENERATION_PROMPTS]) {
|
|
return NextResponse.json({ error: "Tipo de geração inválido" }, { status: 400 });
|
|
}
|
|
|
|
// Build prompt
|
|
let prompt = GENERATION_PROMPTS[type as keyof typeof GENERATION_PROMPTS];
|
|
Object.entries(params).forEach(([key, value]) => {
|
|
prompt = prompt.replace(`{${key}}`, value as string);
|
|
});
|
|
|
|
// Call Gemini API
|
|
const content = await generateWithGemini(
|
|
prompt,
|
|
"Você é um assistente especializado em educação brasileira, ajudando professores a criar conteúdos pedagógicos de alta qualidade."
|
|
);
|
|
|
|
if (!content) {
|
|
throw new Error("Resposta vazia da IA");
|
|
}
|
|
|
|
// Save generation
|
|
const generation = await prisma.generation.create({
|
|
data: {
|
|
userId: session.user.id,
|
|
type: type as any,
|
|
title: params.topic || params.title || "Sem título",
|
|
content: { text: content },
|
|
prompt: prompt,
|
|
model: "gemini-2.0-flash",
|
|
tokens: 0,
|
|
},
|
|
});
|
|
|
|
// Deduct credits (only for FREE plan)
|
|
if (user.plan === "FREE") {
|
|
await prisma.user.update({
|
|
where: { id: session.user.id },
|
|
data: { credits: { decrement: 1 } },
|
|
});
|
|
}
|
|
|
|
return NextResponse.json({
|
|
id: generation.id,
|
|
content: content,
|
|
tokens: 0,
|
|
});
|
|
} catch (error: any) {
|
|
console.error("Generation error:", error);
|
|
return NextResponse.json(
|
|
{ error: error.message || "Erro ao gerar conteúdo" },
|
|
{ status: 500 }
|
|
);
|
|
}
|
|
}
|