All MicroEvals
// =========================================================...
Create MicroEval
Header image for // =========================================================...

// =========================================================...

Prompt

// ============================================================================= // 🤖 GERENCIADOR DE MODELOS DE IA (100% GRATUITO - SEM CARTÃO DE CRÉDITO) // Com proteções ABSOLUTAS contra parâmetros undefined e logs detalhados de erro // CORRIGIDO: Removido "timeout" (não suportado pelo Apps Script) e parsing blindado // CORRIGIDO: Espaço em branco no nome do modelo e chaves duplicadas em CRITERIOS_MODELO // ============================================================================= var CATALOGO_MODELOS = { gemini: [ 'gemini-2.0-flash', // ✅ O mais rápido, inteligente e econômico atualmente 'gemini-1.5-flash', // ✅ Excelente custo-benefício e alta janela de contexto 'gemini-1.5-flash-8b', 'gemini-2.5-flash-lite' // ✅ Versão ultra-leve (consome ainda menos cota) - CORRIGIDO: espaço removido ], groq: [ 'llama-3.1-8b-instant', // ✅ Priorizado: Extremamente rápido e leve 'llama-3.3-70b-versatile' // ✅ Fallback: Mais pesado, mas ainda gratuito ], // ============================================================================= // 🌐 EXECUÇÃO DA CHAMADA HTTP (CORRIGIDA - SEM TIMEOUT) // ============================================================================= function _executarChamadaIA(provedor, apiKey, prompt, maxTokens, temperatura, modeloEspecifico) { try { if (!provedor || typeof provedor !== 'string' || !modeloEspecifico) return null; var url, options; var p = provedor.toLowerCase(); var tokens = maxTokens || 100; if (p === 'groq') { url = 'https://api.groq.com/openai/v1/chat/completions'; options = { method: 'post', contentType: 'application/json', headers: { 'Authorization': 'Bearer ' + apiKey }, payload: JSON.stringify({ model: modeloEspecifico, messages: [{ role: 'user', content: prompt }], temperature: temperatura, max_tokens: tokens }), muteHttpExceptions: true }; } else if (p === 'huggingface') { url = 'https://api-inference.huggingface.co/models/' + modeloEspecifico + '/v1/chat/completions'; options = { method: 'post', contentType: 'application/json', headers: { 'Authorization': 'Bearer ' + apiKey }, payload: JSON.stringify({ model: modeloEspecifico, messages: [{ role: 'user', content: prompt }], temperature: temperatura, max_tokens: tokens }), muteHttpExceptions: true }; } else if (p === 'openrouter') { url = 'https://openrouter.ai/api/v1/chat/completions'; options = { method: 'post', contentType: 'application/json', headers: { 'Authorization': 'Bearer ' + apiKey, 'HTTP-Referer': (typeof BLOG_URL !== 'undefined') ? BLOG_URL : 'https://arnewsnoticias.com', 'X-Title': (typeof BLOG_NOME !== 'undefined') ? BLOG_NOME : 'AR NEWS 24H' }, payload: JSON.stringify({ model: modeloEspecifico, messages: [{ role: 'user', content: prompt }], temperature: temperatura, max_tokens: tokens }), muteHttpExceptions: true }; } else if (p === 'gemini') { url = 'https://generativelanguage.googleapis.com/v1beta/models/' + modeloEspecifico + ':generateContent?key=' + apiKey; options = { method: 'post', contentType: 'application/json', payload: JSON.stringify({ contents: [{ parts: [{ text: prompt }] }], generationConfig: { temperature: temperatura, maxOutputTokens: tokens } }), muteHttpExceptions: true }; } else { Logger.log(' ⚠️ Provedor não reconhecido: ' + provedor); return null; } var response = UrlFetchApp.fetch(url, options); var codigo = response.getResponseCode(); var textoResposta = response.getContentText(); if (codigo !== 200 && codigo !== 201) { Logger.log(' ⚠️ Erro HTTP ' + codigo + ' em ' + provedor + ' (' + modeloEspecifico + '): ' + textoResposta.substring(0, 250)); return null; } var data; try { data = JSON.parse(textoResposta); } catch (parseErr) { Logger.log(' ❌ Resposta inválida (não é JSON) de ' + provedor + ': ' + textoResposta.substring(0, 150)); return null; } // --- PARSING BLINDADO --- if (p === 'gemini') { if (data.candidates && data.candidates[0]) { var candidato = data.candidates[0]; // Verifica bloqueio de segurança if (candidato.finishReason && candidato.finishReason === 'SAFETY') { Logger.log(' ⚠️ Gemini bloqueou a resposta por filtro de segurança (SAFETY).'); return null; } if (candidato.content && candidato.content.parts && candidato.content.parts.length > 0) { var textoGemini = ''; for (var g = 0; g < candidato.content.parts.length; g++) { if (candidato.content.parts[g] && candidato.content.parts[g].text) { textoGemini += candidato.content.parts[g].text; } } textoGemini = textoGemini.trim(); if (textoGemini.length > 0) return textoGemini; } } // Verifica bloqueio no prompt de entrada if (data.promptFeedback && data.promptFeedback.blockReason) { Logger.log(' ⚠️ Gemini bloqueou o prompt de entrada: ' + data.promptFeedback.blockReason); } return null; } else { // Groq / OpenRouter / HuggingFace (padrão OpenAI) if (data.choices && data.choices[0] && data.choices[0].message && data.choices[0].message.content) { var conteudo = data.choices[0].message.content.trim(); if (conteudo.length > 0) return conteudo; } if (data.error) { Logger.log(' ⚠️ Erro retornado por ' + provedor + ': ' + JSON.stringify(data.error).substring(0, 200)); } return null; } } catch (e) { Logger.log(' ❌ Exceção na chamada para ' + provedor + ': ' + e.message); return null; } } // ============================================================================= // 🔧 FUNÇÕES DE MANUTENÇÃO (VERSÃO SEGURA) // ============================================================================= function atualizarModelosAutomaticamente() { Logger.log('=== 🤖 ATUALIZAÇÃO SEGURA DE MODELOS ===\n'); var props = PropertiesService.getScriptProperties(); var provedores = ['groq', 'gemini', 'openrouter', 'huggingface']; var atualizacoes = 0; for (var i = 0; i < provedores.length; i++) { var provedor = provedores[i]; var chave = _getChaveProvedor(provedor); if (!chave) { Logger.log('⏭️ Pulando ' + provedor.toUpperCase() + ' (Chave não configurada)'); continue; } Logger.log('🔄 Verificando: ' + provedor.toUpperCase()); try { var modelosDisponiveis = _buscarModelosDisponiveis(provedor); if (!modelosDisponiveis || modelosDisponiveis.length === 0) { Logger.log(' ⚠️ Não foi possível obter a lista de modelos. Mantendo o atual.'); continue; } var melhorModelo = _selecionarMelhorModelo(modelosDisponiveis, provedor); var propriedadeModelo = 'IA_MODELO_' + provedor.toUpperCase(); var modeloAtual = props.getProperty(propriedadeModelo); if (modeloAtual !== melhorModelo) { props.setProperty(propriedadeModelo, melhorModelo); Logger.log(' ✅ ATUALIZADO: "' + (modeloAtual || 'Nenhum') + '" ➡️ "' + melhorModelo + '"'); atualizacoes++; } else { Logger.log(' ✅ Já está atualizado: "' + melhorModelo + '"'); } Utilities.sleep(1000); } catch (e) { Logger.log(' ⚠️ Falha ao verificar ' + provedor + ': ' + e.message); } } Logger.log('\n=== Resumo ===\n✅ Atualizações realizadas: ' + atualizacoes); } function _buscarModelosDisponiveis(provedor) { var chave = _getChaveProvedor(provedor); if (!chave) return null; var p = provedor.toLowerCase(); try { if (p === 'huggingface') return CATALOGO_MODELOS.huggingface; var url = p === 'gemini' ? 'https://generativelanguage.googleapis.com/v1beta/models?key=' + chave : p === 'groq' ? 'https://api.groq.com/openai/v1/models' : 'https://openrouter.ai/api/v1/models'; var headers = (p !== 'gemini') ? { 'Authorization': 'Bearer ' + chave } : {}; var response = UrlFetchApp.fetch(url, { method: 'get', headers: headers, muteHttpExceptions: true }); if (response.getResponseCode() !== 200) { Logger.log(' ⚠️ HTTP ' + response.getResponseCode() + ' ao buscar modelos de ' + provedor); return null; } var data = JSON.parse(response.getContentText()); var modelos = []; if (p === 'gemini' && data.models) { data.models.forEach(function(m) { if (m.name && m.supportedGenerationMethods && m.supportedGenerationMethods.indexOf('generateContent') !== -1) { modelos.push(m.name.replace('models/', '')); } }); } else if (data.data) { data.data.forEach(function(m) { if (m.id) modelos.push(m.id); }); } return modelos; } catch (e) { Logger.log(' ⚠️ Exceção ao buscar modelos de ' + provedor + ': ' + e.message); return null; } } function _selecionarMelhorModelo(modelos, provedor) { var p = provedor.toLowerCase(); var padrao = (CATALOGO_MODELOS[p] && CATALOGO_MODELOS[p][0]) ? CATALOGO_MODELOS[p][0] : null; if (!modelos || modelos.length === 0) return padrao; var criterios = CRITERIOS_MODELO[p]; if (!criterios) return modelos[0]; var candidatos = []; modelos.forEach(function(modelo) { var lower = modelo.toLowerCase(); // Ignora modelos que contenham termos proibidos var proibido = criterios.evitar.some(function(ev) { return lower.indexOf(ev) !== -1; }); if (proibido) return; var score = 0; criterios.preferidos.forEach(function(pref) { if (lower.indexOf(pref.toLowerCase()) !== -1) score++; }); candidatos.push({ modelo: modelo, score: score }); }); if (candidatos.length === 0) return padrao; candidatos.sort(function(a, b) { return b.score - a.score; }); return candidatos[0].modelo; } function verModelosAtuais() { var props = PropertiesService.getScriptProperties(); Logger.log('=== 📊 MODELOS CONFIGURADOS ===\n'); ['groq', 'gemini', 'openrouter', 'huggingface'].forEach(function(p) { var prop = 'IA_MODELO_' + p.toUpperCase(); // ✅ CORRIGIDO: Proteção contra erro se o catálogo estiver vazio/indefinido var catalogo = CATALOGO_MODELOS[p]; var padraoTxt = (catalogo && catalogo[0]) ? catalogo[0] + ' (Padrão)' : 'Nenhum catálogo (Padrão)'; var modelo = props.getProperty(prop) || padraoTxt; Logger.log((_getChaveProvedor(p) ? '✅' : '❌') + ' ' + p.toUpperCase() + ': ' + modelo); }); } function resetarModelosParaPadrao() { var props = PropertiesService.getScriptProperties(); props.setProperty('IA_MODELO_GROQ', CATALOGO_MODELOS.groq[0]); props.setProperty('IA_MODELO_GEMINI', CATALOGO_MODELOS.gemini[0]); props.setProperty('IA_MODELO_OPENROUTER', CATALOGO_MODELOS.openrouter[0]); props.setProperty('IA_MODELO_HUGGINGFACE', CATALOGO_MODELOS.huggingface[0]); Logger.log('✅ Modelos resetados para as melhores opções gratuitas.'); }

Drag to resize
Drag to resize