visiOS est un agent IA local capable de piloter un environnement de bureau Linux conteneurisé via la vision. Ce MVP combine un backend Docker, un agent de vision basé sur Ollama et une interface Streamlit pour orchestrer les interactions.
- app.py : interface Streamlit (mode large) affichant l'iframe noVNC, un chat et les logs.
- backend/container_manager.py : classe
SandboxManagerpour démarrer/arrêter le conteneurtutanka01/agentic:osbase, capturer des captures d'écran et injecter des actions viaxdotool. - backend/vision_agent.py : classe
VisionAgentqui envoie la capture d'écran et le prompt utilisateur à Ollama (qwen2.5-vl) et renvoie l'action (clic ou saisie) à exécuter.
- Python 3.10+
- Docker en local + image
tutanka01/agentic:osbase(docker pull tutanka01/agentic:osbase). - Ollama installé et le modèle multimodal
qwen2.5-vltéléchargé :ollama pull qwen2.5-vl ollama serve # si ce n'est pas déjà lancé - Dépendances Python :
pip install -r requirements.txt
Ajoutez un fichier .env à la racine pour personnaliser l'environnement sans modifier le code :
# Paramètres conteneur
VISIOS_SANDBOX_IMAGE=tutanka01/agentic:osbase
VISIOS_SANDBOX_NAME=visios-sandbox
VISIOS_SANDBOX_PORT=6901
VISIOS_SANDBOX_WIDTH=1600
VISIOS_SANDBOX_HEIGHT=900
# Endpoints et modèles IA
VISIOS_OLLAMA_URL=http://localhost:11434
VISIOS_OLLAMA_MODEL=qwen2.5-vl
VISIOS_OLLAMA_TEMPERATURE=0.1
VISIOS_OLLAMA_TIMEOUT=120
VISIOS_API_MODE=ollama # ou "openai" pour LM Studio / API compatibles OpenAI
VISIOS_OPENAI_ENDPOINT=responses # valeurs possibles: responses, chat_completions, completions
VISIOS_AGENT_MAX_STEPS=3
VISIOS_ACTION_DELAY=1.0 # secondes entre chaque action de l'agent
VISIOS_REPEAT_TOLERANCE=2 # nombre de répétitions identiques autorisées avant arrêt
VISIOS_INPUT_BACKEND=xdotool # ou "vncdotool"
VISIOS_VNC_HOST=127.0.0.1
VISIOS_VNC_PORT=5901
Ajustez `VISIOS_AGENT_MAX_STEPS`, `VISIOS_ACTION_DELAY` et `VISIOS_REPEAT_TOLERANCE` pour contrôler le nombre d'actions consécutives effectuées par l'agent, le délai entre deux actions et le seuil avant de considérer que le modèle boucle.
# Interface
VISIOS_IFRAME_URL=http://localhost:6901/vnc.html
Tous les paramètres sont optionnels : si une clé est absente, la valeur par défaut indiquée ci-dessus est utilisée. VISIOS_API_MODE=openai permet de cibler LM Studio ou toute API compatible OpenAI ; utilisez VISIOS_OPENAI_ENDPOINT=chat_completions pour les serveurs qui implémentent principalement /v1/chat/completions (comme LM Studio) ou responses pour l'API /v1/responses. Ajustez VISIOS_AGENT_MAX_STEPS et VISIOS_ACTION_DELAY pour contrôler le nombre d'actions consécutives effectuées par l'agent et le délai entre deux actions.
- Lancez Streamlit :
streamlit run app.py
- Dans l'interface web :
- Cliquez sur Start Sandbox pour démarrer le conteneur (le port noVNC interne est exposé sur
localhost:6901). - La colonne de gauche affiche l'iframe
http://localhost:6901/vnc.htmlpermettant de visualiser le bureau distant. - Si vous préférez lancer manuellement le bureau avant Streamlit, utilisez :
(dans ce cas, vous pouvez renseigner
docker run -d -p 6901:6901 --name visios-desktop tutanka01/agentic:osbase
VISIOS_SANDBOX_NAME=visios-desktoppour que l'application se connecte au conteneur existant). - La colonne de droite contient le chat et les logs d'exécution.
- Cliquez sur Start Sandbox pour démarrer le conteneur (le port noVNC interne est exposé sur
- Utilisez le champ de chat pour décrire l'action souhaitée (ex : « ouvre le navigateur et va sur example.com »). Le système :
- prend une capture du bureau,
- interroge l'agent de vision via Ollama,
- convertit la réponse en clic ou saisie via
xdotooldans le conteneur.
- Utilisez le bouton Stop Sandbox dans Streamlit ou arrêtez manuellement :
docker stop visios-sandbox && docker rm visios-sandbox - Pour arrêter Streamlit, stoppez le processus (
Ctrl+C).
- Les captures d'écran nécessitent qu'au moins un des outils suivants soit présent dans l'image :
import(ImageMagick),xfce4-screenshooterouxwd + convert. xdotooldoit être disponible dans le conteneur (présent dans l'image cible).- Si vous préférez piloter l'affichage via
vncdotool, définissezVISIOS_INPUT_BACKEND=vncdotoolet exposez le serveur VNC (127.0.0.1:5901 par défaut). - Les clics sont recalibrés à chaque action via
xdotool getdisplaygeometry, puis clampés à la surface détectée afin d'éviter les décalages lorsque la résolution change à chaud. - Les actions
scrollproduisent désormais des événements de molette (boutons 4/5) et interprètent la valeur decoordinates.yainsi que les indications textuelles (scroll down,vers le haut,page down, etc.) pour ajuster sens et intensité. - Les variantes d'action
scroll_down,scroll-up,wheel, etc. sont automatiquement normalisées, il suffit donc d'émettre n'importe quel libellé commençant parscrollpour déclencher l'effet. - Le curseur est déplacé sur les coordonnées fournies (ou sur la dernière position connue / centre d'écran) avant d'envoyer les événements de molette, ce qui rend les scrolls fiables dans les zones ciblées.
- Pour scroller, fournissez à la fois la position (
coordinates) et un nombre (positif = bas, négatif = haut) danstext/value/amount. Ces consignes sont injectées dans le prompt du modèle pour l'inciter à transmettre toutes les informations nécessaires. - Les quantités numériques peuvent être écrites en chiffres ou en toutes lettres (anglais ou français). Les qualificatifs (
petit,small,grand,large, etc.) modulent désormais la vitesse : « 3 petits scrolls » ne produira plus le même effet que « 3 grands scrolls ». - Le prompt guide explicitement le modèle pour convertir les consignes qualitatives en valeurs (petit = 1-3, moyen = 4-7, gros = 8-15) et pour multiplier lorsqu'un nombre de scrolls est demandé.
- Les scrolls qualifiés de « doux/petits » sont maintenant plafonnés puis légèrement amortis, tandis que les « grands/rapides » imposent un plancher avant amplification. Les scrolls par défaut restent dans une fourchette modérée (≈1.5–5) afin d'éviter les coups de molette trop brusques.
- Le système suppose que noVNC répond sur le port 6901 ; adaptez
host_vnc_portdansSandboxManagersi nécessaire. - Pour simuler des raccourcis clavier, incluez des tokens entre chevrons dans vos réponses (ex.
<CTRL+L>,<ENTER>). Ils sont interprétés par l'agent et envoyés viaxdotool keyavant/après les chaînes tapées. - Les modèles qui exposent un mode reasoning ou des balises
<think>sont détectés automatiquement. Les réflexions sont affichées dans les logs Streamlit et dans l'historique des actions, sans configuration supplémentaire. - Chaque capture transmet sa résolution native au modèle. Celui-ci reçoit des instructions explicites pour renvoyer des coordonnées en pixels (ou sur une échelle 0-1000). Cela réduit les clics approximatifs lorsque l'écran change de taille.