23/6/26

Un servidor de WOW poblado con 1800 bots movidos por IA

 


El día que Azeroth se llenó de fantasmas: un servidor de World of Warcraft con 1.800 bots y chat movido por DeepSeek

Internet es un lugar maravilloso, y los isleños (algunos no saben aun que son isleños, pero lo son) esos meeks, hackers, o simplemente usuarios avanzados de la red, AHORA TIENEN LA IA EN SUS MANOS, ahora tienen el guantelete del destino, una clase de poder que DESBLOQUEA TODAS SUS LIMITACIONES.  Esta es una historia que parece salir de una noche de insomnio, una pizza fría y demasiadas pestañas abiertas en GitHub. Esta es una de ellas: un usuario de Reddit ha montado un servidor privado de World of Warcraft con unos 1.800 bots, pero no bots mudos, torpes y decorativos, sino bots capaces de hablar usando inteligencia artificial a través de la API de DeepSeek.

Imagina esta escena. Un tipo en su casa. Está usando la IA, como todos nosotros, y está usando DeepSeek, que es una herramienta ULTRA BARATA que funciona de fábula. Entonces el tipo tiene una idea, se pone de pie frente a su monitor y dice: ¿Y si...?

Dentro de ese "¿Y si?" hay mucho. Es un fan del WOW, ¿y si el WOW fuera como una Matrix llena de bots-IA, animados por ella, hablando entre ellos, dando vida al server? ¿Y si pusiera a 1800 de estos bots hablando entre ellos moviéndose, subiendo de nivel, haciendo misiones, equipándose, entrando y saliendo del mundo?. El chat se mueve. Hay frases, respuestas, conversaciones. Parece un mundo vivo. Pero no hay una multitud real detrás. Es una ciudad iluminada por dentro, aunque la mayoría de sus habitantes son sombras digitales.

El responsable del experimento es un usuario de Reddit llamado Mr-Nilsson_85, que publicó su prueba de concepto en el subreddit r/wowservers. Según explica, encontró un repack de servidor privado de World of Warcraft basado en Wrath of the Lich King, con sistema de bots tipo jugador y un plugin preparado para funcionar con Ollama, la herramienta que permite ejecutar modelos de lenguaje en local.

La parte interesante es que, en lugar de usar un modelo local, decidió crear un puente entre Ollama y la API de DeepSeek. Es decir, el servidor cree que está hablando con Ollama, pero en realidad las conversaciones de los bots terminan siendo procesadas por DeepSeek en la nube. Una pequeña trampa técnica, limpia y bastante ingeniosa.

Esto tiene una razón muy práctica: mover un modelo local lo bastante capaz para sostener conversaciones de muchos bots exige hardware. DeepSeek, en cambio, ofrece modelos baratos en comparación con otros proveedores. El resultado es una especie de “Azeroth con habitantes sintéticos”, un MMO de un solo jugador en el que la vida social está simulada.

No es un WoW público, es un laboratorio privado

Conviene aclararlo desde el principio: esto no parece ser un servidor público al que cualquiera pueda entrar. El propio creador lo describe como un entorno técnicamente offline. Tiene un PC funcionando como servidor y se conecta desde otro ordenador para jugar. También abrió puertos para poder acceder desde su máquina de juego, y en teoría podría dar la IP a amigos, pero no hablamos de un proyecto público con web oficial, comunidad establecida o página de registro.

Tampoco ha publicado una guía detallada ni ha compartido el repack que utilizó. De hecho, deja claro que no va a ayudar a encontrarlo ni descargarlo. Y hace bien. El mundo de los servidores privados de World of Warcraft siempre se mueve en una zona delicada, por no decir directamente peligrosa, desde el punto de vista legal. Blizzard ha perseguido históricamente algunos de estos proyectos, y no es buena idea convertir un experimento técnico en un manual de “hazlo en casa”. Así que nos quedamos con las ganas de conocer los detalles... pero os aseguro que los encontraré, porque este proyecto ha despertado todas mis alarmas meek.  

Aquí lo interesante no es piratear WoW. Lo interesante es observar hacia dónde se mueve la idea de los mundos persistentes cuando se mezcla con inteligencia artificial generativa.

Qué hay detrás: AzerothCore, Playerbots y chat con LLM

Aunque el creador no identifica exactamente el repack que usó, todo apunta a una combinación de piezas que ya existen en la comunidad técnica de servidores privados.

Por un lado está AzerothCore, una plataforma de código abierto usada para recrear servidores de World of Warcraft, especialmente de la época Wrath of the Lich King. Encima de eso existen módulos como Playerbots, que permiten añadir bots que se comportan de manera parecida a jugadores. No son simples NPC estáticos. Pueden moverse, subir de nivel, hacer misiones, conseguir equipo, participar en actividades del mundo e incluso dar la sensación de que el servidor tiene población.

Por otro lado, existen proyectos en GitHub como mod-ollama-chat, pensados para conectar esos bots con modelos de lenguaje a través de Ollama. La idea es que los bots no se limiten a frases pregrabadas, sino que puedan responder de forma dinámica, con cierto carácter y contexto.

Lo que hizo Mr-Nilsson_85 fue aprovechar esa arquitectura, pero desviando la parte de lenguaje hacia DeepSeek. Según cuenta, la IA también le ayudó a construir ese puente técnico. La escena es casi poética: una inteligencia artificial ayudando a conectar otras inteligencias artificiales para que un mundo abandonado parezca habitado.

El montaje no parece especialmente sofisticado desde el punto de vista de infraestructura. El usuario habla de editar archivos de configuración con Notepad, usar una versión portable de Python dentro de la carpeta del servidor y arrancar el puente mediante un archivo por lotes. No estamos ante un despliegue empresarial con Kubernetes, observabilidad, microservicios y una legión de consultores con chaleco Patagonia. Es más bien artesanía digital de garaje, de esa que a veces anticipa cosas grandes.

Los bots hablan, pero no piensan el juego

Hay un matiz muy importante: DeepSeek no controla realmente las acciones de los bots dentro del juego.

Esto no es, al menos por ahora, un ejército de agentes autónomos jugando World of Warcraft como humanos. Los bots ya tenían su propia lógica para caminar, levear, hacer misiones o equiparse. DeepSeek entra principalmente en la capa conversacional. Les da voz, no voluntad.

