Files
skill-hermes-agent/skill-mh/mh_lieu.py
T
perco 09eb8bd576 Ajoute le skill MountyHall (lecture + confirmation avant action)
Scripts Python (requests + BeautifulSoup) pour un agent LLM local
(Hermes-agent) : lecture structuree du lieu du troll (description +
formulaires d'action disponibles), et soumission d'une action precise
uniquement apres confirmation explicite. Corrige le probleme observe
avec un agent 9B qui ne detectait pas les boutons d'action en lisant
le HTML brut.
2026-07-03 15:58:30 +02:00

87 lines
3.1 KiB
Python

"""Lit et decrit le lieu actuel du troll, en extrayant proprement (via BeautifulSoup)
la description ET les formulaires d'action disponibles.
Usage:
python3 mh_lieu.py [type] [id] [service]
Par defaut : type=L id=-3 service=0 (lieu actuel du troll).
Sortie : un JSON structure sur stdout, avec les cles:
- titre : titre du lieu (ex: "Portail : [4366144] Portail de Teleportation")
- description : texte descriptif du lieu (hors menus/formulaires)
- forms : liste des formulaires d'action detectes, chacun avec:
- action : URL cible du formulaire
- method : GET ou POST
- hidden_fields : dict des champs caches (type, id, cp, ...)
- buttons : liste des boutons soumission {name, value, label}
IMPORTANT pour l'agent qui utilise ce script : ne JAMAIS soumettre un des
formulaires listes ici sans confirmation explicite de Perco. Chaque formulaire
represente une action qui coute des Points d'Action (PA) ou a un effet en jeu.
"""
import json
import sys
from bs4 import BeautifulSoup
from mh_common import BASE, get_session
def fetch_lieu(session, type_="L", id_="-3", service="0"):
r = session.get(
f"{BASE}/Play_a_Action.php",
params={"type": type_, "id": id_, "service": service},
)
return r.text
def parse_lieu(html):
# Titre + description : on part d'une copie du HTML dont on retire nav/forms/scripts
soup = BeautifulSoup(html, "html.parser")
main = soup.find("main") or soup
h2 = main.find("h2")
titre = h2.get_text(strip=True) if h2 else None
for tag in main.find_all(["nav", "form", "script", "style"]):
tag.decompose()
description = main.get_text("\n", strip=True)
# Formulaires : sur une deuxieme copie intacte du HTML
soup2 = BeautifulSoup(html, "html.parser")
forms = []
for form in soup2.find_all("form"):
hidden = {
inp.get("name"): inp.get("value", "")
for inp in form.find_all("input", type="hidden")
if inp.get("name")
}
buttons = []
for btn in form.find_all(["button", "input"]):
if btn.name == "button" or btn.get("type") == "submit":
label = btn.get_text(strip=True) if btn.name == "button" else btn.get("value", "")
buttons.append({
"name": btn.get("name"),
"value": btn.get("value", ""),
"label": label,
})
forms.append({
"action": form.get("action"),
"method": (form.get("method") or "get").upper(),
"hidden_fields": hidden,
"buttons": buttons,
})
return {"titre": titre, "description": description, "forms": forms}
if __name__ == "__main__":
type_ = sys.argv[1] if len(sys.argv) > 1 else "L"
id_ = sys.argv[2] if len(sys.argv) > 2 else "-3"
service = sys.argv[3] if len(sys.argv) > 3 else "0"
session = get_session()
html = fetch_lieu(session, type_, id_, service)
data = parse_lieu(html)
print(json.dumps(data, ensure_ascii=False, indent=2))