Cada alumno tiene su propio progreso, guardado en este dispositivo
Crear nuevo perfil
🔐
Panel Docente
Ingresá la contraseña de configuración
Contraseña incorrecta
Contraseña por defecto: docente2024 Cambiala desde el panel una vez adentro.
⚙️ Panel Docente — Configuración de la IA
Todo lo que configurés aquí define cómo la IA se comporta con los alumnos
Nombre e identidad de la IA
Nombre de la IA
Materia / Área
Instrucciones personalizadas (System Prompt)
Escribí aquí cómo querés que la IA se comporte, qué puede y qué no puede responder, el tono, el enfoque pedagógico y el nivel educativo. Esto reemplaza el comportamiento por defecto.
Modo pedagógico por defecto
Motor de IA
Eterneura usa Groq como motor principal (llama-3.3-70b-versatile → llama-3.1-70b → gemma2-9b-it), con OpenRouter como respaldo automático si Groq está saturado. Para imágenes usa modelos de visión gratuitos vía OpenRouter (Qwen-VL, Llama Vision). No requiere configuración adicional.
Generación de imágenes realistas
Cuando un alumno pide explícitamente una imagen realista (ej. "una imagen realista del sistema nervioso"), Eterneura la genera de verdad con Cloudflare Workers AI — gratis, sin tarjeta. Requiere un paso único de activación en Cloudflare: Settings → Functions → AI bindings → Add binding → nombre de variable "AI". Solo funciona en el deploy de Cloudflare (Netlify no tiene equivalente gratuito). Si no está activado, Eterneura ofrece un diagrama esquemático (SVG) en su lugar, que sí funciona siempre.
Alumnos en este dispositivo
Cada alumno que crea un perfil queda registrado acá. Esta lista es local a este dispositivo/navegador — si un alumno usa otro dispositivo, su perfil no aparece en esta lista.
Biblioteca docente (documentos base permanentes)
Estos documentos quedan guardados en este dispositivo y la IA los usa como base de conocimiento en todas las conversaciones. PDF hasta 60 páginas, TXT y MD ilimitado.
📚 Subí tus materiales base (PDF, TXT, MD)
Hacé clic o arrastrá archivos aquí
⏳ Procesando documentos…
Contraseña del panel docente
Exportar / importar configuración
Exportá toda la configuración (instrucciones + biblioteca docente) para hacer backup o compartir con otro dispositivo.
Evaluador Académico
Generá exámenes completos con opción múltiple, verdadero/falso y preguntas de desarrollo sobre cualquier tema. El resultado se puede descargar en TXT o Markdown.
🗺️ Mapa de Conocimiento
Cada estrella es un tema trabajado · el tamaño y color reflejan tu dominio
📝 Evaluador Académico
Generá un examen completo y descargable sobre cualquier tema
Tema del examen
Nivel educativo
Tipo de preguntas
Preguntas
Instrucciones adicionales (opcional)
Examen generado
Modo Socrático
Definí un tema en el panel izquierdo
✨
Hola, soy Eterneura
Tu compañero de aprendizaje. Elegí un modo, definí tu tema y empezá. Podés subir tus propios apuntes como base de conocimiento.
📋 Historial de sesiones
🌦 Pronóstico del tiempo
—
—°C
—
Sensación
—
Humedad
—
Viento
—
Lluvia 1h
—
Presión
—
Índice UV
—
Imágenes actualizadas del Servicio Meteorológico Nacional (SMN) y GOES-16. Se refrescan cada vez que abrís esta pestaña.
La IA analiza los datos meteorológicos actuales y da un pronóstico en lenguaje natural. También puede analizar las imágenes de satélite y radar vía visión.
Buscá una ciudad y presioná un botón para que la IA analice las condiciones meteorológicas.
// Usa Open-Meteo (sin key, CORS libre) para datos numéricos,
// y Geocoding API de Open-Meteo para convertir nombre → lat/lon.
// Las imágenes satelitales son URLs públicas del SMN y GOES-16.
let wpWeatherData = null; // datos actuales cacheados para el análisis IA
let wpLocationName = '';
let wpLat = null, wpLon = null;
const WP_WEATHER_CODES = {
0:'Despejado',1:'Mayormente despejado',2:'Parcialmente nublado',3:'Nublado',
45:'Niebla',48:'Niebla con escarcha',51:'Llovizna ligera',53:'Llovizna moderada',55:'Llovizna intensa',
61:'Lluvia ligera',63:'Lluvia moderada',65:'Lluvia intensa',
71:'Nevada ligera',73:'Nevada moderada',75:'Nevada intensa',
80:'Chaparrones ligeros',81:'Chaparrones moderados',82:'Chaparrones intensos',
95:'Tormenta',96:'Tormenta con granizo ligero',99:'Tormenta con granizo intenso'
};
const WP_WEATHER_ICON = {
0:'☀️',1:'🌤',2:'⛅',3:'☁️',45:'🌫',48:'🌫',
51:'🌦',53:'🌦',55:'🌧',61:'🌧',63:'🌧',65:'🌧',
71:'🌨',73:'❄️',75:'❄️',80:'🌦',81:'🌧',82:'⛈',
95:'⛈',96:'⛈',99:'⛈'
};
const WP_SAT_SOURCES = [
{
label: 'Satélite GOES-16 — Sudamérica visible',
url: 'https://cdn.star.nesdis.noaa.gov/GOES16/ABI/SECTOR/sa/GEOCOLOR/latest.jpg',
ts: 'NOAA / GOES-16 · Actualización automática'
},
{
label: 'Satélite GOES-16 — Infrarrojo (IR)',
url: 'https://cdn.star.nesdis.noaa.gov/GOES16/ABI/SECTOR/sa/13/latest.jpg',
ts: 'NOAA / GOES-16 Canal 13 (IR) · Actualización automática'
},
{
label: 'Radar Nacional — SMN Argentina',
url: 'https://www.smn.gob.ar/sites/default/files/imagenes/radar/radar-nacional.gif',
ts: 'SMN Argentina · Se actualiza cada ~10 minutos'
},
{
label: 'Satélite IR — SMN Argentina',
url: 'https://www.smn.gob.ar/sites/default/files/imagenes/satelite/satelitecanal4-SudAmerica.jpg',
ts: 'SMN Argentina · Canal 4 IR · Se actualiza cada ~30 minutos'
}
];
function openWeatherPanel() {
document.getElementById('weather-overlay').classList.add('open');
renderSatImages();
}
function closeWeatherPanel() {
document.getElementById('weather-overlay').classList.remove('open');
}
function switchWpTab(btn) {
document.querySelectorAll('.wp-tab').forEach(t => t.classList.remove('active'));
document.querySelectorAll('.wp-section').forEach(s => s.classList.remove('active'));
btn.classList.add('active');
document.getElementById(btn.getAttribute('data-tab')).classList.add('active');
if (btn.getAttribute('data-tab') === 'wp-satellite-sec') renderSatImages();
}
function wpShowError(msg) {
const el = document.getElementById('wp-error');
el.textContent = msg; el.style.display = 'block';
}
function wpHideError() { document.getElementById('wp-error').style.display = 'none'; }
async function fetchWeather() {
const locInput = document.getElementById('wp-loc-input').value.trim();
if (!locInput) { wpShowError('Escribí una ciudad'); return; }
wpHideError();
const btn = document.getElementById('wp-fetch-btn');
btn.disabled = true; btn.textContent = '⏳';
try {
// 1. Geocoding: nombre → lat/lon
const geoRes = await fetch(
`https://geocoding-api.open-meteo.com/v1/search?name=${encodeURIComponent(locInput)}&count=1&language=es&format=json`
);
const geoData = await geoRes.json();
if (!geoData.results?.length) { wpShowError('No se encontró esa ciudad. Probá con otro nombre.'); return; }
const loc = geoData.results[0];
wpLat = loc.latitude; wpLon = loc.longitude;
wpLocationName = `${loc.name}${loc.admin1 ? ', '+loc.admin1 : ''}, ${loc.country}`;
await loadWeatherData();
} catch(err) {
wpShowError('Error de conexión: ' + err.message);
} finally {
btn.disabled = false; btn.textContent = 'Buscar';
}
}
async function fetchWeatherGeo() {
wpHideError();
if (!navigator.geolocation) { wpShowError('Tu navegador no soporta geolocalización'); return; }
navigator.geolocation.getCurrentPosition(
async pos => {
wpLat = pos.coords.latitude; wpLon = pos.coords.longitude;
// Reverse geocoding via Open-Meteo
try {
const r = await fetch(`https://geocoding-api.open-meteo.com/v1/search?name=&latitude=${wpLat}&longitude=${wpLon}&count=1&language=es&format=json`);
const d = await r.json();
wpLocationName = d.results?.[0]?.name || `${wpLat.toFixed(2)}, ${wpLon.toFixed(2)}`;
} catch(_) { wpLocationName = `${wpLat.toFixed(2)}, ${wpLon.toFixed(2)}`; }
await loadWeatherData();
},
err => wpShowError('No se pudo obtener tu ubicación: ' + err.message)
);
}
async function loadWeatherData() {
const url = `https://api.open-meteo.com/v1/forecast?latitude=${wpLat}&longitude=${wpLon}` +
`¤t=temperature_2m,apparent_temperature,relative_humidity_2m,precipitation,weather_code,` +
`wind_speed_10m,wind_direction_10m,surface_pressure,uv_index` +
`&hourly=precipitation_probability` +
`&daily=weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max` +
`&timezone=auto&forecast_days=7`;
const res = await fetch(url);
if (!res.ok) { wpShowError('Error al obtener datos meteorológicos'); return; }
const data = await res.json();
wpWeatherData = { ...data, locationName: wpLocationName, lat: wpLat, lon: wpLon };
renderCurrentWeather(data);
renderForecast(data);
document.getElementById('wp-tabs').style.display = 'flex';
document.getElementById('wp-content').style.display = 'block';
}
function windDir(deg) {
const dirs = ['N','NE','E','SE','S','SO','O','NO'];
return dirs[Math.round(deg / 45) % 8];
}
function renderCurrentWeather(data) {
const c = data.current;
const code = c.weather_code;
document.getElementById('wp-loc-label').textContent = wpLocationName;
document.getElementById('wp-temp').innerHTML = `${Math.round(c.temperature_2m)}°C`;
document.getElementById('wp-desc').textContent = `${WP_WEATHER_ICON[code] || '🌡'} ${WP_WEATHER_CODES[code] || 'Condición desconocida'}`;
document.getElementById('wp-feel').textContent = `${Math.round(c.apparent_temperature)}°C`;
document.getElementById('wp-hum').textContent = `${c.relative_humidity_2m}%`;
document.getElementById('wp-wind').textContent = `${Math.round(c.wind_speed_10m)} km/h ${windDir(c.wind_direction_10m)}`;
document.getElementById('wp-rain1h').textContent = `${(c.precipitation || 0).toFixed(1)} mm`;
document.getElementById('wp-press').textContent = `${Math.round(c.surface_pressure || 0)} hPa`;
document.getElementById('wp-uv').textContent = c.uv_index != null ? c.uv_index.toFixed(1) : '—';
}
function renderForecast(data) {
const grid = document.getElementById('wp-forecast-grid');
grid.innerHTML = '';
const days = ['Dom','Lun','Mar','Mié','Jue','Vie','Sáb'];
(data.daily.time || []).forEach((dateStr, i) => {
const d = new Date(dateStr + 'T12:00:00');
const code = data.daily.weather_code[i];
const el = document.createElement('div');
el.className = 'wp-day';
el.innerHTML = `