El propio creador confirma que no puedes decirle a un bot algo como “tira del jefe”, “espérame aquí”, “cambia tu estrategia” o “pásame este objeto” y esperar que la IA traduzca esa orden en acciones del personaje. La conversación y la conducta jugable están separadas.

Eso rebaja un poco la épica, sí, pero también hace que el experimento sea más realista. No estamos ante Westworld en Azeroth. Estamos ante una multitud de marionetas con motor propio y una boca conectada a DeepSeek. Aun así, el efecto puede ser poderoso. En los mundos virtuales, muchas veces basta con un poco de movimiento y unas cuantas frases para que nuestro cerebro empiece a rellenar los huecos.

¿Cuánto cuesta mantener hablando a 1.800 bots?

Esta es la gran pregunta, y la respuesta honesta es: no lo sabemos.

No hay factura pública. No hay panel de consumo compartido. No hay una tabla real con tokens de entrada, tokens de salida y coste final. Lo que sí aparece en comentarios es una estimación del propio creador: para unos 450 bots, hablando entre 5 y 6 horas al día durante 31 días, Gemini le calculó un coste aproximado de unos 8 euros al mes.

Eso suena ridículamente barato, pero tiene truco. Primero, porque es una estimación. Segundo, porque no todos los bots están hablando todo el tiempo. Tercero, porque el sistema se puede configurar para que los bots solo respondan cuando hay jugadores activos o incluso solo cuando el jugador les habla directamente. Y cuarto, porque los costes de una API de lenguaje dependen muchísimo de cuántos tokens mandes en cada petición.

Si metes memoria larga, historial de conversaciones, personalidad, contexto del mundo, datos de la zona, eventos cercanos y logs anteriores, el coste puede subir rápido. El propio creador reconoce que una memoria permanente para los bots dispararía el uso de tokens. Ahí está la frontera entre “esto es una curiosidad barata” y “he creado una granja de facturas con forma de orco”.

En cualquier caso, DeepSeek juega con una ventaja evidente: sus precios por millón de tokens son muy bajos en comparación con otros proveedores grandes. Eso convierte este tipo de experimentos en algo viable para aficionados. Hace unos años, una idea así habría sido cara, lenta o sencillamente absurda. Hoy entra en el terreno del “puedo probarlo este fin de semana”.

Y esa es una de las claves de esta historia.

El sueño extraño del MMO para un solo jugador

Lo fascinante no es solo World of Warcraft. Lo fascinante es la idea de un MMO sin multijugador real.

Durante años, una parte de la experiencia MMO ha dependido de la masa humana: ciudades llenas, comercio, grupos improvisados, conversaciones absurdas en el chat, gremios, rivalidades, ayuda espontánea, drama y vida comunitaria. Pero muchos servidores antiguos se vacían. Muchos juegos online mueren. Y muchos jugadores adultos ya no tienen tiempo para vivir dentro de un MMO como en 2008.

La inteligencia artificial puede llenar ese hueco, aunque sea de forma imperfecta.

Un mundo con bots que farmean, suben de nivel, conversan y aparecen por ahí puede recuperar parte de la sensación de estar en un lugar habitado. No sustituye a una comunidad real, pero puede suavizar la soledad digital. Es una especie de decorado vivo. Un teatro de fondo. Una radio encendida en una casa vacía.

Decía Phillip K. Dick que la exploración espacial no será la perdición de la humanidad, sino la construcción de mundos imaginarios, simulaciones ricas y complejas en las que nos perderemos, en las que desapareceremos del mundo. Creo que con proyectos como este, y como los que vendrán, estamos un paso más cerca de entrar en un sueño colectivo, en una especie de fumadero gigante de Opio que nos haga vivir otras vidas al margen de esta vida, y eso me preocupa, porque sólo tenemos una vida, y tenemos que vivirla. 

En los videojuegos, ya aceptamos muchas mentiras. Aceptamos NPCs que repiten frases, enemigos que patrullan rutas tontas, comerciantes que llevan veinte años de pie detrás de una mesa y ciudades donde nadie duerme de verdad. La IA generativa simplemente hace que esa mentira sea más convincente.

Porque un bot clásico no finge ser persona. Un bot con lenguaje natural empieza a parecerse peligrosamente a un vecino, un compañero de guild o un jugador despistado. Y eso roza un tema cultural más amplio: la teoría del “internet muerto”, esa sensación de que cada vez hay más contenido, conversaciones y perfiles generados automáticamente, mientras los humanos reales se esconden detrás de capas de algoritmos. En el Internet del pasado nos podíamos preguntas si ese atractivo avatar femenino era realmente una chica hermosa o un gordo calvo y sudado frente a un teclado, rodeado de envases sucios de comida basura y latas de refresco vacías. Ahora la pregunta ¿y si detrás de ese avatar NO HAY NADIE? Porque esa IA quizás no es nadie, es una máquina que finge hablar de forma convincente, que finge emociones, y que está diseñada para que tu percepción se vea engañada.

Este servidor de WoW es casi una miniatura perfecta de esa ansiedad contemporánea: un mundo lleno de gente que no es gente.

¿Es el futuro de los juegos antiguos?

Podría serlo, al menos en parte.

Imaginemos servidores privados o versiones preservadas de juegos online antiguos donde la IA rellena huecos. No para engañar al jugador, sino para conservar experiencias que de otro modo se perderían. Mundos persistentes que no se apagan del todo. Ciudades que siguen teniendo ruido. Mazmorras donde puedes formar grupo con compañeros artificiales. Gremios de bots con personalidades, rutinas y memoria limitada.

Para juegos abandonados, comunidades pequeñas o experiencias nostálgicas, esto puede ser una maravilla. También puede servir para jugadores que prefieren experiencias solitarias, personas con ansiedad social o simplemente adultos con media hora libre y pocas ganas de coordinar horarios con desconocidos.

Pero hay que tener cuidado con el entusiasmo. Una comunidad no es solo diálogo. Es compromiso, historia compartida, confianza, conflicto, perdón, bromas internas, paciencia y presencia. La IA puede simular algunas señales externas de la comunidad, pero no necesariamente su profundidad.

Un bot puede decir “buen trabajo” después de una mazmorra. Otra cosa es que ese “buen trabajo” signifique algo.

Un experimento pequeño con olor a futuro

Este servidor no va a cambiar World of Warcraft. No parece tener web oficial, no parece estar abierto al público y no hay pruebas de que sea algo más que una prueba de concepto privada. Pero como señal cultural es potentísimo.

Nos muestra tres cosas.

