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.
This commit is contained in:
@@ -0,0 +1,86 @@
|
||||
"""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))
|
||||
Reference in New Issue
Block a user