Accueil / Articles / Notes pratiques : Fournir à Hermes Agent un accès web sécurisé avec un Chrome distinct.

Notes pratiques : Fournir à Hermes Agent un accès web sécurisé avec un Chrome distinct.

Guide pas à pas fonctionnel des notes pratiques : Fournir à Hermes Agent un accès web sécurisé avec un Chrome distinct, incluant des contrats, des vérifications et des espaces pour du code destinés aux équipes utilisant ce modèle.

4114 mots

Les notes suivantes reconstituent une approche pratique pour « Fournir à Hermes Agent un accès web sécurisé via un pod Podman Chrome distinct ». L’accent est mis sur les contrats, les vérifications et les placeholders de code à insérer, plutôt que sur une présentation motivante. Lors de la phase d’aperçu, notez d’abord le contrat : les entrées requises, le signal de succès et ce qui se passe en cas d’échec partiel. Cette liste de contrôle permet de rester honnête lors des modifications ultérieures du code. Documentez à la fois le parcours normal et le parcours de récupération. Les tentatives répétées, les contrôles humains et la gestion des messages non livrés font partie du produit, et non d’une mise en forme ultérieure.

INTERNET
                              ▲
                              │
                       outbound only
                              │
                ┌────────────────────────┐
                │ Chrome Browser Pod     │
                │                        │
                │  Chrome Headless       │
                │  CDP :9222             │
                └───────────┬────────────┘
                            │
                    private CDP network
                            │
                ┌───────────▼────────────┐
                │ Hermes / Ollama Pod    │
                │                        │
                │ Hermes ─────► Ollama   │
                │          localhost:11434
                │                        │
                └────────────────────────┘
                            │
                            ▼
                         AMD GPU
Chrome → Internet             YES
Hermes → Chrome               YES
Hermes → Ollama               YES
Hermes → Internet directly    NO
Chrome → host filesystem      NO
Hermes → rest of host         NO
Either → Podman socket        NO

Pourquoi placer Chrome dans un pod distinct ?

Aborder la question de l’intégration de Chrome en phase de développement est plus efficace lorsqu’on la considère comme une surface mesurable. Capturez un exemple réussi, un cas d’échec et la note de réversion avant d’élargir le périmètre. Préférez des unités petites et testables aux scripts complexes. Lorsqu’une étape échoue, l’erreur doit indiquer une seule responsabilité plutôt qu’un processus embrouillé. Maintenez l’état des graphes simple et typé. Les blocs imbriqués masquent le fait que tel nœud a modifié tel champ et perturbent la reprise après interruption.

Untrusted Internet content
          ↓
Chrome container
          ↓
CDP
          ↓
Hermes

Pourquoi CDP ?

La phase Why CDP fonctionne le mieux lorsqu’elle est considérée comme une surface mesurable. Capturez un transcript idéal, un cas d’échec et la note de réversion avant d’élargir le périmètre. Considérez cette phase comme un contrat entre les entrées et les sorties validées. Nommez les artefacts, définites des vérifications de succès et refusez toute complétion partielle silencieuse. Maintenez l’état du graphe plat et typé. Les blocs imbriqués masquent le fait que tel nœud a écrit telle champ et perturbent la reprise après interruption.

chromedp/headless-shell

La conception du réseau

La phase de conception du réseau fonctionne le mieux lorsqu’elle est considérée comme une surface mesurable. Capturez un enregistrement idéal, un cas d’échec et une note de réversion avant d’élargir le périmètre. Enregistrez les temps d’exécution ainsi que le coût des tokens ou des requêtes à côté des résultats fonctionnels. Une visibilité précoce des coûts évite les factures inattendues lorsque le processus passe de la démonstration aux environnements partagés. Maintenez l’état du graphe simple et structuré. Les blocs imbriqués masquent l’identité du nœud qui a modifié tel champ, ce qui perturbe la reprise après interruption. La phase de conception du réseau fonctionne le mieux lorsqu’elle est considérée comme une surface mesurable. Capturez un enregistrement idéal, un cas d’échec et une note de réversion avant d’élargir le périmètre. Documentez ensemble le parcours optimal et le parcours de récupération. Les tentatives de réessai, les contrôles humains et le traitement des messages non livrés font partie intégrante du produit, et non d’une mise en forme ultérieure.

