Visualisation web — agentview
agentview est un serveur HTTP minimal (zéro dépendance externe) qui expose
une page de visualisation SVG temps réel de l’environnement gAgent.
┌──────────────────────────────────────────────────┐
│ Navigateur GET /api/agents ─► agentview │
│ ↑ │ │
│ SVG rendu EnvClient │
│ ↑ AMSClient │
│ polling JS 500 ms │ │
└─────────────────────────────────┼─────────────────┘
▼
/tmp/gagent_env.sock (Environnement)
/tmp/gagent_ams.sock (AMS)
Démarrage
# Lancer la simulation (produit le socket /tmp/gagent_env.sock)
./mon_application
# Dans un autre terminal :
./agentview # port 8080 par défaut
./agentview 9090 # port personnalisé
# Ouvrir dans le navigateur :
# http://localhost:8080
Variables d’environnement
Variable |
Rôle |
|---|---|
|
Port HTTP (défaut : |
|
Chemin du socket Environnement (défaut : |
|
Chemin du socket AMS (défaut : |
API HTTP
Route |
Réponse |
|---|---|
|
Page HTML (visualisation SVG + JS) |
|
JSON — liste des agents visuels (Environnement) |
|
JSON — liste des agents enregistrés (AMS) |
|
JSON — pile de snapshots NSAP |
Tous les endpoints JSON incluent Access-Control-Allow-Origin: *.
Format /api/agents
{
"width": 600,
"height": 300,
"agents": [
{
"id": "a1",
"name": "alice",
"shape": "circle",
"color": "#e94560",
"pattern": "",
"x": 120.0,
"y": 80.0,
"size_x": 20.0,
"size_y": 20.0,
"size_z": 10.0,
"size": 10.0,
"val": "en attente"
}
]
}
Format /api/ams
{
"agents": [
{"name": "alice", "pid": 4521, "address": "/acl_alice", "state": "active"},
{"name": "bob", "pid": 4522, "address": "/acl_bob", "state": "suspended"}
]
}
Shapes SVG supportées
Valeur |
Rendu |
|---|---|
|
Cercle centré sur |
|
Rectangle |
|
Triangle isocèle pointant vers le haut |
|
Losange (4 sommets cardinaux) |
|
Hexagone régulier |
|
Étoile à 5 branches |
|
Chemin SVG arbitraire (doit commencer par |
Si shape est vide ou non reconnu, circle est utilisé par défaut.
Interface utilisateur
┌─ header ──────────────────────────────────────────┐
│ gAgent Visualization 3 agents ● live │
└────────────────────────────────────────────────────┘
┌─ canvas SVG ──────────────────┐ ┌─ sidebar ───────┐
│ │ │ Agents visuels │
│ ●alice ■bob ◆carol │ │ ● alice ok │
│ │ │ ■ bob wait │
│ │ │ ◆ carol │
│ │ ├─────────────────┤
│ │ │ AMS │
│ │ │ alice active │
│ │ │ bob suspended│
│ │ ├─────────────────┤
│ │ │ Rafraîchissement│
│ │ │ ──●── 500 ms │
└───────────────────────────────┘ └─────────────────┘
Le canvas SVG s’adapte aux dimensions déclarées par
Environnement(map_width×map_height)Le taux de rafraîchissement est réglable de 100 ms à 5 s via un slider
En mode dégradé (env socket absent), le canvas est vide et le statut affiche
env offline
Intégration dans l’Environnement
Environnement::serve() est démarré automatiquement par
AgentCore::initEnvironnementSystem() dans le processus enfant, juste
avant event_loop().
class MyEnv : public gagent::Environnement {
public:
void init_env() override {
// Configurer les dimensions de la carte
map_width = 800;
map_height = 400;
}
void link_attribut() override {
link_id("id");
link_name("name");
link_pos_x("pos_x");
link_pos_y("pos_y");
link_shape("shape");
link_color("color");
link_size_x("size_x");
link_size_y("size_y");
}
void event_loop() override {
while (true) {
make_agent(); // relit list_attr → list_visual_agents
sleep(1);
}
}
};
int main() {
AgentCore::initAgentSystem();
MyEnv env;
AgentCore::initEnvironnementSystem(env); // fork + serve() auto
// ...agents...
AgentCore::syncAgentSystem();
}
Le socket Environnement est créé à /tmp/gagent_env.sock par défaut
(surchargeable via GAGENT_ENV_SOCK).
Note
agentview et agentplatform sont indépendants. On peut lancer
agentview sans agentplatform (le panneau AMS sera vide) et
inversement.
Protocole du socket Environnement
EnvClient (dans libgagent) peut être utilisé depuis n’importe quel
programme C++ pour interroger l’Environnement :
#include <gagent/platform/EnvClient.hpp>
gagent::platform::EnvClient env;
std::string json = env.getAgents(); // JSON complet
std::string nsap = env.getNsap(); // JSON pile NSAP
Protocole bas niveau (ligne de commande, une connexion par requête) :
→ GET_AGENTS
← {"width":600,"height":300,"agents":[...]}
→ GET_NSAP
← {"count":2,"snaps":[{"seq":0,"timestamp":"2026-03-23T14:00:00.000"},...]}
Exemple en Python :
import socket, json
def env_request(cmd):
s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
s.connect('/tmp/gagent_env.sock')
s.sendall((cmd + '\n').encode())
data = b''
s.settimeout(1.0)
try:
while True:
chunk = s.recv(4096)
if not chunk: break
data += chunk
except: pass
s.close()
return json.loads(data.decode().strip())
agents = env_request('GET_AGENTS')
print(f"{len(agents['agents'])} agent(s) dans l'environnement")