- Python 100%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| bot | ||
| core | ||
| tests | ||
| .coverage | ||
| .gitignore | ||
| README.md | ||
| requirements.txt | ||
| run_bot.py | ||
Bot de Telegram para interacción con LLM (texto e imágenes)
Este proyecto es un bot de Telegram construido con python-telegram-bot 20.x que permite chatear con modelos de lenguaje (LLM) y, opcionalmente, enviar imágenes para análisis con modelos multimodales. La configuración por usuario (API Key, Base URL, modelo y system prompt) se guarda en SQLite.
Características
- Comandos de configuración por usuario:
/set_api_key,/set_base_url,/set_model,/set_system_prompt,/config_status. - Soporte multimodal: envía una foto y el bot usará el pipeline adecuado.
- Persistencia en SQLite:
data/bot.dbguarda la configuración de cada usuario. - Logging estructurado con
loguru, a consola y abot.log. - Diseño extensible: capa
core/con clientes LLM y unpipelineque selecciona automáticamente el flujo (texto o multimodal). - Sistema de seguridad: módulo
bot/security/con validadores, rate limiting y sanitización de inputs usando patrones GoF (Composite, Strategy).
Requisitos
- Python 3.10+
- Cuenta y API Key del proveedor LLM (por ejemplo, OpenAI-compatible)
- Token de bot de Telegram
Dependencias (archivo requirements.txt):
python-telegram-bot==20.7
python-dotenv==1.0.1
requests==2.31.0
openai
pytest
pytest-asyncio
pytest-mock
loguru
Estructura del proyecto
BOTELEGRAM/
bot/
config.py
database.py
security/
__init__.py
guards.py
sanitizers.py
handlers/
commands.py
messages.py
callbacks.py
main.py
core/
llm_clients.py
pipeline.py
data/
bot.db
tests/
conftest.py
test_guards.py
test_database.py
test_pipeline.py
requirements.txt
README.md
bot.log
Configuración
- Crea un archivo
.enven la raíz del proyecto con al menos:
TELEGRAM_TOKEN=tu_token_de_telegram
# Opcional: nivel de logs (DEBUG, INFO, WARNING, ERROR)
LOGGER_LEVEL=INFO
- Instala dependencias (Windows PowerShell):
python -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -r requirements.txt
- Ejecuta el bot:
# Opción 1: Usar el launcher desde la raíz del proyecto
python run_bot.py
# Opción 2: Ejecutar como módulo
python -m bot.main
# Opción 3: Ejecutar desde el directorio bot (no recomendado)
cd bot
python main.py
Nota: Se recomienda usar python run_bot.py desde la raíz del proyecto para evitar problemas de importación.
El bot iniciará polling y mostrará logs en consola y en bot.log.
Testing
Para ejecutar la suite de pruebas:
pytest -q
Los tests cubren:
- Módulo de seguridad: validación de rate limiting, longitud de mensajes, tamaño de imágenes, filtros de contenido y spam de comandos.
- Base de datos: operaciones CRUD de configuración de usuario.
- Pipeline LLM: selección automática entre clientes de texto y multimodal.
La configuración de tests usa SQLite en memoria y mocks para clientes LLM externos.
Uso en Telegram
Una vez iniciado el bot:
- Envía
/startpara ver la ayuda y el menú. - Envía
/helppara ver modelos recomendados y proveedores compatibles. - Configura paso a paso con
/test_configpara ver qué falta configurar. - Configura tus credenciales y preferencias con los comandos:
/set_api_key <tu_api_key>/set_base_url <https://tu.base.url/v1>/set_model <nombre_modelo>(ej.gpt-4oogpt-4-turbo)/set_system_prompt <mensaje>/config_statuspara ver el estado actual
Ejemplo de configuración completa:
1. /set_api_key sk-1234567890abcdef
2. /set_base_url https://api.openai.com/v1
3. /set_model gpt-4-turbo
4. /test_config (para verificar)
Luego, envía mensajes de texto y/o fotos. Si envías una foto, el bot usará el flujo multimodal. Si no incluyes texto con la foto, el bot usará por defecto: "Describe la imagen".
Nota: Si recibes errores 404, usa /help para ver modelos disponibles y verifica que tu proveedor soporte el modelo seleccionado.
Detalles técnicos
bot/main.py: Inicializa base de datos, registra handlers, configura comandos y arranca el polling.bot/handlers/commands.py: Implementa los comandos de configuración y estado.bot/handlers/messages.py: Orquesta la recepción de texto/fotos, descarga imágenes a temporales seguros y llama alpipeline.bot/handlers/callbacks.py: Maneja botones de interfaz simple (callback queries).bot/database.py: Creadata/bot.dby ofrece helpers para guardar/leer configuración por usuario.core/pipeline.py: Decide si llama a cliente de texto o multimodal según el modelo o si hay imagen.core/llm_clients.py: Clientes basados enopenai(compatible con servidores OpenAI-like) para texto y multimodal.bot/security/guards.py: Implementa validadores de seguridad usando el patrón Composite (CompositeGuard) y Strategy (diferentes tipos de Guard).bot/security/sanitizers.py: Sanitización de texto usando Composite pattern para aplicar múltiples filtros secuencialmente.
Notas sobre proveedores:
- El bot no impone un proveedor específico; usa
OpenAI(api_key, base_url). - Ajusta
/set_base_urlsi usas un endpoint compatible distinto ahttps://api.openai.com/v1. - Asegúrate de elegir un
/set_modelque tu proveedor soporte (p. ej.,gpt-4opara multimodal,gpt-4-turbopara texto).
Variables y base de datos
.env:TELEGRAM_TOKENes obligatorio.LOGGER_LEVELopcional.data/bot.db: SQLite con la tablauser_configque almacenaapi_key,base_url,model_name,system_promptporuser_idde Telegram.- Los logs se escriben en
bot.logcon rotación de 10 MB y retención de 10 días.
Características de seguridad
El bot incluye múltiples capas de protección:
- Rate Limiting: máximo 6 mensajes por usuario en ventana de 10 segundos.
- Validación de contenido: longitud máxima de 4000 caracteres, filtro de lenguaje ofensivo.
- Control de imágenes: tamaño máximo de 5 MB, validación antes de descarga.
- Anti-spam: cooldown de 2 segundos entre comandos del mismo usuario.
- Sanitización: eliminación de caracteres de control y trimming automático.
Solución de problemas
- "TELEGRAM_TOKEN no definido": agrega
TELEGRAM_TOKENal.enven la raíz. - Errores de autenticación LLM: verifica
/set_api_keyy, si usas un servidor compatible, fija/set_base_urlcorrecto. - El modelo no responde a imágenes: asegúrate de usar un modelo multimodal (p. ej.,
gpt-4o) y que el proveedor lo soporte. - Permisos de PowerShell al activar venv: ejecuta PowerShell como administrador o ajusta la ExecutionPolicy temporalmente:
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass - Tests fallan con "ModuleNotFoundError": asegúrate de ejecutar desde la raíz del proyecto y tener
__init__.pyenbot/ycore/.
Desarrollo y contribución
- Clona el repo y crea tu rama.
- Crea un entorno virtual e instala dependencias.
- Ejecuta
python bot/main.pyy prueba con tu bot. - Ejecuta
pytest -qpara verificar que los tests pasen. - Envía PRs con descripciones claras. Mantén el estilo y tipado existente.
Licencia
Este proyecto se distribuye con fines educativos. Ajusta la licencia según tus necesidades.
Patrones de diseño implementados
- Composite:
CompositeGuardyCompositeSanitizerpermiten combinar múltiples validadores/sanitizadores. - Strategy: Diferentes implementaciones de
GuardySanitizerintercambiables. - Chain of Responsibility: Los guards se ejecutan secuencialmente hasta encontrar la primera violación.