| --- |
| title: Hilal Ai Telegram Bot |
| emoji: 🤖 |
| colorFrom: blue |
| colorTo: purple |
| sdk: docker |
| app_port: 7860 |
| pinned: false |
| --- |
| |
| # Hilal Ai — Bot Telegram hébergé sur Hugging Face Spaces (gratuit) |
|
|
| Ce Space fait tourner en continu un bot Telegram propulsé par un modèle |
| Transformer décodeur (style GPT) entraîné from scratch au niveau caractère. |
|
|
| ## ⚠️ Comprendre les limites du tier gratuit AVANT de déployer |
|
|
| Le tier **CPU Basic** de HF Spaces est gratuit mais se met en veille après |
| ~48h sans "visite" sur la page web du Space. Un bot Telegram en polling n'a |
| pas de visiteurs web naturellement, donc ce repo inclut : |
| - un petit serveur Flask (`app.py`) qui répond sur `/` et `/ping` |
| - des instructions ci-dessous pour qu'un service externe gratuit (UptimeRobot |
| ou GitHub Actions) ping cette URL régulièrement et empêche la mise en veille |
|
|
| C'est une solution **bricolée mais fonctionnelle**. Elle n'est pas garantie à |
| 100% par Hugging Face (ce n'est pas un usage "officiellement prévu" du tier |
| gratuit) — si tu veux une garantie de disponibilité totale, il faudra upgrader |
| le hardware du Space (~9$/mois) qui élimine la mise en veille. |
|
|
| ## Fichiers du repo |
|
|
| ``` |
| . |
| ├── Dockerfile # image Docker du Space (SDK: docker) |
| ├── app.py # serveur web de ping + lance bot.py dans un thread |
| ├── bot.py # logique du bot Telegram |
| ├── model.py # architecture MiniGPT + tokenizer char-level |
| ├── requirements.txt |
| ├── .gitattributes # config Git LFS pour model.pt |
| ├── model.pt # TES poids entraînés (à uploader, voir ci-dessous) |
| └── vocab.json # TON vocabulaire char-level (voir ci-dessous) |
| ``` |
|
|
| ## ⚠️ vocab.json est OBLIGATOIRE pour des réponses cohérentes |
|
|
| Le tokenizer char-level a besoin du mapping exact caractère→indice utilisé |
| pendant l'entraînement sur Colab. Sans lui, le modèle se chargera sans |
| erreur mais générera des réponses incohérentes (les embeddings ne |
| correspondront pas aux bons caractères). |
|
|
| Si tu as encore accès à ton notebook Colab ou ton corpus d'entraînement : |
| ```python |
| import json |
| chars = sorted(list(set(text))) # `text` = ton corpus d'entraînement original |
| with open("vocab.json", "w", encoding="utf-8") as f: |
| json.dump({"chars": chars}, f, ensure_ascii=False) |
| ``` |
|
|
| ## Étape 1 — Créer le Space sur Hugging Face |
|
|
| 1. Va sur https://huggingface.co/new-space (tu es déjà connecté à ton compte) |
| 2. Choisis un nom (ex: `hilal-ai-bot`) |
| 3. SDK : sélectionne **Docker** (pas Gradio) |
| 4. Visibilité : Public ou Private selon ta préférence |
| 5. Clique sur "Create Space" |
|
|
| ## Étape 2 — Ajouter le token Telegram comme secret |
|
|
| Dans la page de ton Space : **Settings → Repository secrets → New secret** |
| - Nom : `TELEGRAM_BOT_TOKEN` |
| - Valeur : le token obtenu via @BotFather sur Telegram |
|
|
| Ne mets jamais ce token directement dans le code ou dans un fichier commité. |
|
|
| ## Étape 3 — Pousser le code sur le Space |
|
|
| Hugging Face Spaces fonctionne comme un repo Git classique. |
|
|
| ```bash |
| # Installer git-lfs si pas déjà fait (pour model.pt) |
| git lfs install |
| |
| # Cloner le repo vide de ton Space (remplace USERNAME et SPACE_NAME) |
| git clone https://huggingface.co/spaces/USERNAME/SPACE_NAME |
| cd SPACE_NAME |
| |
| # Copier tous les fichiers de ce dossier dedans : |
| # Dockerfile, app.py, bot.py, model.py, requirements.txt, .gitattributes, |
| # model.pt, vocab.json |
| |
| git lfs track "*.pt" |
| git add .gitattributes |
| git add . |
| git commit -m "Déploiement initial Hilal Ai" |
| git push |
| ``` |
|
|
| HF va automatiquement builder l'image Docker. Tu peux suivre les logs de |
| build et d'exécution dans l'onglet **Logs** de ton Space. |
|
|
| ## Étape 4 — Vérifier que le bot tourne |
|
|
| 1. Va sur l'URL de ton Space : `https://huggingface.co/spaces/USERNAME/SPACE_NAME` |
| 2. L'app Flask doit répondre avec `{"bot_started": true, ...}` sur la page |
| 3. Sur Telegram, cherche ton bot et envoie `/start` |
|
|
| ## Étape 5 — Empêcher la mise en veille (keep-alive externe) |
|
|
| L'URL publique de ton Space (format direct, sans iframe) est généralement : |
| ``` |
| https://USERNAME-SPACE_NAME.hf.space/ping |
| ``` |
|
|
| ### Option A — UptimeRobot (recommandé, zéro code) |
| 1. Crée un compte gratuit sur https://uptimerobot.com |
| 2. Ajoute un nouveau monitor de type "HTTP(s)" |
| 3. URL : `https://USERNAME-SPACE_NAME.hf.space/ping` |
| 4. Intervalle : 30 minutes (largement suffisant pour rester sous 48h) |
|
|
| ### Option B — GitHub Actions (si tu préfères tout garder versionné) |
| Crée `.github/workflows/keep-alive.yml` dans un repo GitHub que tu contrôles : |
|
|
| ```yaml |
| name: Keep Hilal Ai Space Alive |
| on: |
| schedule: |
| - cron: '0 */6 * * *' # toutes les 6 heures |
| workflow_dispatch: |
| jobs: |
| ping: |
| runs-on: ubuntu-latest |
| steps: |
| - name: Ping Space |
| run: curl -f https://USERNAME-SPACE_NAME.hf.space/ping |
| ``` |
|
|
| ## Variables d'environnement disponibles (Secrets ou Variables du Space) |
|
|
| | Variable | Défaut | Description | |
| |----------------------|----------------|-----------------------------------------------| |
| | TELEGRAM_BOT_TOKEN | (obligatoire) | Token du bot Telegram | |
| | MODEL_PATH | model.pt | Chemin vers les poids | |
| | VOCAB_PATH | vocab.json | Chemin vers le vocabulaire char-level | |
| | DEVICE | cpu (auto) | "cpu" (les Spaces gratuits n'ont pas de GPU) | |
| | MAX_NEW_TOKENS | 200 | Nombre max de caractères générés par réponse | |
| | TEMPERATURE | 0.7 | Température de sampling | |
| | PORT | 7860 | Port du serveur Flask (imposé par HF Spaces) | |
|
|
| ## Diagnostiquer un problème |
|
|
| - **Le build Docker échoue** → onglet "Logs" du Space, section "Build logs" |
| - **Le bot ne répond pas sur Telegram mais le Space tourne** → vérifie les |
| "Container logs" pour une erreur de chargement du modèle ou de token manquant |
| - **Page d'accueil affiche `bot_started: false`** → le thread du bot a |
| crashé au démarrage (vérifie `model.pt`/`vocab.json` présents et valides) |
| |