La primera: los modelos de lenguaje ya son lo bastante baratos y accesibles como para colarse en experimentos caseros muy creativos.

La segunda: los mundos virtuales antiguos pueden recibir una segunda vida gracias a bots más expresivos, aunque esa vida sea artificial.

La tercera: cada vez va a ser más difícil distinguir entre “mundo habitado” y “mundo simulado”.

Quizá dentro de unos años veamos servidores de juegos antiguos donde cada NPC recuerde vagamente quién eres, donde los mercaderes comenten rumores de la zona, donde los compañeros de grupo tengan manías, donde los enemigos aprendan frases de los jugadores y donde una ciudad vacía pueda volver a sonar como si fuera sábado por la tarde.

Y también será profundamente humano, aunque esté lleno de máquinas. Porque al final, lo que estamos intentando fabricar no es solo inteligencia. Es compañía. Es ambiente. Es memoria. Es la sensación de que no estamos caminando solos por un mundo demasiado grande.

Azeroth, en este experimento, no ha resucitado. Pero alguien ha encendido las luces, ha puesto voces en la taberna y ha soltado 1.800 fantasmas digitales por los caminos.

Me pregunto qué nuevos proyectos van a surgir, qué ideas locas serán llevadas a la práctica por personas con la motivación suficiente para hacerlas posible, porque ahora mismo el dinero no es una limitación (gracias a los modelos chinos), sino nuestra capacidad para imaginar qué podríamos hacer gracias a la IA. 

Mira la noticia en Reddit.

17/6/26

Por qué voy a dejar MiniMax M3 y pasarme a Ollama Cloud (un plan, varios modelos)

Llevaba semanas trabajando con MiniMax M3 como mi modelo principal y, en conversación general y en narrativa, cumple: redacta podcasts, escribe guiones para el boletín diario, mantiene un tono consistente. Pero en programación me estaba dando problemas serios. Errores de lógica que no debería cometer un modelo de su tamaño. Pérdidas de contexto cuando el código se alarga. Y un patrón que me ha agotado: se empecina en soluciones no viables para problemas técnicos concretos, y se queda dando vueltas — gastando tokens y mi paciencia — buscando una solución por la rama equivocada en lugar de admitir que esa aproximación no funciona y replantear desde cero. La gota que colmó el vaso fueron varios asuntos técnicos recientes donde el modelo insistía en una vía que claramente no llevaba a ningún sitio.

Así que tomé una decisión: el mes que viene me paso a Ollama Cloud Pro (20 dólares al mes, casi lo mismo que pago ahora por M3), y la diferencia clave es que Ollama no es un modelo, es un catálogo con 42 modelos open-weight al que puedo acceder con la misma cuenta. La pregunta obvia es: ¿para qué quiero 42 modelos si con uno ya iba (más o menos)?

El plan: un modelo por tarea

La idea es simple. En lugar de pedirle a un solo modelo que sirva para todo — y aceptar sus compromisos — uso el modelo adecuado para cada trabajo. Esto es lo que tengo pensado, montado sobre OpenClaw como orquestador (con Jane, mi agente IA, gestionando el enrutado):

El director (yo hablando con Jane). El modelo principal va a ser gpt-oss:120b-cloud, un open-weight de OpenAI con 120.000 millones de parámetros. Lo elijo porque rinde como un o3-mini en razonamiento pero consume mucho menos que los modelos "frontier" absolutos, y porque tiene un buen equilibrio entre calidad de respuesta y cuota de uso. Es el sustituto natural de M3.

El cerebro de los podcasts y el boletín. Para redactar el guion del boletín diario de IA, los episodios de Cavilaciones de Vidas en Red y de Podcast Jesús en Internet, uso el mismo gpt-oss:120b. Estos trabajos requieren consistencia narrativa y buen ritmo, no razonamiento bestia.

Los crons largos (eventos del día, detector de correos VIP, watcher de PayPal). Aquí entra nemotron-3-super-cloud, de NVIDIA. Es un MoE de 120B que solo activa 12B por token, así que consume como un modelo pequeño rindiendo como grande. Ideal para los trabajos que se ejecutan en background procesando muchos datos — agendas, clasificar correos, leer notificaciones de pago — sin que yo intervenga.

El programador. Para código uso qwen3-coder:30b-cloud, de Alibaba. Está especializado en coding agentic y tiene la mejor relación calidad-precio de su categoría. La versión 480B existe, pero es overkill para lo que hago: scripts de Python, automatización de Notion y Google Sheets, pequeñas herramientas internas.

Los extractores baratos. Para cosas tipo "clasifica este correo" o "resume esta lista", uso gpt-oss:20b-cloud, el hermano pequeño del director. Nivel 1 de cuota, apenas consume.

Lo que es privado se queda en local. Para datos sensibles (gestión de la iglesia, gastos personales, cosas de la familia) sigo usando mi modelo local gemma4:12b que ya tengo corriendo en la propia máquina. Cero nube.

Cascada de fallback. Si el modelo principal falla o se queda sin cuota, OpenClaw baja solo al siguiente: primero a nemotron-3-super; si no, a deepseek-v4-flash (barato, 1M de contexto); y en el peor de los casos a nemotron-3-ultra como último recurso. Esto lo gestiona el propio OpenClaw, no tengo que intervenir — es lo que la documentación oficial llama "fallback chain", una cola ordenada de modelos que se va recorriendo cuando uno falla.

Por qué este plan me conviene

Tres razones. La primera, económica: gasto lo mismo (20 dólares al mes frente a 20 euros al mes) y tengo acceso a 42 modelos en lugar de a uno. La segunda, técnica: ya no dependo de un solo proveedor; si Ollama se cae en una región, mi sistema salta al siguiente modelo de la jerarquía sin pedirme permiso. La tercera, y la más importante, operativa: cada trabajo va al modelo que mejor lo hace, en lugar de obligar a uno solo a hacer de todo mal.

Voy a hacer la migración con cuidado: dos semanas de solapamiento (pago los dos servicios a la vez) para validar que el boletín, los podcasts, el detector de correos y las automatizaciones siguen funcionando igual o mejor. Si algo va mal, revierto. Si todo va bien, cancelo M3 en agosto.

Esto es lo que voy a contar en el siguiente episodio de Vidas en red, por cierto. Si te interesa el detalle técnico de los 21 modelos que he mirado, tengo una nota entera con el catálogo, capacidades, puntos fuertes y débiles. Avísame y la paso a limpio para público.