hermes-browser-link
browser-egress
Internet
                    ▲
                    │
              browser-egress
                    │
               Chrome Pod
                    │
           hermes-browser-link
                    │
               Hermes Pod
hermes-browser-link

Étape 1 — Arrêter l’environnement Hermes existant

Pour l’étape 1 « Arrêter la phase », définissez les entrées, le responsable de l’étape ainsi que les critères d’arrêt avant de modifier du code. Les opérateurs doivent pouvoir relancer l’étape à partir d’un point de contrôle connu sans deviner l’état caché. Préférez des unités petites et testables aux scripts complexes. Lorsqu’une étape échoue, l’échec doit indiquer une seule responsabilité et non un processus embrouillé. Faites approuver par des humains les actions qui entraînent des dépenses ou modifient des données de production. La connexion en temps de compilation ne garantit pas la complétude du processus métier.

systemctl --user stop hermes-local
systemctl --user disable hermes-local
podman volume ls
hermes-data
ollama-models

Étape 2 — Choisir un sous-réseau privé

Pour l’Étape 2 « Choisir une étape », définissez les entrées, le responsable de l’étape ainsi que les critères de fin avant de modifier du code. Les opérateurs doivent pouvoir relancer l’étape à partir d’un point de contrôle connu sans deviner l’état caché. Considérez cette étape comme un contrat entre les entrées et les sorties validées. Donnez des noms aux artefacts, définites des vérifications de succès et refusez toute exécution partielle silencieuse. Faites approuver par un humain les cas où de l’argent est dépensé ou des données de production sont modifiées. La connexion en temps de compilation ne revient pas à une complétude opérationnelle.

10.77.0.0/24
Hermes pod:   10.77.0.10
Chrome pod:   10.77.0.20
podman network ls
podman network inspect NETWORK_NAME

Étape 3 — Créer le réseau de contrôle du navigateur privé

Pour l’Étape 3 « Créer la phase », définissez les entrées, le responsable de l’étape et les critères de sortie avant de modifier le code. Les opérateurs doivent pouvoir relancer l’étape à partir d’un point de contrôle connu sans deviner l’état caché. Enregistrez les temps d’exécution ainsi que le coût des tokens ou des requêtes à côté des résultats fonctionnels. Une visibilité précoce des coûts évite les factures inattendues lorsque le parcours passe de l’environnement de démonstration à des environnements partagés. Faites approuver par un humain les étapes qui entraînent des dépenses ou modifient des données de production. La connexion en temps de compilation ne garantit pas la complétude du processus métier. Pour l’Étape 3 « Créer la phase », définissez les entrées, le responsable de l’étape et les critères de sortie avant de modifier le code. Les opérateurs doivent pouvoir relancer l’étape à partir d’un point de contrôle connu sans deviner l’état caché. Documentez ensemble le parcours idéal et le parcours de récupération. Les tentatives de réexécution, les contrôles humains et la gestion des messages non livrés font partie intégrante du produit, et non d’une mise en forme ultérieure.

podman network create \
  --internal \
  --subnet 10.77.0.0/24 \
  hermes-browser-link
podman network inspect hermes-browser-link

Étape 4 — Créer le réseau de sortie du navigateur

Lorsque vous travaillez sur l’Étape 4 de création, notez d’abord les exigences : entrées requises, signal de succès et ce qui se passe en cas d’échec partiel. Cette liste de contrôle permet de rester honnête lors des modifications ultérieures du code. Préférez des unités petites et testables plutôt que des scripts complexes. Lorsqu’une étape échoue, l’erreur doit indiquer une seule responsabilité et non un processus embrouillé. Faites des points de contrôle après les étapes coûteuses. Le système de reprise ne doit pas facturer à nouveau la même appel LLM lorsque l’opérateur réessaie un nœud ultérieur.

podman network create browser-egress

Étape 5 — Recréer le pod Hermes

Lorsque vous travaillez sur l’Étape 5 « Recréer l’étape », notez d’abord le contrat : les entrées requises, le signal de succès et ce qui se passe en cas d’échec partiel. Cette liste de contrôle permet de rester honnête lors des modifications ultérieures du code. Considérez cette étape comme un contrat entre les entrées et les sorties validées. Donnez des noms aux artefacts, définez des vérifications de succès et refusez les terminations partielles silencieuses. Faites un point après des étapes coûteuses. Le système de reprise ne doit pas facturer à nouveau la même appel du LLM lorsque l’opérateur réessaie un nœud ultérieur.

