46 lines
1.8 KiB
TypeScript
46 lines
1.8 KiB
TypeScript
|
|
import { GoogleGenAI } from "@google/genai";
|
|
import { SchoolData } from "../types";
|
|
|
|
export const geminiService = {
|
|
getAIAnalysis: async (prompt: string, context: SchoolData) => {
|
|
// Always initialize GoogleGenAI with a named parameter using process.env.API_KEY directly.
|
|
const ai = new GoogleGenAI({ apiKey: process.env.API_KEY });
|
|
|
|
// Minimal data extraction to avoid token overflow
|
|
const summaryContext = {
|
|
totalStudents: context.students.length,
|
|
activeStudents: context.students.filter(s => s.status === 'active').length,
|
|
// Fix: Resolve course name from courseId since Class doesn't have courseName
|
|
classes: context.classes.map(c => {
|
|
const course = context.courses.find(crs => crs.id === c.courseId);
|
|
return { name: c.name, course: course?.name || 'N/A' };
|
|
}),
|
|
totalPendingPayments: context.payments.filter(p => p.status !== 'paid').length
|
|
};
|
|
|
|
const systemInstruction = `
|
|
Você é um assistente especializado em gestão escolar para escolas de informática.
|
|
Use os dados fornecidos para gerar relatórios, sugestões de contratos ou insights financeiros.
|
|
Responda de forma profissional e concisa em Português do Brasil.
|
|
`;
|
|
|
|
try {
|
|
const response = await ai.models.generateContent({
|
|
model: 'gemini-3-flash-preview',
|
|
contents: `Contexto da Escola: ${JSON.stringify(summaryContext)}\n\nUsuário pergunta: ${prompt}`,
|
|
config: {
|
|
systemInstruction,
|
|
temperature: 0.7,
|
|
}
|
|
});
|
|
|
|
// Directly access .text property as per GenerateContentResponse definition.
|
|
return response.text || "Desculpe, não consegui processar sua solicitação.";
|
|
} catch (error) {
|
|
console.error("Gemini Error:", error);
|
|
return "Erro ao conectar com a IA. Verifique sua chave de API.";
|
|
}
|
|
}
|
|
};
|