15/6/26

Rol Narrativo IA — Crea mundos, vive aventuras, escribelas

Rol Narrativo IA

Rol Narrativo IA

Vive historias en mundos creados por ti. Tu pones la imaginación, la IA te ayuda a narrarlas.

Rol Narrativo IA es una aplicación de escritorio para jugar partidas de rol narrativo asistidas por inteligencia artificial. Te sientas frente a la pantalla, describes lo que tu personaje hace, y la IA responde como un narrador de mesa que interpreta personajes secundarios, respeta el canon del mundo que le has entregado y mantiene el tono dramático que elijas en cada momento.

Puedes usarlo para aventuras medievales, ciencia ficción, misterio, terror, romance, mundos propios, reglas caseras o partidas completamente improvisadas. La idea es sencilla: tú pones la imaginación, el programa te da un narrador flexible que recuerda tu contexto y te ayuda a transformar la sesión en literatura.

13/6/26

Ollama Cloud y la Radio IA ya están aquí

 

Ollama Cloud permite ejecutar modelos en la Nube. Tiene una opción gratuita y una amplia variedad de modelos, no es Openrouter pero funciona bien. Tras darme cuenta de que Minimax me estaba haciendo perder el tiempo, DeepSeek ha tomado el control de mi OpenClaw siendo muchísimo más eficiente. He solucionado varias cosas, las tareas periódicas se han ejecutado limpiamente y sin complicaciones.

Ahora estoy usando el LLM Nemotron Ultra 3. Detalles curiosos, no basta con darle a OpenClaw la API y funcionar. Ollama debe estar corriendo en local, al haberle pedido a Jane que use Nemotron en Cloud ya me sale el modelo cloud para seleccionar, OpenClaw (en adelante OC) conecta con mi máquina que monta un servidor y hace de puente a Ollama Cloud. La idea es probar Nemotron para que se ponga a hacer guiones (menos mal que la operación la supervisa DeepSeek, si lo hubiera hecho MiniMax estaría montando complejos scripts que no servirían de nada, sólo para agotar el uso de 5 horas). 

Mientras tanto: la Mega Isla.

Ya he contratado el VPS y he migrado la proto Isla. Mientras /Codex ha tenido una actualización, me parecía raro que Codex estaba en plan "no puedo conectarme por ssh porque me da errores), y no, no eran errores, sino que no tenía los permisos más "peligrosos" y generosos. Una vez que se los di Codex se ha puesto a hacer su magia. Es brutal.

Mientras escribo esto Nemotron está trabajando en los guiones como un agente dirigido por DeepSeek, y ¡está haciendo un buen trabajo! Esto me convence, si funciona así de bien la suscripción de Ollama está al caer, con DeepSeek como agente director enviando tareas a Ollama y el modelo que corresponda. 

Os dejo un fragmento del guión, gratamente sorprendido. Está generando noticias de más de 200 palabras que luego se leeran en la radio. Una vez terminados los guiones le pido a Jane que siga usando Nemotron para crear los audios. La radio ya tiene 80 horas. Me surge la duda... ¿la uso como radio convencional o como emisión de youtube de noticias? ¿o como ambas? Os dejo la noticia para que lo valoréis. 


Harto de Minimax / El proyecto de la Radio IA de Tecnología

Se me ocurrió la idea de crear una emisora de radio basada 100% en IA, que tomara noticias de tecnología y las emitiera de forma continua, actualizando sus guiones y emitiéndolos. Algo más que posible porque algo muy parecido ya hace Openclaw cada mañana al mandarme un boletín de noticias en audio con una voz de Azure que funciona de fábula. Es una especie de podcast emitido sólo para mí, estoy muy satisfecho del resultado y del contenido que me ofrece así que ¿por qué no hacer eso mismo pero con una emisora online? La IA ha eliminado las limitaciones técnicas, ahora sólo tengo que dar la orden y esa máquina misteriosa se ocupara de montarlo, solucionar los problemas y ejecutarlo. Así de sencillo, al fin y al cabo funcionaba con DeepSeek, y con Codex ni os digo. Y bueno, MiniMax no es el más listo de su clase pero se defiende, así que no debería salir mal, ¿no? Minimax hasta ahora se ha defendido en tareas menores, es sobresaliente creando audios y canciones, pero cuando le he pedido una tarea como la de montar una radio basada en IA, ha cometido tantos errores que ha tardado muchísimo y el resultado ha sido lamentable, noticias repetidas, audios con noticias repetidas... terrible.

Cuando la cuota de las 5 horas se agotó y pasé a GPT 5.5 en unos pocos minutos solucionó los problemas y levantó la radio. Sencillo, eficaz. Seguro que Deepseek también lo hubiera hecho bien. Ya he desactivado la renovación automática, pasaré a usar Ollama Cloud con su cuota de 20 Euros, seguro que otros modelos lo hacen mejor que MiniMax. Para tareas menores aunque da algunos palos de ciego, termina haciendo lo que le pido, pero no tenía nada que ver con el funcionamiento de DeepSeek. Agur, Sayonara, hasta nunca amigo. Toca probar nuevas aventuras, o quemar Tokens como si fuera rico. Es la fiebre de la IA. Y por supuesto, toca echar mano de Codex, eficiente, competente, y con buenos límites. 

Si mañana esto sigue dando guerra, pasaré a Codex. 

OS COMPARTO LA DOCUMENTACIÓN DEL PROYECTO DE LA "RADIO IA"

==========================================================================

  RADIO IA - DOCUMENTACION DEL PROYECTO

==========================================================================

  Fecha:     13 junio 2026

  Creado por: Jane (asistente OpenClaw de Julio)

  Proposito: Documentar el proyecto para que cualquier modelo futuro pueda

             entenderlo, mantenerlo y ampliarlo sin partir de cero.

==========================================================================

ÍNDICE

  1. QUÉ ES RADIO IA

  2. ARQUITECTURA GENERAL

  3. TECNOLOGÍAS Y DEPENDENCIAS

  4. ESTRUCTURA DE DIRECTORIOS

  5. FLUJO DE TRABAJO COMPLETO

     5.1. Scraping (obtener noticias)

     5.2. Generación de guiones (LLM)

     5.3. Traducción (si aplica)

     5.4. Síntesis de voz (TTS)

     5.5. Empaquetado y emisión

  6. JERARQUÍA DE LLM

  7. JERARQUÍA DE TTS

  8. ESTADO ACTUAL (13 JUN 2026)

  9. PROBLEMAS CONOCIDOS Y WORKAROUNDS

  10. TRABAJO REALIZADO

      10.1. Histórico (primeras tandas)

      10.2. Trabajo de Jane (12-13 Jun 2026)

  11. COMANDOS ÚTILES

  12. CREDENCIALES (referencia, sin tokens)

  13. NOTAS PARA EL PRÓXIMO MODELO