podman pod rm -f hermes-local
podman pod create \
  --name hermes-local \
  --network hermes-browser-link:ip=10.77.0.10 \
  --userns=keep-id:uid=10000,gid=10000
10.77.0.10

Étape 6 — Recréer Ollama

Lors de l’exécution de l’étape 6 « Recréer Ollama », notez d’abord le contrat : les entrées requises, le signal de succès et ce qui se passe en cas d’échec partiel. Cette liste de contrôle permet de rester honnête lors des modifications ultérieures du code. Enregistrez les temps d’exécution ainsi que le coût en tokens ou en requêtes à côté des résultats fonctionnels. Une visibilité précoce des coûts évite les factures inattendues lorsque le processus passe de l’environnement de démonstration à des environnements partagés. Enregistrez l’ID de la requête, l’ID du modèle et le temps de latence pour chaque appel. Sans ce suivi, les erreurs intermittentes du fournisseur sont perçues comme des bugs de l’application. Lors de l’exécution de l’étape 6 « Recréer Ollama », notez d’abord le contrat : les entrées requises, le signal de succès et ce qui se passe en cas d’échec partiel. Cette liste de contrôle permet de rester honnête lors des modifications ultérieures du code. Documentez à la fois le parcours normal et les scénarios de récupération. Les tentatives de réessai, les contrôles humains et la gestion des messages non livrés font partie intégrante du produit, et non d’améliorations ultérieures.

podman run -d \
  --name ollama \
  --pod hermes-local \
  --device /dev/kfd \
  --device /dev/dri \
  --group-add keep-groups \
  -e HOME=/root \
  -e OLLAMA_MODELS=/root/.ollama/models \
  -e OLLAMA_CONTEXT_LENGTH=64000 \
  -v ollama-models:/root/.ollama \
  docker.io/ollama/ollama:rocm
http://127.0.0.1:11434
podman exec ollama ollama list

Étape 7 — Recréer Hermes

L’étape de recréation d’Hermes en Étape 7 fonctionne le mieux lorsqu’elle est considérée comme une surface mesurable. Capturez un enregistrement doré, un cas d’échec et la note de rollback avant d’élargir le périmètre. Préférez des unités petites et testables plutôt que des scripts complexes. Lorsqu’une étape échoue, l’échec doit pointer vers une seule responsabilité plutôt que vers un processus embrouillé. Maintenez l’état du graphe plat et typé. Les blocs imbriqués cachent le fait que tel nœud a écrit tel champ et perturbent la reprise après interruption.

export HERMES_WORKSPACE="$HOME/path/to/Hermes-Workspace"
podman run -d \
  --name hermes \
  --pod hermes-local \
  --security-opt=no-new-privileges \
  --pids-limit 512 \
  -v hermes-data:/opt/data \
  -v "$HERMES_WORKSPACE:/opt/data/workspace:rw,nodev,nosuid" \
  -w /opt/data/workspace \
  docker.io/nousresearch/hermes-agent:latest \
  sleep infinity
RW access:
$HERMES_WORKSPACE
/
$HOME
~/.ssh
~/.config
your normal browser profile
Podman socket
Docker socket

Étape 8 — Télécharger le shell sans interface de Chrome

La phase 8 « Pull Chrome » fonctionne le mieux lorsqu’elle est considérée comme une surface mesurable. Capturez un transcript parfait, un cas d’échec et la note de rollback avant d’élargir le périmètre. Considérez cette phase comme un contrat entre les entrées et les sorties validées. Nommez les artefacts, définez des vérifications de succès, et refusez toute mise en œuvre partielle silencieuse. Maintenez l’état du graphe plat et typé. Les blocs imbriqués masquent le fait que tel nœud a écrit telle champ et perturbent la reprise après interruption.

podman pull docker.io/chromedp/headless-shell:latest

Étape 9 — Créer un pod Chrome séparé

La étape 9 « Créer une phase » fonctionne le mieux lorsqu’elle est considérée comme une surface mesurable. Capturez un enregistrement idéal, un cas d’échec et la note de réversion avant d’élargir le périmètre. Notez les temps d’exécution ainsi que le coût des tokens ou des requêtes à côté des résultats fonctionnels. Une visibilité précoce des coûts évite les factures inattendues lorsque le processus passe de la démonstration aux environnements partagés. Gardez l’état du graphique simple et bien typé ; les blocs imbriqués masquent l’identité du nœud qui a modifié tel champ et perturbent la reprise après interruption. La étape 9 « Créer une phase » fonctionne le mieux lorsqu’elle est considérée comme une surface mesurable. Capturez un enregistrement idéal, un cas d’échec et la note de réversion avant d’élargir le périmètre. Documentez ensemble le parcours réussi et le parcours de récupération. Les tentatives répétées, les contrôles manuels et le traitement des messages non livrés font partie intégrante du produit, et non d’une mise en forme ultérieure.

podman pod create \
  --name hermes-browser-pod \
  --network hermes-browser-link:ip=10.77.0.20 \
  --network browser-egress
Chrome
  │
  ├── 10.77.0.20 ─── private link to Hermes
  │
  └── browser-egress ─── Internet

Étape 10 — Exécuter Chrome à l’intérieur du pod navigateur

Pour l’étape 10 « Exécuter Chrome », définissez les entrées, le responsable de l’étape ainsi que les critères d’arrêt avant de modifier le code. Les opérateurs doivent pouvoir relancer l’étape à partir d’un point de contrôle connu sans deviner l’état caché. Préférez des unités petites et testables aux scripts complexes. Lorsqu’une étape échoue, l’échec doit indiquer une seule responsabilité et non un processus embrouillé. Faites approuver par des humains les actions qui entraînent des dépenses ou modifient des données de production. Une connexion en temps de compilation ne garantit pas la complétude du processus métier.

podman run -d \
  --name hermes-browser \
  --pod hermes-browser-pod \
  --init \
  --shm-size=2g \
  --security-opt=no-new-privileges \
  docker.io/chromedp/headless-shell:latest
-p 9222:9222
10.77.0.20:9222

Étape 11 — Tester Chrome depuis le conteneur Hermes

Pour l’étape 11 relative au test Chrome, définissez les entrées, le responsable de l’étape ainsi que les critères de fin avant de modifier le code. Les opérateurs doivent pouvoir relancer l’étape à partir d’un point de contrôle connu sans deviner l’état caché. Considérez cette étape comme un contrat entre les entrées et les sorties validées. Donnez des noms aux artefacts, définites des vérifications de succès et refusez toute exécution partielle silencieuse. Faites approuver par un humain les cas où de l’argent est dépensé ou où des données de production sont modifiées. Une connexion en temps de compilation ne garantit pas la complétude du processus métier.

podman exec hermes python -c \
'import urllib.request; print(urllib.request.urlopen("http://10.77.0.20:9222/json/version").read().decode())'
{
  "Browser": "HeadlessChrome/...",
  "webSocketDebuggerUrl": "ws://10.77.0.20:9222/devtools/browser/..."
}
Hermes → Chrome

Étape 12 — Vérifier que Chrome a accès à Internet

Pour l’étape 12 « Vérifier », définissez les entrées, le responsable de l’étape et les critères d’arrêt avant de modifier le code. Les opérateurs doivent pouvoir relancer l’étape à partir d’un point de contrôle connu sans deviner l’état caché. Enregistrez les temps d’exécution ainsi que le coût des tokens ou des requêtes à côté des résultats fonctionnels. Une visibilité précoce des coûts évite les factures inattendues lorsque le processus passe d’un environnement de démonstration à des environnements partagés. Faites approuver par un humain les étapes qui entraînent des dépenses ou modifient des données de production. La connexion en temps de compilation ne garantit pas la complétude du processus métier. Pour l’étape 12 « Vérifier », définissez les entrées, le responsable de l’étape et les critères d’arrêt avant de modifier le code. Les opérateurs doivent pouvoir relancer l’étape à partir d’un point de contrôle connu sans deviner l’état caché. Documentez conjointement le parcours idéal et le parcours de récupération. Les tentatives de réexécution, les contrôles humains et la gestion des messages non livrés font partie intégrante du produit, et non d’une mise en forme ultérieure.

podman exec hermes-browser \
  curl -I https://example.com
browser-egress

Étape 13 — Vérifier que Hermes n’a pas d’accès direct à Internet

Lors de l’exécution de l’étape 13 visant à vérifier Hermes, notez d’abord les éléments requis : les entrées nécessaires, le signal de succès, ainsi que ce qui se passe en cas d’échec partiel. Cette liste de contrôle permet de rester honnête lors des modifications ultérieures du code. Préférez des unités petites et testables plutôt que des scripts complexes. Lorsqu’une étape échoue, l’échec doit indiquer une seule responsabilité et non un processus embrouillé. Faites des points de contrôle après les étapes coûteuses. Le système de reprise ne doit pas facturer à nouveau la même appel au LLM lorsque l’opérateur réessaie un nœud ultérieur.

podman exec hermes python -c \
'import urllib.request; print(urllib.request.urlopen("https://example.com", timeout=5).status)'
podman exec hermes python -c \
'import urllib.request; print(urllib.request.urlopen("http://10.77.0.20:9222/json/version").status)'
200
Hermes → Internet      FAIL
Hermes → Chrome        PASS
Chrome → Internet      PASS

Étape 14 — Diriger Hermes vers l’instance Chrome distante

Lors de l’exécution de l’étape 14, Phase Hermes, notez d’abord le contrat : les entrées requises, le signal de succès et ce qui se passe en cas d’échec partiel. Cette liste de contrôle permet de garantir l’intégrité des modifications ultérieures du code. Considérez cette étape comme un contrat entre les entrées et les sorties validées. Donnez des noms aux artefacts, définez des vérifications de succès et refusez toute exécution partielle silencieuse. Faites un point après les étapes coûteuses. Le système de reprise ne doit pas facturer à nouveau la même appel du LLM lorsque l’opérateur réessaie un nœud ultérieur.

http://127.0.0.1:9222
http://10.77.0.20:9222
podman exec \
  --user 10000:10000 \
  hermes \
  hermes config set browser.cdp_url http://10.77.0.20:9222
podman exec hermes \
  grep -A3 '^browser:' /opt/data/config.yaml
browser:
  cdp_url: http://10.77.0.20:9222
podman restart hermes

Étape 15 — Le tester depuis Hermes

Lors de l’étape de test du Pas 15, notez d’abord les conditions requises : les entrées nécessaires, le signal de succès et ce qui se passe en cas d’échec partiel. Cette liste de contrôle permet de garantir l’intégrité des modifications ultérieures du code. Enregistrez les temps d’exécution ainsi que le coût des tokens ou des requêtes à côté des résultats fonctionnels. Une visibilité précoce des coûts évite les factures inattendues lorsque le processus passe d’un environnement de démonstration à des environnements partagés. Créez un point de contrôle après les étapes coûteuses. Le système de reprise ne doit pas facturer à nouveau la même appel du LLM lorsque l’opérateur réessaie un nœud ultérieur. Lors de l’étape de test du Pas 15, notez d’abord les conditions requises : les entrées nécessaires, le signal de succès et ce qui se passe en cas d’échec partiel. Cette liste de contrôle permet de garantir l’intégrité des modifications ultérieures du code. Documentez en même temps le parcours normal et les scénarios de récupération. Les tentatives de réessai, les contrôles humains et la gestion des messages non traités font partie intégrante du produit, et non d’améliorations apportées ultérieurement.

podman exec -it \
  --user 10000:10000 \
  -w /opt/data/workspace \
  hermes \
  hermes

Important : il s’agit d’un accès via le navigateur, et non d’un accès Internet Hermes sans restrictions

Cette étape liée au navigateur fonctionne le mieux lorsqu’elle est considérée comme une surface mesurable. Capturez un transcript parfait, un cas d’échec et la note de réversion avant d’élargir le périmètre. Préférez des unités petites et testables plutôt que des scripts complexes. Lorsqu’une étape échoue, l’erreur doit indiquer une seule responsabilité et non un processus embrouillé. Maintenez l’état du graphe simple et typé. Les blocs imbriqués masquent le fait que tel nœud a écrit telle champ et perturbent la reprise après interruption.

Hermes browser tools
        ↓
Chrome
        ↓
Internet
curl https://example.com

Pourquoi ne pas placer Chrome dans le pod Hermes ?

La phase « Pourquoi ne pas utiliser Chrome ? » fonctionne le mieux lorsqu’elle est considérée comme une surface mesurable. Capturez un exemple réussi, un cas d’échec ainsi que la note de réversion avant d’élargir le périmètre. Traitez cette phase comme un contrat entre les entrées et les sorties validées. Donnez des noms aux artefacts, définez des critères de succès et refusez toute mise en œuvre partielle silencieuse. Maintenez l’état du graphe plat et typé. Les blocs imbriqués masquent le fait que tel nœud a écrit telle champ et perturbent la reprise après interruption.

127.0.0.1:9222
Hermes pod:
private network only
Browser pod:
private network
+
Internet network

Ne chargez pas votre profil Chrome normal

La méthode « Ne montez pas votre scène » fonctionne le mieux lorsqu’elle est considérée comme une surface mesurable. Capturez un enregistrement idéal, un cas d’échec et la note de réversion avant d’élargir le périmètre. Enregistrez les temps d’exécution ainsi que le coût des tokens ou des requêtes à côté des résultats fonctionnels. Une visibilité précoce des coûts évite les factures inattendues lorsque le processus passe d’un environnement de démonstration à des environnements partagés. Gardez l’état des graphiques simple et bien typé ; les blocs imbriqués masquent l’identité du nœud qui a modifié tel champ et perturbent la reprise après interruption. La méthode « Ne montez pas votre scène » fonctionne le mieux lorsqu’elle est considérée comme une surface mesurable. Capturez un enregistrement idéal, un cas d’échec et la note de réversion avant d’élargir le périmètre. Documentez ensemble le parcours réussi et le parcours de récupération. Les tentatives répétées, les contrôles humains et le traitement des messages non livrés font partie intégrante du produit, et non d’une mise en forme ultérieure.

-v "$HOME/.config/google-chrome:/chrome-profile"

Optionnel : profil de navigateur d’agent persistant

Pour l’étape facultative du navigateur d’agent persistant, définissez les entrées, le responsable de l’étape et les critères de fin avant de modifier le code. Les opérateurs doivent pouvoir relancer l’étape à partir d’un point de contrôle connu sans deviner l’état caché. Préférez des unités petites et testables aux scripts complexes. Lorsqu’une étape échoue, l’échec doit indiquer une seule responsabilité plutôt qu’un processus embrouillé. Faites approuver par des humains les actions qui entraînent des dépenses ou modifient des données de production. La connexion en temps de compilation ne garantit pas la complétude du processus métier.

podman volume create hermes-browser-profile
Human browser profile       separate
Agent browser profile       separateHost filesystem             separate

Le CDP doit rester privé

Pour que le CDP reste en phase privée, il convient de définir les entrées, le responsable de l’étape et les critères de fin avant de modifier le code. Les opérateurs doivent pouvoir relancer l’étape à partir d’un point de contrôle connu, sans avoir à deviner l’état caché. Considérez cette phase comme un contrat entre les entrées et les sorties validées. Donnez des noms aux artefacts, définites des vérifications de succès et refusez les terminations partielles silencieuses. Faites approuver par un humain les étapes qui entraînent des dépenses ou modifient des données de production. La connexion en temps de compilation ne revient pas à une complétude opérationnelle.

10.77.0.20:9222
hermes-browser-link
0.0.0.0:9222 -> Chrome

Vérifier l’isolation

Pour l’étape de vérification de l’isolation, définissez les entrées, le responsable de l’étape et les critères d’arrêt avant de modifier le code. Les opérateurs doivent pouvoir relancer l’étape à partir d’un point de contrôle connu sans deviner l’état caché. Enregistrez les temps d’exécution ainsi que le coût des tokens ou des requêtes à côté des résultats fonctionnels. Une visibilité précoce des coûts évite les factures inattendues lorsque le processus passe d’un environnement de démonstration à des environnements partagés. Faites approuver par un humain les cas où de l’argent est dépensé ou où des données de production sont modifiées. La connexion en temps de compilation ne garantit pas la complétude du processus métier. Pour l’étape de vérification de l’isolation, définissez les entrées, le responsable de l’étape et les critères d’arrêt avant de modifier le code. Les opérateurs doivent pouvoir relancer l’étape à partir d’un point de contrôle connu sans deviner l’état caché. Documentez ensemble le parcours normal et les scénarios de récupération. Les tentatives de réexécution, les contrôles humains et la gestion des messages échoués font partie intégrante du produit, et non d’améliorations ultérieures.

podman pod inspect hermes-local
podman pod inspect hermes-browser-pod
Hermes pod
  └── hermes-browser-link
Browser pod
  ├── hermes-browser-link
  └── browser-egress
podman inspect hermes \
  --format '{{range .Mounts}}{{println .Type .Source "->" .Destination}}{{end}}'
podman inspect hermes-browser \
  --format '{{range .Mounts}}{{println .Type .Source "->" .Destination}}{{end}}'
podman port hermes-browser

Démarrage automatique des deux pods

Lorsque vous travaillez sur l’étape de démarrage automatique des deux pods, notez d’abord les exigences : entrées requises, signal de succès et conséquences en cas d’échec partiel. Cette liste de contrôle permet de rester honnête lors des modifications ultérieures du code. Préférez des unités petites et testables plutôt que des scripts complexes. Lorsqu’une étape échoue, l’erreur doit indiquer une responsabilité précise plutôt qu’un processus embrouillé. Créez des points de contrôle après les étapes coûteuses. Le mécanisme de reprise ne doit pas réutiliser la même appel à l’LLM lorsque l’opérateur tente à nouveau un nœud ultérieur.

nano ~/.config/systemd/user/hermes-local.service
[Unit]
Description=Hermes Local AI and Browser Pods
After=default.target
[Service]
Type=oneshot
RemainAfterExit=yesExecStart=/usr/bin/podman pod start hermes-browser-pod
ExecStart=/usr/bin/podman pod start hermes-localExecStop=/usr/bin/podman pod stop -t 30 hermes-local
ExecStop=/usr/bin/podman pod stop -t 30 hermes-browser-podTimeoutStartSec=120
TimeoutStopSec=60[Install]
WantedBy=default.target
systemctl --user daemon-reload
systemctl --user enable --now hermes-local
sudo loginctl enable-linger "$USER"
podman pod ps
hermes-local
hermes-browser-pod

Résolution de problèmes

Lors de la phase de dépannage, notez d’abord les conditions du contrat : les entrées requises, le signal de succès, ainsi que ce qui se passe en cas d’échec partiel. Cette liste de contrôle permet de rester honnête lors des modifications ultérieures du code. Considérez cette phase comme un contrat entre les entrées et les sorties validées. Donnez des noms aux éléments générés, définez des vérifications de succès, et refusez les terminations partielles silencieuses. Faites des points de contrôle après les étapes coûteuses. Le système de reprise ne doit pas facturer à nouveau la même appel du LLM lorsque l’opérateur réessaie un nœud ultérieur.

Hermes ne peut pas se connecter au port 9222

Lorsque le processus via Hermes n’atteint pas l’étape souhaitée, notez d’abord le contrat : les entrées requises, le signal de succès et ce qui se passe en cas d’échec partiel. Cette liste de contrôle permet de garantir l’intégrité des modifications ultérieures du code. Enregistrez les temps d’exécution ainsi que le coût des tokens ou des requêtes à côté des résultats fonctionnels. Une visibilité précoce des coûts évite les factures inattendues lorsque le processus passe de l’environnement de démonstration à des environnements partagés. Créez un point de contrôle après les étapes coûteuses. Le système de reprise ne doit pas facturer à nouveau la même appel d’LLM lorsque l’opérateur réessaie un nœud ultérieur. Lorsque le processus via Hermes n’atteint pas l’étape souhaitée, notez d’abord le contrat : les entrées requises, le signal de succès et ce qui se passe en cas d’échec partiel. Cette liste de contrôle permet de garantir l’intégrité des modifications ultérieures du code. Documentez en même temps le parcours normal et le parcours de récupération. Les tentatives de réessai, les contrôles humains et la gestion des messages non traités font partie intégrante du produit, et non d’améliorations apportées ultérieurement.

podman ps
podman exec hermes python -c \
'import urllib.request; print(urllib.request.urlopen("http://10.77.0.20:9222/json/version").read().decode())'
hermes-browser-link

Chrome démarre mais les pages plantent

Chrome peut démarrer, mais il fonctionne le mieux lorsqu’il est considéré comme une surface mesurable. Capturez un enregistrement exemplaire, un cas d’échec et une note de réversion avant d’élargir le périmètre. Préférez des unités petites et testables à des scripts complexes. Lorsqu’une étape échoue, l’erreur doit indiquer une seule responsabilité plutôt qu’un processus embrouillé. Maintenez l’état des graphiques simple et typé. Les blocs imbriqués cachent le fait que tel nœud a écrit telle champ et perturbent la reprise après interruption.

--shm-size=2g

Chrome fonctionne mais les outils du navigateur Hermes ne s’affichent pas

Chrome fonctionne, mais l’étape Hermes est optimale lorsqu’elle est considérée comme une surface mesurable. Capturez un transcripteur idéal, un cas d’échec et la note de réversion avant d’élargir le périmètre. Traitez cette étape comme un contrat entre les entrées et les sorties validées. Nommez les artefacts, définez des vérifications de succès, et refusez toute complétion partielle silencieuse. Exposez des outils dotés de schémas restreints et de labels explicites indiquant les effets secondaires. Les hôtes doivent savoir quels appels modifient l’état avant d’approuver automatiquement.

browser:
  cdp_url: http://10.77.0.20:9222

nano n’est pas disponible à l’intérieur du conteneur Hermes

La phase où le nano n’est pas disponible fonctionne le mieux lorsqu’elle est considérée comme une surface mesurable. Capturez un enregistrement idéal, un cas d’échec et la note de réversion avant d’élargir le périmètre. Enregistrez les temps d’exécution ainsi que le coût des tokens ou des requêtes à côté des résultats fonctionnels. Une visibilité précoce des coûts évite les factures inattendues lorsque le processus passe de la démonstration aux environnements partagés. Gardez l’état des graphes simple et bien typé ; les blocs imbriqués masquent l’identité du nœud qui a écrit tel champ et perturbent la reprise après interruption. La phase où le nano n’est pas disponible fonctionne le mieux lorsqu’elle est considérée comme une surface mesurable. Capturez un enregistrement idéal, un cas d’échec et la note de réversion avant d’élargir le périmètre. Documentez ensemble le parcours réussi et le parcours de récupération. Les tentatives répétées, les contrôles humains et la gestion des messages non livrés font partie intégrante du produit, et non d’une mise en forme ultérieure.

hermes config set
podman exec \
  --user 10000:10000 \
  hermes \
  hermes config set browser.cdp_url http://10.77.0.20:9222

Le modèle de sécurité finalisé

INTERNET
                           ▲
                           │
                    browser-egress
                           │
                 ┌─────────┴──────────┐
                 │ Chrome Browser Pod │
                 │                    │
                 │ Headless Chrome    │
                 │ CDP :9222          │
                 └─────────┬──────────┘
                           │
               hermes-browser-link
                    INTERNAL ONLY
                           │
                 ┌─────────▼──────────┐
                 │ Hermes/Ollama Pod  │
                 │                    │
Host Workspace ─►│ Hermes             │
      RW         │     │              │
                 │     ▼              │
                 │   Ollama           │
                 │     │              │
                 └─────┼──────────────┘
                       ▼
                    AMD GPU
ACCESS
Hermes → designated host workspace       YES
Hermes → Ollama                           YES
Hermes → Chrome CDP                       YESChrome → Internet                         YESHermes → Internet directly                NO
Hermes → rest of host filesystem          NO
Hermes → SSH keys                         NO
Chrome → host filesystem                  NO
Chrome → normal browser profile           NO
Hermes → Podman/Docker socket              NO
Chrome → Podman/Docker socket              NO
Host/LAN → Chrome CDP                      NO

Pourquoi vous préférez cette architecture

Give it the filesystem.
Give it Docker.
Give it Internet.
Give it Chrome.
Give it credentials.
one working directory
local-model access
browser-control access
model storage
GPU access
Internet access
CDP connectivity
my SSH keys
my entire home directory
my normal browser profile
my Podman socket

Checklist opérationnel