
Proyecto IA Monterroso (XVII): MonteIA pasa a llamarse PINSAPA, y ya sabe qué tiempo hace
Dos cosas en esta entrada: un cambio de nombre, y la segunda herramienta real del asistente, después de la calculadora.
Por qué el cambio de nombre
“MonteIA” tenía un problema que no habíamos visto venir: suena más a nombre de chalet o urbanización que a una inteligencia artificial (existe, literalmente, un chalet con ese nombre). Hacía falta algo que sonara a nombre propio de verdad, y que no chocara con ningún asistente de IA que ya existiera.
Se probaron dos candidatos antes de encontrar el bueno. AIDA sonaba bien —recuerda a “ayuda”, y es un nombre real—, pero ya hay varios asistentes de IA con ese nombre exacto en producción (uno de Applus+, uno del Ministerio TIC de Colombia, y más), así que quedaba descartado por choque directo. Bermejía —por Sierra Bermeja, donde está el instituto— no choca con nada, pero resultó ser una palabra real del diccionario con un significado bastante raro para el nombre de una IA (mejor no entrar en detalles).
El nombre bueno, al final: PINSAPA, por el pinsapo, el abeto endémico y protegido que es el símbolo natural de Sierra Bermeja. Y de paso, unas siglas con sentido:
PINSAPA — Plataforma de Inteligencia Neuronal para Saber, Aprender, Pensar y Ayudar. IA local. Inteligencia que echa raíces. 🌲🧠
Cambiado ya en todo lo que se ve: el título de la pestaña, la cabecera de la interfaz, los dos “personajes” (formal e informal) del asistente, los mensajes de error y la caja de acceso. Lo único que se queda como estaba, a propósito, es el nombre interno de la variable de entorno y de la cabecera del código de acceso — cambiar eso obligaría a renombrar también algo en ROCKY, y no aporta nada visible a cambio del riesgo. Las entradas de blog anteriores (I a XVI) tampoco se reescriben: son el registro de cómo se llamaba el proyecto cuando se escribieron.
Qué se ha añadido: la herramienta del tiempo
Después de la calculadora (ver la entrada anterior), la segunda “herramienta” real: PINSAPA ya puede consultar el tiempo de verdad, en vez de inventárselo. Es la primera vez que el asistente habla con algo fuera de la red del centro, así que esto se ha hecho con más cuidado que de costumbre.
Tres reglas, decididas antes de escribir una línea de código:
El destino está fijado en el código, nunca en lo que escriba el alumnado. Se usa Open-Meteo (gratis, sin necesidad de clave), y su dirección está fija en main.py. Nunca se construye una URL a partir del texto de la pregunta — solo se le pasa un parámetro (el nombre de una ciudad) a una dirección que ya estaba decidida de antemano. Esto evita que alguien intente que el servidor se conecte a un sitio distinto del que se ha decidido aquí.
Solo sale fuera lo mínimo imprescindible. No se manda la pregunta completa a Open-Meteo, solo el nombre de la ciudad, ya extraído y limpiado. El tiempo en sí no es un dato personal, pero tampoco hay motivo para mandar más texto del necesario a un servicio externo.
Si falla, falla en silencio. Timeout corto (5 segundos, nada que ver con los 120 que se le dan a LM Studio) y cualquier error de red se traga sin romper la conversación: si Open-Meteo está lento o caído, PINSAPA simplemente no tiene ese dato, como si no lo supiera.
_OPENMETEO_GEOCODING_URL = "https://geocoding-api.open-meteo.com/v1/search"
_OPENMETEO_FORECAST_URL = "https://api.open-meteo.com/v1/forecast"
_TIMEOUT_TIEMPO_SEGUNDOS = 5
_ESTEPONA_LATITUD = 36.4285
_ESTEPONA_LONGITUD = -5.1459
PATRON_PREGUNTA_TIEMPO = re.compile(
r"(qu[eé]\s+tiempo\s+hace|temperatura|va\s+a\s+llover|hace\s+(?:fr[ií]o|calor)|"
r"previsi[oó]n\s+del?\s+tiempo|meteorolog[ií]a|el\s+clima)",
re.IGNORECASE,
)
PATRON_CIUDAD = re.compile(r"\ben\s+([A-Za-zÁÉÍÓÚáéíóúÑñ ]{3,40})\??\s*$")
def _intentar_tiempo(pregunta):
if not PATRON_PREGUNTA_TIEMPO.search(pregunta):
return None
ciudad = None
coincidencia_ciudad = PATRON_CIUDAD.search(pregunta)
if coincidencia_ciudad:
ciudad = _limpiar_nombre_ciudad(coincidencia_ciudad.group(1))
try:
if ciudad and ciudad.strip().lower() != "estepona":
respuesta_geo = requests.get(
_OPENMETEO_GEOCODING_URL,
params={"name": ciudad, "count": 1, "language": "es"},
timeout=_TIMEOUT_TIEMPO_SEGUNDOS,
)
respuesta_geo.raise_for_status()
resultados = respuesta_geo.json().get("results")
if not resultados:
return None
latitud, longitud = resultados[0]["latitude"], resultados[0]["longitude"]
nombre_lugar = resultados[0].get("name", ciudad)
else:
latitud, longitud, nombre_lugar = _ESTEPONA_LATITUD, _ESTEPONA_LONGITUD, "Estepona"
respuesta_tiempo = requests.get(
_OPENMETEO_FORECAST_URL,
params={"latitude": latitud, "longitude": longitud, "current_weather": "true"},
timeout=_TIMEOUT_TIEMPO_SEGUNDOS,
)
respuesta_tiempo.raise_for_status()
actual = respuesta_tiempo.json().get("current_weather")
if not actual:
return None
temperatura, codigo = actual.get("temperature"), actual.get("weathercode")
descripcion = _DESCRIPCIONES_TIEMPO.get(codigo, "condiciones variables")
return (
"Dato del tiempo verificado ahora mismo (Open-Meteo; no lo "
f"inventes ni lo cambies): en {nombre_lugar}, {temperatura}°C, "
f"{descripcion}."
)
except (requests.exceptions.RequestException, KeyError, ValueError, IndexError, TypeError):
return None
(El código completo incluye también el diccionario de descripciones del tiempo y la función que limpia el nombre de la ciudad antes de usarlo — esto es el núcleo.)
Si no se nombra ninguna ciudad, se asume Estepona (con coordenadas ya fijas, sin gastar una llamada extra de geocodificación). Si se nombra otra, se resuelve con la propia API de Open-Meteo antes de pedir el tiempo.
Aviso honesto sobre la detección: “tiempo” a solas es demasiado ambiguo en español (“no tengo tiempo”, “el tiempo pasa”), así que se exigen construcciones más concretas (“qué tiempo hace”, “temperatura”, “va a llover”…). Es un conjunto de patrones, no comprensión real de la frase — se le pueden escapar formas de preguntar que no encajen en ninguno, igual que ya pasa con el filtro de entrada.
Cómo se comprobó
Sin acceso a Open-Meteo desde el entorno donde se escribió el código, se probó con la red simulada: preguntas ambiguas (“no tengo tiempo para esto”) no disparan ninguna llamada; preguntando por el tiempo sin más ciudad, usa Estepona; nombrando otra ciudad, la resuelve bien; y un fallo de conexión se traga sin romper nada. La llamada real a Open-Meteo se ha probado ya en ROCKY, confirmado por José Luis.
Instalación
Solo cambia main.py. Sin dependencias nuevas (usa requests, que ya estaba). Backup del actual, sustituir, reiniciar.
Cómo comprobarlo
Preguntar “¿qué tiempo hace hoy?” (debe responder con el tiempo de Estepona) y “¿qué tiempo hace en Málaga?” (debe responder con el de Málaga). Y de paso, comprobar que la cabecera de la web ya dice “PINSAPA”.
Qué queda pendiente
Con la calculadora y el tiempo ya funcionando, la lista de “herramientas” pequeñas queda abierta para lo que se necesite de verdad, no para acumular por acumular. Ninguna candidata concreta anotada por ahora.

Etiqueta:AIDARAC, cambio de nombre, herramientas de IA, ies monterroso, montesteam, Open-Meteo, PINSAPA



