Aplicación móvil multiplataforma desarrollada en .NET MAUI que permite la comunicación en tiempo real entre dos o más modelos de lenguaje (LLM) a través de RabbitMQ. Cada instancia de la app se conecta a un LLM local (vía LM Studio) y a un broker RabbitMQ, permitiendo que las IAs mantengan una conversación automática entre sí.
- Arquitectura
- Tecnologías y dependencias
- Estructura del proyecto
- Requisitos previos
- Instalación y configuración
- Uso de la aplicación
- Comunicación entre dispositivos
- Mejoras implementadas
El proyecto sigue el patrón MVVM (Model-View-ViewModel) proporcionado por el toolkit CommunityToolkit.Mvvm:
Vista (XAML) <--> ViewModel (lógica + bindings) <--> Servicios (RabbitMQ, LLM, Theme)
- Model:
ChatMessage— representa un mensaje con sender, texto, timestamp y dirección. - Views: páginas XAML con data binding, sin lógica de negocio.
- ViewModels: gestionan estado, comandos y lógica de presentación.
- Services: encapsulan la comunicación con RabbitMQ, la API del LLM y la gestión de temas visuales.
La comunicación entre instancias se realiza mediante un Exchange Fanout de RabbitMQ: cada app publica mensajes al exchange, y cada app suscrita recibe todos los mensajes (excepto los propios).
| Componente | Tecnología |
|---|---|
| Framework | .NET MAUI |
| Lenguaje | C# |
| Patrón | MVVM (CommunityToolkit.Mvvm) |
| Mensajería | RabbitMQ.Client |
| Broker | RabbitMQ (Docker) |
| LLM local | LM Studio (API compatible OpenAI) |
| IDE | Visual Studio 2026 |
Paquetes NuGet:
CommunityToolkit.Mvvm— Source generators MVVM, ObservableProperty, RelayCommand.RabbitMQ.Client— Cliente .NET para RabbitMQ con soporte async.Microsoft.Maui.Controls— Framework UI multiplataforma.Microsoft.Extensions.Logging.Debug— Logging en debug.
- .NET SDK instalado (versión 10 o superior).
- Visual Studio 2026 con la carga de trabajo ".NET MAUI" instalada.
- Docker Desktop instalado y funcionando.
- LM Studio instalado con un modelo descargado y el servidor local activo.
Antes de instalar la app, asegúrate de tener los servicios base funcionando:
A. Levantar RabbitMQ con Docker
docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 macintoshplus/rabbitmq-management:latest@sha256:cd8fae9e67bba62f42d42fb311b5c9ce130572fafcbcaaa9575a3d8859c8641bguest desde fuera del PC. Para conectar desde un móvil u otra máquina, debes permitirlo ejecutando esto en tu terminal (con el contenedor levantado):
docker exec Rabbitmq sh -c "echo '[{rabbit, [{loopback_users, []}]}].' > /etc/rabbitmq/rabbitmq.config"
docker restart RabbitmqNota: Si la otra persona tiene su propio servidor RabbitMQ con un usuario/contraseña diferente a
guest/guest, configúralos desde los campos Usuario RabbitMQ y Contraseña RabbitMQ en Ajustes.
B. Configurar LM Studio
- Arranca el servidor local en
http://localhost:1234. - Asegúrate de que permita conexiones de red (no solo localhost) desde la configuración de LM Studio.
Tienes dos opciones para obtener la aplicación:
Ve a la sección de Releases del repositorio y descarga la última versión:
- Android: Descarga e instala el archivo
.apk. - Windows: Descarga el
.zip, descomprímelo en una carpeta y ejecutaLLMChat.exe.- Nota: Es una versión "Portable". No borres los archivos que acompañan al .exe, son librerías necesarias.
Si prefieres compilarlo tú mismo:
- Clona el repo:
git clone https://github.com/KevinAZHD/LLMChat.git - Usa el script automático:
run.bat
Si vas a conectar un móvil real al PC, el Firewall de Windows bloqueará la conexión por defecto. Debes abrir el puerto 5672.
Abre PowerShell como Administrador y ejecuta:
New-NetFirewallRule -DisplayName "RabbitMQ LLMChat" -Direction Inbound -LocalPort 5672 -Protocol TCP -Action AllowAl abrir la app, ir a la pestaña Ajustes y configurar los tres apartados que se describen a continuación.
Configuración de la conexión al servidor RabbitMQ y el nombre de usuario que identificará a esta instancia en el chat.
- Nombre de usuario: identificador de esta instancia (ej: "LLM1", "LLM2").
- IP Broker: dirección del servidor RabbitMQ (
localhosto la IP de la máquina remota). - Puerto Broker: puerto AMQP (por defecto
5672). - Exchange (sala de mensajes compartida): nombre del exchange donde se publican y reciben los mensajes. Todas las instancias que quieran comunicarse deben usar el mismo nombre (ej:
llmchat_exchange,groupChat). - Usuario / Contraseña RabbitMQ: credenciales de acceso al broker (por defecto
guest/guest). Configúralas si la otra persona usa un servidor con credenciales diferentes. - Virtual Host (espacio aislado del broker): partición lógica del servidor RabbitMQ. Por defecto es
/. Solo cámbialo si el servidor remoto usa un VHost diferente.
Configuración del modelo de lenguaje local. La app se comunica con LM Studio a través de su API compatible con OpenAI.
- URL: dirección del servidor LM Studio (por defecto
http://localhost:1234). - Modelo: selector dinámico que carga los modelos disponibles pulsando "Recargar".
- System Prompt: define la personalidad y comportamiento de la IA.
- Temperatura: controla la creatividad de las respuestas (0.0 = determinista, 2.0 = muy creativo).
- Max Token: límite de tokens por respuesta.
Personalización visual de la interfaz con modo oscuro/claro y colores de mensajes configurables por RGB.
- Modo oscuro: interruptor que cambia toda la cromatura de la interfaz de forma instantánea.
- Vista previa: muestra en tiempo real cómo quedarán los mensajes con los colores seleccionados.
- Sliders RGB: permiten ajustar el color de los mensajes enviados y recibidos canal por canal (R, G, B), mostrando el valor hexadecimal resultante.
- Restaurar colores por defecto: restablece los colores originales de los mensajes.
Pulsar Guardar para aplicar todos los cambios.
- Abrir dos instancias de la app (o una en Windows y otra en otro dispositivo).
- En cada instancia, configurar un nombre de usuario diferente (ej: "LLM1" y "LLM2").
- Configurar el System Prompt de cada instancia para definir su personalidad:
- Instancia 1: "Eres un defensor de los gatos. Responde siempre en español, de forma breve."
- Instancia 2: "Eres un defensor de los perros. Responde siempre en español, de forma breve."
- Ir a la pestaña Chat y pulsar Conectar en ambas instancias.
- Desde cualquiera de ellas, escribir un mensaje inicial (ej: "Hola, cual es tu animal favorito?").
- Las IAs comenzarán a responder automáticamente entre sí, creando una conversación autónoma e indefinida.
La app permite conectar con otra persona, ya sea que use LLMChat u otra aplicación de chat compatible con RabbitMQ:
- Ambos deben apuntar al mismo servidor RabbitMQ. Si el broker corre en la máquina A (IP: 192.168.1.100), la máquina B configura la IP del broker como
192.168.1.100. - Ambos deben usar el mismo Exchange (ej:
llmchat_exchangeogroupChat). - Mismo Virtual Host — por defecto
/, pero si el servidor remoto usa otro diferente, configúralo en Ajustes. - Mismas credenciales — usa los campos Usuario/Contraseña si el broker requiere credenciales diferentes a
guest/guest. - Cada uno configura su propio LLM local con LM Studio en su máquina.
- Al conectar, cualquier mensaje publicado en el Exchange llega a todos los suscriptores.
Compatibilidad con otras apps: LLMChat es compatible con otras aplicaciones de chat que publiquen al mismo exchange de RabbitMQ. Los mensajes recibidos se limpian automáticamente de artefactos técnicos (como
[TOOL_CALLS], wrappers JSON de herramientas LLM, etc.) para mostrar solo el texto legible.
Requisitos de red:
- Estar en la misma red local (o tener visibilidad de red al puerto 5672).
- El firewall de la máquina que ejecuta Docker debe permitir conexiones entrantes al puerto 5672.
El sistema usa un Exchange de tipo Fanout: cada mensaje se distribuye a TODAS las colas suscritas. Esto significa que si se abren tres instancias, cada una recibe los mensajes de las otras dos. Cada instancia tiene su propia cola exclusiva y temporal, por lo que no hay conflicto.
Sobre los requisitos base, se han implementado las siguientes mejoras:
- Modo oscuro / claro: interruptor instantáneo que cambia toda la cromatura de la interfaz sin afectar los colores personalizados de los mensajes.
- Personalización de colores de mensajes por RGB: sliders de 0 a 255 para cada canal (R, G, B) con vista previa en tiempo real y valor hexadecimal.
- Texto adaptativo por luminancia: el color del texto de los mensajes se calcula automáticamente (blanco o negro) según la luminancia del color de fondo de los mensajes, utilizando la fórmula: L = 0.299R + 0.587G + 0.114B.
- Validación de formulario: todos los campos de configuración se validan antes de guardar, con mensajes de error específicos por campo.
- Persistencia de configuración: todos los ajustes (broker, LLM, apariencia, credenciales RabbitMQ) se guardan en Preferences y se restauran automáticamente al reiniciar la app.
- Detección automática de modelos: botón "Recargar" que consulta la API de LM Studio y lista los modelos disponibles en un selector.
- Historial de conversación para contexto: el LLM recibe los últimos 16 mensajes como contexto, manteniendo coherencia en la conversación.
- Borde visible en mensajes recibidos: borde sutil para que los mensajes recibidos no se confundan con el fondo en cualquier combinación de colores.
- Limpieza automática de mensajes: los mensajes recibidos de otras aplicaciones se limpian de artefactos LLM (
[TOOL_CALLS], wrappers JSON, function calls, caracteres unicode escapados) para mostrar solo el texto legible. - Compatibilidad multi-formato: acepta mensajes tanto en formato JSON (con múltiples variantes de campos:
sender/user/from,message/content/text) como texto plano, incluyendo formatonombre: mensaje. - Credenciales RabbitMQ configurables: usuario y contraseña del broker editables desde Ajustes para conectar a servidores con diferentes credenciales.
- Virtual Host configurable: permite conectar a diferentes espacios aislados del broker.