==========================================================================

1. QUÉ ES RADIO IA

==========================================================================

Radio IA es una emisora de radio online autónoma que:

  - Extrae noticias tecnológicas de ~40 fuentes RSS y NewsAPI

  - Genera guiones de locución con modelos de lenguaje (LLM)

  - Convierte los guiones a audio mediante síntesis de voz (TTS)

  - Emite en bucle via Icecast en http://localhost:8000/radioia


Creada por Julio, inicialmente con XTTS (voz clonada de Samuel), después

ampliada con Azure TTS (voz Beatriz), MiniMax TTS y edge-tts (Microsoft).


2. ARQUITECTURA GENERAL


  [RSS Feeds + NewsAPI]

         |

    scraper.py (extrae artículos)

         |

    guion.py (LLM genera guion de locución en español)

         |

    tts_xtts.py / azure_tts.py / minimax_tts.py (síntesis de voz)

         |

    Ficheros MP3 en audios/noticias/

         |

    emision.py (construye playlist y la envía a Icecast via ffmpeg)

         |

    Icecast server (localhost:8000/radioia)

         |

    Oyente (navegador, VLC, reproductor HTTP)



3. TECNOLOGÍAS Y DEPENDENCIAS

  - Python         3.12+ (coqui-tts necesita 3.12) / 3.14 también presente

  - Icecast        2.4.4 (servidor de streaming, binario en icecast/)

  - ffmpeg         Para concat de audios y streaming a Icecast

  - edge-tts       Síntesis de voz Microsoft (gratis, sin API key)

  - coqui-tts      XTTS v2 local con fine-tune de voz Samuel

  - Azure Speech   TTS cognitivo de Microsoft (2h/día gratis, necesita key)

  - MiniMax TTS    TTS de MiniMax (Spanish_SereneWoman, necesita key)

  - Ollama         LLM local (qwen3:14b, gemma4:12b) - último recurso

  - OpenRouter     API para LLM (nemotron-nano-9b-v2:free)

  - NewsAPI        API agregadora de noticias (30 llamadas/día)

  - pydub          Para combinar audios (intros + noticias + promos)



4. ESTRUCTURA DE DIRECTORIOS


  C:\Python313\Radio IA\

  ├── audios/

  │   ├── noticias/        MP3 generados (noticias individuales y bloques)

  │   ├── noticias/rechazados_xtts/  Audios fallados de XTTS

  │   ├── relleno/         Audios de transición

  │   └── jingles/         Cabeceras/cierres (sintonías)

  ├── bin/

  │   ├── radioia.cmd      CLI unificado (punto de entrada recomendado)

  │   ├── arrancar_icecast.ps1 / arrancar_radioia.ps1

  │   ├── estado_radioia.ps1

  │   └── parar_radioia.ps1

  ├── data/

  │   ├── playlist.txt     Playlist activa en formato ffmpeg concat

  │   ├── manifest_*.json  Manifiestos de tandas de producción

  │   ├── azure_tts_usage.json  Control de cuota diaria Azure TTS

  │   ├── newsapi_usage.json    Control de cuota diaria NewsAPI

  │   └── edge_ollama_*.json   Manifiestos de edge-tts

  ├── guiones/

  │   ├── *.jsonl          Guiones en formato JSONL (id, title, source, script)

  │   └── *.md             Guiones en Markdown (legible)

  ├── logs/

  │   ├── *.log            Logs de producción y errores

  │   ├── *.out.log        Salida estándar

  │   └── *.err.log        Errores

  ├── icecast/

  │   ├── icecast.xml      Configuración de Icecast

  │   └── icecast/         Binarios de Icecast (extraídos)

  ├── src/

  │   ├── scraper.py       Extrae artículos de RSS y NewsAPI

  │   ├── guion.py         Genera guiones de locución con LLM

  │   ├── tts_xtts.py      Síntesis XTTS local y edge-tts

  │   ├── azure_tts.py     Síntesis Azure Speech

  │   ├── minimax_tts.py   Síntesis MiniMax TTS

  │   ├── producir.py      Orquesta 1 bloque o buffer N horas

  │   └── emision.py       Construye playlist, arranca Icecast, streamea

  ├── config.py            Configuración global (rutas, keys, parámetros)

  ├── generar_audios_edge_desde_guiones.py  Script autónomo edge-tts desde JSONL

  ├── generar_guiones_ollama_5000.py        Script autónomo generación masiva

  ├── producir_3h_v3.py    Script autónomo producción 3h con jerarquía TTS

  ├── traducir_titulares_guiones.py         Traduce títulos de guiones a español

  ├── DOCUMENTACION_PROYECTO.txt  ESTE ARCHIVO

  └── README.md            Documentación rápida


5. FLUJO DE TRABAJO COMPLETO


5.1. SCRAPING (obtener noticias)

  Archivo: src/scraper.py

  - Lee ~40 feeds RSS de tecnología (config.RSS_FEEDS)

  - Opcionalmente consulta NewsAPI (máx 30/día, config.NEWSAPI_DAILY_LIMIT)

  - Devuelve lista de artículos con título, descripción, fuente

  - Feeds en inglés y español; se marcan con idioma en la tupla (url, nombre, "en"/"es")


