Criando novo módulo Estúdio de Poesia e renomeando botões
This commit is contained in:
@@ -1145,6 +1145,128 @@ app.delete('/api/brincar-ativo/:id', requireAuth, async (req, res) => {
|
||||
}
|
||||
});
|
||||
|
||||
// ============================================================
|
||||
// ROTAS DO ESTÚDIO DE POESIA
|
||||
// ============================================================
|
||||
app.post('/api/poesias/generate', requireAuth, async (req, res) => {
|
||||
const { faixaEtaria, estrofes, tema } = req.body;
|
||||
if (!faixaEtaria || !estrofes || !tema) {
|
||||
return res.status(400).json({ error: 'Faixa etária, quantidade de estrofes e tema são obrigatórios.' });
|
||||
}
|
||||
|
||||
try {
|
||||
let poesiaText = '';
|
||||
|
||||
const systemInstruction = `Você é um poeta pedagógico infantil especializado em criar poesias ritmadas, sonoras e adequadas para o desenvolvimento infantil no Brasil.
|
||||
REGRAS RÍGIDAS:
|
||||
- Escreva a poesia para a faixa etária: ${faixaEtaria}
|
||||
- A poesia DEVE ter EXATAMENTE ${estrofes} estrofes.
|
||||
- O tema da poesia é: "${tema}"
|
||||
- Use rimas claras e vocabulário apropriado para a idade.
|
||||
- Sua resposta deve conter APENAS a poesia formatada em Markdown, sem NENHUM comentário adicional, explicação, ou blocos de pensamento.
|
||||
- Responda EXCLUSIVAMENTE em Português do Brasil.`;
|
||||
|
||||
// Utilizando o Gemini diretamente
|
||||
if (process.env.GOOGLE_AI_API_KEY) {
|
||||
console.log('[Poesia] Usando API direta do Google Gemini...');
|
||||
const geminiUrl = `https://generativelanguage.googleapis.com/v1beta/models/${process.env.GOOGLE_AI_MODEL || 'gemini-2.5-flash'}:generateContent?key=${process.env.GOOGLE_AI_API_KEY}`;
|
||||
|
||||
const response = await fetch(geminiUrl, {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({
|
||||
contents: [{ parts: [{ text: systemInstruction }] }],
|
||||
generationConfig: { temperature: 0.7, maxOutputTokens: 2000 }
|
||||
})
|
||||
});
|
||||
|
||||
if (!response.ok) {
|
||||
const errText = await response.text();
|
||||
throw new Error(`Erro na API oficial do Gemini: ${errText}`);
|
||||
}
|
||||
|
||||
const resData = await response.json();
|
||||
poesiaText = resData.candidates?.[0]?.content?.parts?.[0]?.text || '';
|
||||
|
||||
// Remover qualquer tag <think> residual (embora a instrução já previna)
|
||||
poesiaText = poesiaText.replace(/<think>[\s\S]*?(?:<\/think>|$)/g, '').trim();
|
||||
} else {
|
||||
throw new Error('Chave GOOGLE_AI_API_KEY não configurada no servidor.');
|
||||
}
|
||||
|
||||
if (!poesiaText) {
|
||||
throw new Error('Nenhuma poesia gerada.');
|
||||
}
|
||||
|
||||
const usuarioId = req.user?.id || '00000000-0000-0000-0000-000000000000';
|
||||
const dbRes = await dbPool.query(
|
||||
`INSERT INTO escola.poesias (usuario_id, faixa_etaria, estrofes, tema, poesia)
|
||||
VALUES ($1, $2, $3, $4, $5) RETURNING id, created_at`,
|
||||
[usuarioId, faixaEtaria, parseInt(estrofes), tema, poesiaText]
|
||||
);
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
id: dbRes.rows[0].id,
|
||||
poesia: poesiaText,
|
||||
createdAt: dbRes.rows[0].created_at
|
||||
});
|
||||
|
||||
} catch (err) {
|
||||
console.error('Erro na geração de poesia:', err);
|
||||
res.status(500).json({ error: 'Erro ao gerar poesia: ' + err.message });
|
||||
}
|
||||
});
|
||||
|
||||
app.get('/api/poesias/list', requireAuth, async (req, res) => {
|
||||
const usuarioId = req.user?.id || '00000000-0000-0000-0000-000000000000';
|
||||
try {
|
||||
const dbRes = await dbPool.query(
|
||||
`SELECT id, faixa_etaria, estrofes, tema, created_at FROM escola.poesias WHERE usuario_id = $1 ORDER BY created_at DESC`,
|
||||
[usuarioId]
|
||||
);
|
||||
res.json(dbRes.rows);
|
||||
} catch (err) {
|
||||
console.error('Erro ao listar poesias:', err);
|
||||
res.status(500).json({ error: 'Erro ao listar histórico de poesias.' });
|
||||
}
|
||||
});
|
||||
|
||||
app.get('/api/poesias/:id', requireAuth, async (req, res) => {
|
||||
const { id } = req.params;
|
||||
const usuarioId = req.user?.id || '00000000-0000-0000-0000-000000000000';
|
||||
try {
|
||||
const dbRes = await dbPool.query(
|
||||
`SELECT * FROM escola.poesias WHERE id = $1 AND usuario_id = $2`,
|
||||
[id, usuarioId]
|
||||
);
|
||||
if (dbRes.rows.length === 0) {
|
||||
return res.status(404).json({ error: 'Poesia não encontrada.' });
|
||||
}
|
||||
res.json(dbRes.rows[0]);
|
||||
} catch (err) {
|
||||
console.error('Erro ao buscar poesia:', err);
|
||||
res.status(500).json({ error: 'Erro ao buscar poesia.' });
|
||||
}
|
||||
});
|
||||
|
||||
app.delete('/api/poesias/:id', requireAuth, async (req, res) => {
|
||||
const { id } = req.params;
|
||||
const usuarioId = req.user?.id || '00000000-0000-0000-0000-000000000000';
|
||||
try {
|
||||
const dbRes = await dbPool.query(
|
||||
`DELETE FROM escola.poesias WHERE id = $1 AND usuario_id = $2`,
|
||||
[id, usuarioId]
|
||||
);
|
||||
if (dbRes.rowCount === 0) {
|
||||
return res.status(404).json({ error: 'Poesia não encontrada ou não pertence ao usuário.' });
|
||||
}
|
||||
res.json({ success: true, message: 'Poesia deletada com sucesso.' });
|
||||
} catch (err) {
|
||||
console.error('Erro ao deletar poesia:', err);
|
||||
res.status(500).json({ error: 'Erro ao deletar poesia.' });
|
||||
}
|
||||
});
|
||||
|
||||
// Rota GET para obter configurações do agente
|
||||
app.get('/api/agent-config', requireAuth, (req, res) => {
|
||||
@@ -1345,6 +1467,17 @@ async function initDatabase() {
|
||||
atividade TEXT NOT NULL,
|
||||
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- Poesias (Estúdio de Poesia)
|
||||
CREATE TABLE IF NOT EXISTS escola.poesias (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
usuario_id UUID NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000',
|
||||
faixa_etaria VARCHAR(100) NOT NULL,
|
||||
estrofes INTEGER NOT NULL,
|
||||
tema TEXT NOT NULL,
|
||||
poesia TEXT NOT NULL,
|
||||
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
||||
);
|
||||
`);
|
||||
|
||||
// Garantir que a coluna character_description_english exista na tabela projetos_comics
|
||||
|
||||
Reference in New Issue
Block a user