OpenSquared Assistant PWA
POC de PWA mobile pour parler a l'assistant depuis un telephone.
Fonctionnalites
- Interface mobile installable sur Android via "Ajouter a l'ecran d'accueil".
- Bouton micro avec transcription Groq Whisper.
- Reponse LLM Groq.
- Lecture audio automatique de la reponse avec une voix francaise douce cote navigateur.
- Envoi d'emails Gmail avec carnet de contacts
contacts.json. - Ajout de contacts par conversation, par exemple :
Ajoute Sophie avec l'adresse sophie@example.com. - Memoire professionnelle SQLite pour clients, projets, taches, notes et depots Git associes.
Configuration locale
cd pwa_assistant
copy .env.example .env
Remplir .env :
GROQ_API_KEY=...
GMAIL_EMAIL=...
GMAIL_PASSWORD=...
APP_SECRET=...
TTS_PROVIDER=browser
CONTACTS_FILE=/root/openbot/data/contacts.json
MEMORY_DB=/root/openbot/data/memory.sqlite
Installer :
C:\Users\baron\AppData\Local\Programs\Python\Python313\python.exe -m pip install -r requirements.txt
Lancer :
C:\Users\baron\AppData\Local\Programs\Python\Python313\python.exe app.py
Puis ouvrir :
http://localhost:8080
Sur telephone, le micro necessite HTTPS sauf cas particulier localhost.
Deploiement VPS Hostinger
Exemple Ubuntu pour le VPS actuel (/root/openbot) :
cd /root
git clone https://gitea.open-squared.tech/admin/openbot.git openbot
cd openbot
python3 -m venv .venv
. .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env
nano .env
Service systemd pour que l'app continue apres fermeture de Putty :
cp deploy/opensquared-assistant.service /etc/systemd/system/opensquared-assistant.service
systemctl daemon-reload
systemctl enable --now opensquared-assistant
Commandes faciles :
systemctl start opensquared-assistant
systemctl stop opensquared-assistant
systemctl restart opensquared-assistant
systemctl status opensquared-assistant
journalctl -u opensquared-assistant -f
Optionnel, installer le raccourci openbot :
install -m 755 deploy/openbot /usr/local/bin/openbot
openbot status
openbot restart
openbot logs
Nginx :
server {
server_name assistant.ton-domaine.com;
location / {
proxy_pass http://172.17.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
HTTPS avec Certbot :
sudo certbot --nginx -d assistant.ton-domaine.com
Installation Android
- Ouvrir l'URL HTTPS dans Chrome Android.
- Menu
.... Ajouter a l'ecran d'accueilouInstaller l'application.- Ouvrir l'icone
Assistant. - Appuyer une fois sur
Demarrerpour lancer le mode mains libres. - Parler naturellement : apres 2 secondes de silence, le message est envoye.
- Appuyer sur
Arreterpour couper l'ecoute continue.
Contacts email
Les contacts sont stockes dans contacts.json en local. Sur le VPS, le service utilise /root/openbot/data/contacts.json pour eviter de modifier les fichiers suivis par Git.
Tu peux les ajouter directement dans l'assistant :
Ajoute Sophie avec l'adresse sophie@example.com
Ensuite tu peux dire :
Envoie un email a Sophie
L'assistant remplacera Sophie par son adresse email.
Memoire professionnelle
Les informations professionnelles sont stockees dans une base SQLite. Sur le VPS, le service utilise :
/root/openbot/data/memory.sqlite
Exemples de phrases :
SAFTCO est un nouveau client, note quelque part que je dois rappeler le directeur.
Note que le projet Portail SAFTCO est associe au client SAFTCO.
Associe le repo /root/openbot/repos/saftco au projet Portail SAFTCO.
Qu'est-ce que tu sais sur SAFTCO ?
La memoire peut contenir des clients, projets, taches, notes et depots Git associes a un projet.
Architecture de la memoire
L'assistant utilise une architecture en deux niveaux :
- les ecritures passent par des actions controlees (
ajouter_client,ajouter_tache,terminer_tache, etc.) ; - les lectures et analyses passent par un routeur LLM qui peut generer une requete SQL readonly sur le schema SQLite.
Ce choix evite de coder une action specifique pour chaque question possible. Par exemple, quel client a le plus de taches ?, quelles sont mes taches a faire ? ou cette tache est pour quel client ? peuvent etre resolus en lisant la base plutot qu'en ajoutant des routes rigides.
Le routeur recoit le dernier message, l'historique recent, le schema de la base et un extrait de la memoire. Il decide entre :
- executer une action d'ecriture autorisee ;
- lancer une lecture SQL readonly ;
- demander une clarification si la cible est ambigue.
Les requetes SQL generees sont limitees a des SELECT et passent par une validation readonly dans memory.py.
Notes
- Groq Orpheus TTS doit etre accepte dans la console Groq pour fonctionner : https://console.groq.com/playground?model=canopylabs%2Forpheus-v1-english
- Par defaut
TTS_PROVIDER=browserutilise la voix francaise du telephone pour eviter l'accent anglais du modele Groq Orpheus. - La PWA privilegie les voix feminines francaises disponibles sur le telephone, avec un debit plus lent et un ton plus doux.
- Pour revenir au TTS Groq, mettre
TTS_PROVIDER=groqdans.env. - La lecture audio automatique depend toujours des regles du navigateur mobile, mais elle marche mieux dans une PWA apres un tap utilisateur que dans Telegram.