Corrige prompt cinematografico de quadros, remove rate limit na geracao de 10 quadros e blinda modais contra clique fora
This commit is contained in:
@@ -513,57 +513,48 @@ app.post('/api/comics/generate-script', requireAuth, async (req, res) => {
|
||||
|
||||
try {
|
||||
let prompt = '';
|
||||
if (existingPanels && Array.isArray(existingPanels) && existingPanels.length > 0) {
|
||||
const startPanelNum = continuationType === 'extend' ? existingPanels.length + 1 : 1;
|
||||
|
||||
prompt = `Você está continuando ou se baseando em um projeto de história em quadrinhos existente.
|
||||
DADOS DO PROJETO EXISTENTE:
|
||||
- Descrição visual física e de estilo constante dos personagens (em inglês): "${character_description || ''}"
|
||||
- Painéis já existentes (roteiro anterior):
|
||||
${existingPanels.map(p => ` * Quadrinho ${p.panel_number || p.panelNumber}: [Visual] ${p.image_prompt || p.imagePrompt || 'N/A'} | [Fala/Legenda] ${p.dialogue}`).join('\n')}
|
||||
const isContinuation = existingPanels && Array.isArray(existingPanels) && existingPanels.length > 0 && continuationType && continuationType !== 'new';
|
||||
const startPanelNum = (existingPanels && Array.isArray(existingPanels)) ? existingPanels.length + 1 : 1;
|
||||
|
||||
INSTRUÇÕES DE GERAÇÃO:
|
||||
Tipo de continuidade: ${continuationType === 'extend' ? 'Estender a mesma história (continuação cronológica direta, criando novos painéis sequenciais)' : 'Criar uma nova história separada (spin-off com os mesmos personagens, recomeçando do painel 1)'}.
|
||||
Tema/Objetivo da nova fase: "${tema}".
|
||||
Gere exatamente ${quantidade} novos quadrinhos.
|
||||
Baloes de falas: ${baloes ? 'Sim, cada quadrinho deve conter um diálogo/fala extremamente conciso e curto, contendo no máximo 10 palavras no total.' : 'Não, a história é silenciosa, sem falas, apenas a descrição da cena'}.
|
||||
if (isContinuation) {
|
||||
prompt = `Continue a história em quadrinhos pedagógica infantil com o tema: "${tema}".
|
||||
A história deve conter mais ${quantidade} novos quadrinhos dando continuidade cronológica aos anteriores.
|
||||
Baloes de falas: ${baloes ? 'Sim, cada quadrinho deve conter um diálogo/fala conciso e expressivo, contendo no máximo 12 palavras no total.' : 'Não, a história é silenciosa, sem falas, apenas a ação dos personagens'}.
|
||||
Proporção visual: ${proporcao}.
|
||||
Cenário/Local principal da nova fase: ${cenario}.
|
||||
|
||||
Gere um JSON perfeitamente válido contendo:
|
||||
{
|
||||
"title": "${continuationType === 'extend' ? 'Manter o título original ou propor um subtítulo condizente' : 'Novo Título da História'}",
|
||||
"character_description": "${character_description || 'Descrição física rigorosamente constante e fixa dos personagens em inglês (roupas fixas, cabelos, cores)'}",
|
||||
"character_description": "${character_description || 'Descrição física fixa dos personagens em inglês (roupas fixas, cabelos, cores)'}",
|
||||
"panels": [
|
||||
{
|
||||
"panel_number": ${startPanelNum},
|
||||
"image_prompt": "Prompt visual minucioso em inglês para o gerador de imagens. REGRA RÍGIDA DE CONSISTÊNCIA: Substitua nomes de personagens por sua descrição física EXATA e FIXA em inglês (do character_description) em TODOS os quadrinhos onde aparecerem (mesmas roupas, mesma cor de cabelo, mesmas características). Descreva a ação específica do quadrinho mantendo o mesmo estilo visual 3D Pixar.",
|
||||
"dialogue": "Falas do quadrinho em português (ex: 'Lucas: Veja aquilo!') com NO MÁXIMO 10 palavras, ou narração curta caso não tenha balões."
|
||||
},
|
||||
...
|
||||
"image_prompt": "Cena cinematográfica completa em inglês em estilo 3D Pixar/Disney: descreva a ação dos personagens com suas roupas e traços físicos exatos inseridos organicamente no cenário (${cenario}), com iluminação mágica, cores vibrantes e atmosfera infantil encantadora.",
|
||||
"dialogue": "Falas do quadrinho em português (ex: 'Lucas: Veja aquilo!') com NO MÁXIMO 12 palavras, ou narração curta caso não tenha balões."
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
Responda APENAS o JSON válido, sem qualquer texto explicativo antes ou depois.`;
|
||||
} else {
|
||||
prompt = `Crie uma história em quadrinhos pedagógica infantil com o tema: "${tema}".
|
||||
prompt = `Crie uma história em quadrinhos pedagógica infantil rica e envolvente com o tema: "${tema}".
|
||||
A história deve conter exatamente ${quantidade} quadrinhos.
|
||||
Baloes de falas: ${baloes ? 'Sim, cada quadrinho deve conter um diálogo/fala extremamente conciso e curto, contendo no máximo 10 palavras no total.' : 'Não, a história é silenciosa, sem falas, apenas a descrição da cena'}.
|
||||
Baloes de falas: ${baloes ? 'Sim, cada quadrinho deve conter um diálogo/fala conciso e expressivo, contendo no máximo 12 palavras no total.' : 'Não, a história é silenciosa, sem falas, apenas a descrição da cena'}.
|
||||
Proporção visual: ${proporcao}.
|
||||
Personagens participantes: ${JSON.stringify(personagens)}.
|
||||
Cenário/Local principal: ${cenario}.
|
||||
|
||||
Gere um JSON perfeitamente válido contendo:
|
||||
{
|
||||
"title": "Título da História",
|
||||
"character_description": "Descrição física rigorosamente detalhada e fixa dos personagens em inglês (especifique roupas fixas, cores de camiseta/vestido, tipo/cor de cabelo, tom de pele e características físicas fixas para NUNCA mudarem entre os quadrinhos).",
|
||||
"title": "Título Criativo da História",
|
||||
"character_description": "Descrição física detalhada e fixa dos personagens em inglês (ex: Lucas: a cheerful 6-year-old boy with short brown hair wearing a bright red t-shirt and blue shorts. Mariana: a 5-year-old girl with blonde pigtails in a yellow dress).",
|
||||
"panels": [
|
||||
{
|
||||
"panel_number": 1,
|
||||
"image_prompt": "Prompt visual minucioso em inglês para o gerador de imagens da MiniMax. REGRA RÍGIDA DE CONSISTÊNCIA: Substitua TODOS os nomes de personagens por sua descrição física EXATA e FIXA em inglês (do character_description) em TODOS os quadrinhos em que aparecerem (mesmas roupas fixas, cabelos e características de forma idêntica em 100% das imagens). Descreva a cena específica mantendo a arte 3D Pixar infantil de traço limpo.",
|
||||
"dialogue": "Falas do quadrinho em português (ex: 'Lucas: Veja aquilo!') com NO MÁXIMO 10 palavras, ou narração curta caso não tenha balões."
|
||||
},
|
||||
...
|
||||
"image_prompt": "Cena cinematográfica completa em inglês em estilo 3D Pixar/Disney: descreva a ação dos personagens com suas roupas e traços físicos exatos inseridos vividamente DENTRO do cenário principal (${cenario}), com cores vibrantes, iluminação mágica e atmosfera infantil encantadora.",
|
||||
"dialogue": "Falas do quadrinho em português (ex: 'Lucas: Vamos explorar a floresta!') com NO MÁXIMO 12 palavras, ou narração curta caso não tenha balões."
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -571,10 +562,10 @@ Responda APENAS o JSON válido, sem qualquer texto explicativo antes ou depois.`
|
||||
}
|
||||
|
||||
const r = await callMinimax({
|
||||
system: "Você é um roteirista pedagógico especialista em histórias em quadrinhos infantis para educação básica. Você responde apenas com estruturas JSON válidas.",
|
||||
system: "Você é um renomado diretor de arte e roteirista de histórias em quadrinhos infantis 3D estilo Pixar Disney. Você sempre descreve cenas ricas com personagens e cenários integrados naturalmente em inglês.",
|
||||
messages: [{ role: 'user', content: prompt }],
|
||||
temperature: 0.3,
|
||||
max_tokens: 3000
|
||||
temperature: 0.4,
|
||||
max_tokens: 3500
|
||||
});
|
||||
|
||||
let jsonText = r.text;
|
||||
@@ -652,9 +643,6 @@ app.post('/api/comics/generate-frame', requireAuth, async (req, res) => {
|
||||
fs.mkdirSync(mediaDir, { recursive: true });
|
||||
}
|
||||
|
||||
const fileName = `quadrinho_${Date.now()}_${Math.floor(Math.random() * 1000)}.jpg`;
|
||||
const filePath = path.join(mediaDir, fileName);
|
||||
|
||||
let imageBuffer = null;
|
||||
let providerUsed = 'minimax';
|
||||
|
||||
@@ -758,6 +746,10 @@ app.post('/api/comics/generate-frame', requireAuth, async (req, res) => {
|
||||
providerUsed = 'fallback-placeholder';
|
||||
}
|
||||
|
||||
const fileExt = (providerUsed === 'fallback-placeholder') ? 'svg' : 'jpg';
|
||||
const fileName = `quadrinho_${Date.now()}_${Math.floor(Math.random() * 1000)}.${fileExt}`;
|
||||
const filePath = path.join(mediaDir, fileName);
|
||||
|
||||
try {
|
||||
fs.writeFileSync(filePath, imageBuffer);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user