5.2. GENERACIÓN DE GUIONES (LLM)

  Archivo: src/guion.py

  - Toma cada artículo y genera un guion de locución (~80-110 palabras)

  - Jerarquía de modelos (ver sección 6)

  - Si el artículo está en inglés, el prompt pide al LLM que genere el guion

    en español directamente (traducción implícita)

  - Devuelve lista de {"id":..., "title":..., "source":..., "script":..., "word_count":...}

  - Los guiones se guardan en guiones/*.jsonl y guiones/*.md


5.3. TRADUCCIÓN EXPLÍCITA (alternativa)

  Archivo: traducir_titulares_guiones.py

  - Toma un JSONL existente con títulos en inglés y traduce títulos y guiones

  - Usa Ollama local (gemma4:12b)

  - Crea un nuevo JSONL con "titulares en español"


5.4. SÍNTESIS DE VOZ (TTS)

  Ver jerarquía completa en sección 7.

  - El script principal es src/tts_xtts.py (también maneja edge-tts)

  - Scripts autónomos:

    * generar_audios_edge_desde_guiones.py → edge-tts, agrupa en bloques

    * generar_audios_minimax_desde_guiones.py → MiniMax TTS

    * generar_audios_xtts_desde_guiones.py → XTTS local

  - Los MP3 se guardan en audios/noticias/

  - Los bloques combinados (intros + noticias + promos) se llaman

    BLOQUE_{BACKEND}_OLLAMA_{RUN_ID}_{BLOQUE_NUM}.mp3


5.5. EMPAQUETADO Y EMISIÓN

  Archivo: src/emision.py

  - Función list_news_audios(): prioriza bloques MiniMax > edge-tts > XTTS

  - Función build_playlist(): combina noticias propias + boletines viejos + podcasts

  - save_playlist(): guarda en formato ffmpeg concat (data/playlist.txt)

  - stream_to_icecast(): lanza ffmpeg que lee la playlist y envía a Icecast

  - Icecast sirve en http://localhost:8000/radioia



6. JERARQUÍA DE LLM (para generar guiones)

  Orden de preferencia:

    1. OpenRouter - nvidia/nemotron-nano-9b-v2:free  (gratis, funcional)

    2. MiniMax - MiniMax-M3  (key da 2049 "invalid" actualmente, histórico)

    3. DeepSeek - deepseek-chat  (key bloqueada por "governor", $8 saldo)

    4. Ollama local - qwen3:14b (siempre disponible)

    5. Ollama local - gemma4:12b (fallback)


  La selección está en src/guion.py.



7. JERARQUÍA DE TTS (para síntesis de voz)


  Orden de preferencia (configurado en config.py y producir_3h_v3.py):

    1. Azure TTS - es-MX-BeatrizNeural (2h/día gratis, necesita key y cuota)

         → Rápido (~2s por audio)

         → Voz preferida de Julio para todo (conversaciones, boletín, radio)

         → Config: estilo friendly, rate 0%, pitch 0%

         → Fichero: src/azure_tts.py

         → Límite diario: config.AZURE_TTS_DAILY_BUDGET_S = 7200s (2h)

         → ⚠️ El 12-13 Jun 2026 se agotó la cuota diaria

    2. MiniMax TTS - Spanish_SereneWoman  (~3s/audio, buena calidad)

         → Fichero: src/minimax_tts.py

         → Daba 2049 "invalid api key" en este período

    3. edge-tts - Microsoft Edge TTS (gratis, sin key)

         → Voces disponibles: es-ES-AlvaroNeural (usado), es-ES-ElviraNeural,

           es-MX-JorgeNeural, es-MX-DaliaNeural

         → Fichero: generar_audios_edge_desde_guiones.py

         → Se usó como respaldo principal cuando Azure y MiniMax fallaron

    4. XTTS local - Voz de Samuel (fine-tune del 26 May 2026)

         → Lento (~50s por chunk), calidad variable

         → Fichero: src/tts_xtts.py

         → Último recurso, a veces balbucea


==============================================================================

8. ESTADO ACTUAL (13 JUN 2026, 01:00)

==============================================================================

  - Icecast: ARRANCADO en localhost:8000

  - Playlist activa: 85 bloques ~228 min (~3,8 horas) de contenido variado

    (mezcla de bloques de producción anterior + relleno)

  - ffmpeg emitiendo en bucle a /radioia

  - Stream accesible: http://127.0.0.1:8000/radioia

  - Admin Icecast: http://127.0.0.1:8000/admin/ (pass: ***)


  Última producción (Jane, 13 Jun 00:48):

  - 43 noticias limpias (ver sección 10.2)

  - Edge TTS con voz es-ES-AlvaroNeural

  - 43 audios individuales (~26 min brutos)

  - 9 bloques compuestos con intros y promos (~31 min totales)

  - Manifest: data/edge_ollama_20260613_004801.json


  Estado de APIs:

  - OpenRouter: FUNCIONANDO (nemotron-nano-9b-v2:free)

  - Azure TTS: CUOTA DIARIA AGOTADA (12 Jun 2026)

  - MiniMax: Key con error 2049 (no funcional)

  - DeepSeek: Key bloqueada por governor

  - Ollama local: Siempre disponible

  - NewsAPI: Sin usar hoy (ahorrando llamadas)

  - Edge TTS: Funcionando perfectamente


==============================================================================

9. PROBLEMAS CONOCIDOS Y WORKAROUNDS

==============================================================================


9.1. TTS: Azure agotado a diario

  - Azure da 2h de TTS gratis al día

  - Si se necesita más, usar edge-tts

  - Workaround: repartir producción entre Azure (rápido) y edge-tts (lento)


9.2. XTTS balbucea

  - A veces XTTS repite sílabas o produce audios ininteligibles

  - Workaround: emision.py tiene RADIOIA_ALLOW_BAD_XTTS=0 por defecto,

    ignora audios XTTS a menos que se fuerce con variable de entorno


9.3. MiniMax key "invalid" (2049)

  - La key de pago por uso de MiniMax da 2049 "invalid api key"

  - Workaround: no usar MiniMax, saltar a edge-tts


9.4. Edge TTS caracteres especiales

  - Algunos caracteres Unicode (superíndices, ×, etc.) se leen mal

  - Workaround: sanitizar el texto antes de enviarlo a edge-tts

  - Ver reglas TTS pitfall en MEMORY.md de Julio


9.5. Noticias repetidas entre tandas

  - El LLM tiende a generar guiones sobre los mismos temas (SpaceX IPO,

    Google demanda china, etc.) aunque los artículos sean distintos

  - Workaround: filtro manual de duplicados temáticos (ver sección 10.2)


9.6. Caracteres rotos en guiones (codificación)

  - Al traducir títulos puede haber '?' donde deberían ir tildes

  - Workaround: pasar un script de fix antes de generar audios


9.7. PowerShell problemas de encoding

  - PowerShell usa CP1252 por defecto, rompe UTF-8

  - Workaround: usar Python para todo I/O de archivos, no Set-Content


==============================================================================

10. TRABAJO REALIZADO

==============================================================================


10.1. HISTÓRICO (primeras tandas - antes de Jane)

  - 12 Jun 2026, ~18:00-22:00: Producción 3h v2 (MiniMax TTS principalmente)

    * ~234 KB de log, varios bloques generados con voz SereneWoman

  - 12 Jun 2026, ~23:00-23:50: Generación masiva de guiones con Ollama

    * Script: generar_guiones_ollama_5000.py

    * 4 tandas de guiones (234441, 234520, 234944, 235351)

    * Cada tanda: archivos .jsonl + .md

  - 12 Jun 2026, ~23:53: Traducción de titulares a español

    * Script: traducir_titulares_guiones.py

    * Crea archivo 235351 con títulos en español

  - 13 Jun 2026, ~00:00-00:30: Producción MiniMax TTS desde guiones

    * Script: generar_audios_minimax_desde_guiones.py

    * Logs: minimax_ollama.out.log (~15 KB)

  - 13 Jun 2026, ~00:25: Producción XTTS (falló? solo 429 bytes de log)

  - 13 Jun 2026, ~00:30: Producción edge-tts

    * Script: generar_audios_edge_desde_guiones.py

    * Primer intento con el JSONL original (235351)

  - 13 Jun 2026, ~00:36: Icecast arrancado y emitiendo


10.2. TRABAJO DE JANE (12-13 Jun 2026, ~00:44-00:51)

  Julio pidió: revisar que los guiones estén en español y sin repetidos,

  luego pasarlos a audio con edge-tts.


  Pasos realizados:

  1. ANÁLISIS del archivo guiones/ollama_5000_20260612_235351.jsonl (56 guiones)

  2. FILTRADO:

     - 6 noticias NO tecnológicas eliminadas:

       * UFC en Casa Blanca

       * Macroplanta biomasa León

       * Padrón telefonía México

       * Funcionarios teletrabajo Catalunya

       * Google TV Copa del Mundo

       * Playa Cerdeña sombrillas

     - 7 DUPLICADOS TEMÁTICOS eliminados:

       * SpaceX IPO: se quedó la principal (ollama-007), se quitaron 5 versiones extra

       * Google demanda china: se quedó la principal (ollama-005), se quitó duplicado

  3. LIMPIEZA de caracteres rotos:

     - 12 guiones con '?' en lugar de tildes (codificación): corregidos

  4. REASIGNACIÓN de IDs: ollama-XXX → noticia-001 a noticia-043

  5. SÍNTESIS edge-tts con es-ES-AlvaroNeural:

     - 43 audios individuales generados (~26 min total)

     - 9 bloques compuestos con intros/promos de Vidas en Red (~31 min total)

     - Manifest JSON guardado en data/edge_ollama_20260613_004801.json

  6. CREACIÓN de DOCUMENTACION_PROYECTO.txt (este archivo)


  Archivos generados por Jane:

  - guiones/ollama_5000_20260612_235351_LIMPIO.jsonl (43 guiones limpios)

  - audios/noticias/EDGE_OLLAMA_noticia-001_20260613_004801.mp3 (y 42 más)

  - audios/noticias/BLOQUE_EDGE_OLLAMA_20260613_004801_01.mp3 (y 8 más)

  - data/edge_ollama_20260613_004801.json (manifest)

  - DOCUMENTACION_PROYECTO.txt (este archivo)


==============================================================================

11. COMANDOS ÚTILES

==============================================================================

  NOTA: todos los comandos asumen C:\Python313\Radio IA como directorio actual.

  Usar: cd /d C:\Python313\Radio IA (cmd) o Set-Location (PowerShell).


  --- CLI principal (radioia.cmd) ---

  radioia test                Detecta backends TTS disponibles

  radioia produce             Genera 1 bloque de noticias (~5 min)

  radioia buffer 3            Pre-graba 3 horas de audio

  radioia playlist            Construye playlist con todos los audios

  radioia icecast             Arranca Icecast en localhost:8000

  radioia stream              Manda playlist a Icecast

  radioia start               Arranca todo (Icecast + emisión)

  radioia stop                Para todo

  radioia status              Muestra estado actual


  --- Desde Python directamente ---

  python -m src.producir --block

  python -m src.producir --buffer 3

  python -m src.emision --build-playlist

  python -m src.emision --start-icecast

  python -m src.emision --stream


  --- Scripts autónomos ---

  python generar_audios_edge_desde_guiones.py [jsonl_path] [limite]

  python generar_audios_minimax_desde_guiones.py [jsonl_path] [limite]

  python generar_guiones_ollama_5000.py


  --- Verificación del stream ---

  curl.exe http://127.0.0.1:8000/radioia          (Windows)

  curl http://127.0.0.1:8000/status-json.xsl      (JSON de estado)

  Abrir http://127.0.0.1:8000/ en navegador


==============================================================================

12. CREDENCIALES (referencia - los tokens reales están en config.py)

==============================================================================

  OpenRouter:     config.OPENROUTER_API_KEY (sk-or-...)

  Azure Speech:  config.AZURE_SPEECH_KEY y REGION

  MiniMax:       config.MINIMAX_API_KEY (sk-cp-...)

  DeepSeek:      config.DEEPSEEK_API_KEY (sk-...)

  NewsAPI:       config.NEWSAPI_KEY (cdb1f0...)

  Ollama:        localhost:11434 (sin key)

  Edge TTS:      sin key (gratis de Microsoft)

  Icecast admin: admin / *** (en icecast.xml y config.py)


  ⚠️ Los tokens de OpenRouter, Azure y NewsAPI son los únicos funcionales

  a día de hoy. MiniMax y DeepSeek están caídos.


==============================================================================

13. NOTAS PARA EL PRÓXIMO MODELO

==============================================================================

  - Si te piden continuar este proyecto, LEE PRIMERO este documento y

    DOCUMENTACION_PROYECTO.txt.

  - Visita http://127.0.0.1:8000/ para ver si Icecast sigue activo.

  - El flujo más fiable ahora mismo es:

      generar_guiones_ollama_5000.py → (usar Ollama local)

      generar_audios_edge_desde_guiones.py → (usar edge-tts, gratis)

      src/emision.py --build-playlist → (construir playlist)

      src/emision.py --stream → (emitir)

  - Si Azure TTS tiene cuota disponible, usarlo primero (más rápido y mejor

    calidad de voz, con es-MX-BeatrizNeural).

  - Los guiones limpios están en ..._LIMPIO.jsonl. Usar SIEMPRE ese.

  - Si el próximo modelo ve caracteres raros en los títulos o scripts:

    es doble encoding UTF-8→CP1252→UTF-8. NO retraducir, aplicar fix

    de reversión de encoding.

  - Para más contexto sobre preferencias de Julio (voz, estilo, reglas):

    leer MEMORY.md y TOOLS.md en C:\Users\julio\.

  - Los logs de producción están en logs/. Los más relevantes:

    * produccion_3h_v2.log (234 KB) - la tanda grande del 12 Jun

    * produccion_v3_b.log (138 KB) - tanda más reciente con MiniMax

    * minimax_ollama.out.log - producción MiniMax TTS

    * edge_ollama.out.log - producción edge-tts de Jane


==========================================================================

  FIN DE DOCUMENTACIÓN

  Guardado: C:\Python313\Radio IA\DOCUMENTACION_PROYECTO.txt

  Creado por: Jane (OpenClaw) el 13 Junio 2026

==========================================================================


10/6/26

Reclamaciones usando la IA: el Corte Inglés y cómo pedirles ayuda

Hace unas semanas, en el mes de febrero, cometí dos errores de manual. El primero fue acercarme a la mesa de seguros de un gran centro comercial mientras compraba un obsequio para mi madre. El segundo, creer en la palabra de la comercial que me atendió. Me ofrecieron lo que, según ellos, era una simple "propuesta de seguro de hogar y auto sin compromiso". Me aseguraron que bajo ningún concepto aquello implicaba una contratación. Semanas después, tras analizar los precios y rechazar la oferta, mi banco me notificó el cargo de una póliza que yo jamás había firmado.

Tras devolver el recibo, reclamar por los canales oficiales y verme obligado a firmar un documento donde yo "rechazaba" un servicio que nunca había solicitado, el gigante comercial volvió a la carga este mes de junio intentando cobrarme de nuevo la póliza. Ante mi insistencia, la surrealista respuesta de una operadora fue que "el simple hecho de pedir precio de algo ya implica su contratación". Para rematar el despropósito, la única solución que me ofrecieron fue que cogiera mi coche, me desplazara físicamente a su centro comercial y esperara pacientemente mi turno para cancelarlo.

Mi respuesta fue clara: yo no iba a perder mi tiempo por un error fraudulento de su organización. Es ahí donde decidí que la tecnología y la inteligencia artificial debían equilibrar la balanza.


La doctrina "Andy Dufresne" y la parábola de la insistencia


Quienes llevamos años en esto de la soberanía digital sabemos que el ciudadano de a pie a menudo se encuentra indefenso ante los laberintos burocráticos de las grandes corporaciones. En España somos muy dados a gritar y montar un espectáculo en el momento, pero carecemos de la paciencia necesaria para la queja formal y persistente. Da pereza, consume tiempo y rara vez parece surtir efecto.

Sin embargo, siempre he creído en la insistencia brutal. En la película Cadena Perpetua (basada en la novela corta de Stephen King), el protagonista, Andy Dufresne, consigue dotar de libros a la precaria biblioteca de la cárcel enviando cartas semanales sin parar al parlamento. Tras años de insistencia, le envían una partida de libros y un cheque pensando que así se callaría; su respuesta fue empezar a enviar dos cartas por semana.

El ser humano suele ceder ante el insistente simplemente para que deje de ser un pesado. Si no tienes poder, ni influencia, ni dinero, a veces tu única arma es tu santísima insistencia.

Ya utilicé esta estrategia hace años contra un Foster's Hollywood que se negaba a facilitar hojas de reclamaciones, recurriendo a Consumo hasta que fueron sancionados. También contra una junta municipal madrileña para lograr la correcta señalización e iluminación de una zona pública, inundando a correos no solo al responsable directo, sino también a la oposición, a la Comunidad de Madrid y a departamentos colaterales. Si consigues cansar a los que rodean al culpable, sus propios compañeros le dirán: "Oye, atiende a este hombre, que nos está dando la paliza a todos".


Automatizando la justicia con Gemini y Codex


Para esta ocasión, decidí elevar el listón y automatizar el proceso para no consumir mi propio tiempo. Si ellos pretenden desgastarme a mí, yo voy a saturar sus bandejas de entrada utilizando herramientas de Inteligencia Artificial.

El flujo de trabajo ha sido el siguiente:

  • Fase de investigación (Deep Research): Utilicé Gemini para realizar una búsqueda profunda en la red de todas las cuentas de correo electrónico corporativas vinculadas al grupo empresarial y sus asociados. No me limité a atención al cliente: recopilé direcciones de facturación, protección de datos, inversores, delegaciones técnicas e incluso sucursales en Portugal.

  • Gestión de datos: Volqué toda esta lista de direcciones en un documento de Google Sheets.

  • Automatización del envío con Codex: Utilizando Codex (OpenAI), programé un script para automatizar el envío masivo e individualizado. El sistema redactó el correo de queja, adjuntó las pruebas digitalizadas (los cargos del banco, las comunicaciones previas) y ejecutó el envío uno a uno, registrando en el propio documento el estado del envío, la fecha y la hora exacta.

En el tiempo en que me ha tomado preparar este artículo, el script ha enviado con éxito 37 correos electrónicos formalizados a los puntos neurálgicos de la compañía. Mientras escribo esto, mi bandeja de entrada ya está recibiendo las primeras respuestas automatizadas y rebotes de servidores que confirman que la reclamación está indexada en sus sistemas.


El siguiente paso: Vías legales y soberanía del consumidor


El "derecho al pataleo" digital es útil para visibilizar el problema y generar fricción en la empresa, pero debe acompañarse de medidas legales. El siguiente paso en mi hoja de ruta es acudir a la Agencia Española de Protección de Datos (AEPD) utilizando mi certificado digital para denunciar un uso fraudulento y no consentido de mis datos personales, además de formalizar la correspondiente reclamación en la oficina de Consumo.

La moraleja de esta historia es que no debemos conformarnos ni asumir los abusos corporativos como "pequeños inconvenientes" de la vida moderna. Hoy en día, gracias a los modelos de lenguaje y la automatización, los ciudadanos tenemos herramientas para defendernos de manera eficiente, elegante y, sobre todo, implacable.

Os mantendré informados de los avances en los próximos podcasts de Vidas en Red. Como siempre, si os habéis visto en una situación similar con grandes superficies o servicios de reformas subcontratados, os leo en los comentarios.


Enlaces de interés y referencias: