Spaces:
Sleeping
Sleeping
Commit
·
f3597fc
1
Parent(s):
f0b6306
Versão Estável 13082025
Browse files- app.py +29 -1
- static/style.css +13 -0
- templates/index.html +43 -0
app.py
CHANGED
@@ -296,7 +296,20 @@ def process():
|
|
296 |
|
297 |
claude_atomic_llm = claude_llm.bind(max_tokens=60000)
|
298 |
#models = {'grok': grok_llm, 'sonnet': claude_atomic_llm, 'gemini': gemini_llm, 'openai': openai_llm}
|
299 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
300 |
|
301 |
# Substituir os placeholders no template
|
302 |
updated_prompt_template = PROMPT_ATOMICO_INICIAL.replace(
|
@@ -555,6 +568,19 @@ def merge():
|
|
555 |
yield f"data: {json_data}\n\n"
|
556 |
return
|
557 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
558 |
output_parser = StrOutputParser()
|
559 |
|
560 |
# Atualizar o template de merge com os parâmetros de tamanho padrão
|
@@ -579,6 +605,8 @@ def merge():
|
|
579 |
claude_with_max_tokens = claude_llm.bind(max_tokens=64000)
|
580 |
chain_merge = prompt_merge | claude_with_max_tokens | output_parser
|
581 |
|
|
|
|
|
582 |
json_data = safe_json_dumps({'progress': 50, 'message': 'Enviando textos para o Claude Sonnet para consolidação...'})
|
583 |
yield f"data: {json_data}\n\n"
|
584 |
log_print("=== INVOCANDO CLAUDE SONNET PARA MERGE ===")
|
|
|
296 |
|
297 |
claude_atomic_llm = claude_llm.bind(max_tokens=60000)
|
298 |
#models = {'grok': grok_llm, 'sonnet': claude_atomic_llm, 'gemini': gemini_llm, 'openai': openai_llm}
|
299 |
+
# Melhoria 05/08/2025 - Multi-modelo
|
300 |
+
models = {}
|
301 |
+
if form_data.get('modelo-openai') == 'on':
|
302 |
+
models['openai'] = openai_llm
|
303 |
+
if form_data.get('modelo-sonnet') == 'on':
|
304 |
+
models['sonnet'] = claude_atomic_llm
|
305 |
+
if form_data.get('modelo-gemini') == 'on':
|
306 |
+
models['gemini'] = gemini_llm
|
307 |
+
|
308 |
+
# Verificação se pelo menos um modelo foi selecionado
|
309 |
+
if not models:
|
310 |
+
json_data = safe_json_dumps({'error': 'Você deve selecionar pelo menos um modelo para processamento.'})
|
311 |
+
yield f"data: {json_data}\n\n"
|
312 |
+
return
|
313 |
|
314 |
# Substituir os placeholders no template
|
315 |
updated_prompt_template = PROMPT_ATOMICO_INICIAL.replace(
|
|
|
568 |
yield f"data: {json_data}\n\n"
|
569 |
return
|
570 |
|
571 |
+
# Monta lista só com os textos que vieram no payload
|
572 |
+
available = []
|
573 |
+
for campo in ('openai_text', 'sonnet_text', 'gemini_text'):
|
574 |
+
txt = data.get(campo)
|
575 |
+
if txt and txt.strip():
|
576 |
+
available.append(txt)
|
577 |
+
if len(available) < 2:
|
578 |
+
json_data = safe_json_dumps({
|
579 |
+
'error': 'Para processar o merge, deve haver pelo menos dois textos gerados.'
|
580 |
+
})
|
581 |
+
yield f"data: {json_data}\n\n"
|
582 |
+
return
|
583 |
+
|
584 |
output_parser = StrOutputParser()
|
585 |
|
586 |
# Atualizar o template de merge com os parâmetros de tamanho padrão
|
|
|
605 |
claude_with_max_tokens = claude_llm.bind(max_tokens=64000)
|
606 |
chain_merge = prompt_merge | claude_with_max_tokens | output_parser
|
607 |
|
608 |
+
|
609 |
+
|
610 |
json_data = safe_json_dumps({'progress': 50, 'message': 'Enviando textos para o Claude Sonnet para consolidação...'})
|
611 |
yield f"data: {json_data}\n\n"
|
612 |
log_print("=== INVOCANDO CLAUDE SONNET PARA MERGE ===")
|
static/style.css
CHANGED
@@ -432,4 +432,17 @@ textarea.drag-over {
|
|
432 |
.text-contexto_usuario {
|
433 |
color: #000;
|
434 |
font-size: 14px;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
435 |
}
|
|
|
432 |
.text-contexto_usuario {
|
433 |
color: #000;
|
434 |
font-size: 14px;
|
435 |
+
}
|
436 |
+
|
437 |
+
/* Melhoria 05/08/2025 - Multi-modelo */
|
438 |
+
#modelo-container {
|
439 |
+
margin-top: 15px;
|
440 |
+
padding: 10px;
|
441 |
+
border: 1px solid #e0e0e0;
|
442 |
+
border-radius: 5px;
|
443 |
+
background-color: #f9f9f9;
|
444 |
+
}
|
445 |
+
|
446 |
+
#modelo-container label {
|
447 |
+
margin-right: 10px;
|
448 |
}
|
templates/index.html
CHANGED
@@ -511,6 +511,19 @@
|
|
511 |
</div>
|
512 |
</div>
|
513 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
514 |
<button type="submit">Processar com IA</button>
|
515 |
</form>
|
516 |
</div>
|
@@ -579,6 +592,9 @@ Use o botão `Converter para MD` para ver a mágica.</textarea>
|
|
579 |
<script>
|
580 |
// --- Variáveis Globais ---
|
581 |
const processingModeSwitch = document.getElementById('processing-mode-switch');
|
|
|
|
|
|
|
582 |
const modeSwitch = document.getElementById('mode-switch');
|
583 |
const realContainer = document.getElementById('real-form-container');
|
584 |
const mockContainer = document.getElementById('mock-form-container');
|
@@ -610,8 +626,14 @@ Use o botão `Converter para MD` para ver a mágica.</textarea>
|
|
610 |
mockContainer.style.display = this.checked ? 'block' : 'none';
|
611 |
});
|
612 |
|
|
|
613 |
processingModeSwitch.addEventListener('change', function() {
|
614 |
const isAtomic = this.checked;
|
|
|
|
|
|
|
|
|
|
|
615 |
document.getElementById('flow-description').textContent = isAtomic ?
|
616 |
"OPEN AI | Claude Sonnet | Gemini (Paralelo)" :
|
617 |
"OPEN AI ➔ Claude Sonnet ➔ Gemini";
|
@@ -700,6 +722,7 @@ Use o botão `Converter para MD` para ver a mágica.</textarea>
|
|
700 |
document.getElementById('request-form-mock').addEventListener('submit', handleFormSubmit);
|
701 |
|
702 |
async function handleFormSubmit(event) {
|
|
|
703 |
event.preventDefault();
|
704 |
debugLog("=== FORM SUBMIT INICIADO ===");
|
705 |
currentProcessingType = 'main';
|
@@ -732,6 +755,16 @@ Use o botão `Converter para MD` para ver a mágica.</textarea>
|
|
732 |
// Adicionar parâmetros de tamanho
|
733 |
formData.append('min_chars', document.getElementById('min_chars').value);
|
734 |
formData.append('max_chars', document.getElementById('max_chars').value);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
735 |
|
736 |
if (modeSwitch.checked) {
|
737 |
formData.append('mode', 'test');
|
@@ -815,6 +848,16 @@ Use o botão `Converter para MD` para ver a mágica.</textarea>
|
|
815 |
mergeBtn.addEventListener('click', async function() {
|
816 |
debugLog("=== MERGE BUTTON CLICADO ===");
|
817 |
currentProcessingType = 'merge';
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
818 |
|
819 |
loaderMessage.textContent = 'Processando o merge dos textos...';
|
820 |
progressBar.style.width = '0%';
|
|
|
511 |
</div>
|
512 |
</div>
|
513 |
|
514 |
+
<!-- Melhoria 05/08/2025 - Multi-modelo -->
|
515 |
+
<div id="modelo-container" style="display:none;">
|
516 |
+
<label>Escolha os modelos:</label>
|
517 |
+
<div>
|
518 |
+
<input type="checkbox" id="modelo-openai" name="modelo-openai" checked>
|
519 |
+
<label for="modelo-openai">OpenAI</label>
|
520 |
+
<input type="checkbox" id="modelo-sonnet" name="modelo-sonnet" checked>
|
521 |
+
<label for="modelo-sonnet">Sonnet</label>
|
522 |
+
<input type="checkbox" id="modelo-gemini" name="modelo-gemini" checked>
|
523 |
+
<label for="modelo-gemini">Gemini</label>
|
524 |
+
</div>
|
525 |
+
</div>
|
526 |
+
|
527 |
<button type="submit">Processar com IA</button>
|
528 |
</form>
|
529 |
</div>
|
|
|
592 |
<script>
|
593 |
// --- Variáveis Globais ---
|
594 |
const processingModeSwitch = document.getElementById('processing-mode-switch');
|
595 |
+
// Melhoria 05/08/2025 - Multi-modelo
|
596 |
+
const modeloContainer = document.getElementById('modelo-container');
|
597 |
+
modeloContainer.style.display = this.checked ? 'block' : 'none';
|
598 |
const modeSwitch = document.getElementById('mode-switch');
|
599 |
const realContainer = document.getElementById('real-form-container');
|
600 |
const mockContainer = document.getElementById('mock-form-container');
|
|
|
626 |
mockContainer.style.display = this.checked ? 'block' : 'none';
|
627 |
});
|
628 |
|
629 |
+
// Melhoria 05/08/2025 - Multi-modelo
|
630 |
processingModeSwitch.addEventListener('change', function() {
|
631 |
const isAtomic = this.checked;
|
632 |
+
|
633 |
+
// Melhoria 05/08/2025 - Multi-modelo (Corrigido)
|
634 |
+
const modeloContainer = document.getElementById('modelo-container');
|
635 |
+
modeloContainer.style.display = isAtomic ? 'block' : 'none';
|
636 |
+
|
637 |
document.getElementById('flow-description').textContent = isAtomic ?
|
638 |
"OPEN AI | Claude Sonnet | Gemini (Paralelo)" :
|
639 |
"OPEN AI ➔ Claude Sonnet ➔ Gemini";
|
|
|
722 |
document.getElementById('request-form-mock').addEventListener('submit', handleFormSubmit);
|
723 |
|
724 |
async function handleFormSubmit(event) {
|
725 |
+
console.clear();
|
726 |
event.preventDefault();
|
727 |
debugLog("=== FORM SUBMIT INICIADO ===");
|
728 |
currentProcessingType = 'main';
|
|
|
755 |
// Adicionar parâmetros de tamanho
|
756 |
formData.append('min_chars', document.getElementById('min_chars').value);
|
757 |
formData.append('max_chars', document.getElementById('max_chars').value);
|
758 |
+
|
759 |
+
// Melhoria 05/08/2025 - Multi-modelo: envia os check-boxes ao servidor
|
760 |
+
if (processingModeSwitch.checked) {
|
761 |
+
['openai','sonnet','gemini'].forEach(m => {
|
762 |
+
const id = `modelo-${m}`;
|
763 |
+
if (document.getElementById(id).checked) {
|
764 |
+
formData.append(id, 'on');
|
765 |
+
}
|
766 |
+
});
|
767 |
+
}
|
768 |
|
769 |
if (modeSwitch.checked) {
|
770 |
formData.append('mode', 'test');
|
|
|
848 |
mergeBtn.addEventListener('click', async function() {
|
849 |
debugLog("=== MERGE BUTTON CLICADO ===");
|
850 |
currentProcessingType = 'merge';
|
851 |
+
|
852 |
+
// Melhoria 05/08/2025 - validação antes de chamar o servidor
|
853 |
+
const filled = ['openai-output','sonnet-output','gemini-output']
|
854 |
+
.map(id => rawTexts[id])
|
855 |
+
.filter(text => text && text.trim().length > 0)
|
856 |
+
.length;
|
857 |
+
if (filled < 2) {
|
858 |
+
showError('Para processar o merge, deve haver pelo menos dois textos gerados.');
|
859 |
+
return;
|
860 |
+
}
|
861 |
|
862 |
loaderMessage.textContent = 'Processando o merge dos textos...';
|
863 |
progressBar.style.width = '0%';
|