Практические рекомендации: предоставьте агенту Hermes безопасный веб-доступ с отдельным браузером Chrome.
Пошаговая инструкция по использованию практических рекомендаций: предоставьте агенту Hermes безопасный веб-доступ с отдельным браузером Chrome, а также слоты для контрактов, проверок и кода для команд, использующих эту схему.
В следующих примечаниях описывается практический подход к реализации задачи «Обеспечение безопасного веб-доступа для агента Hermes с использованием отдельного контейнера Podman в Chrome». Основное внимание уделяется контрактам, проверкам и местам для вставки кода, а не мотивирующим формулировкам. На этапе обзора сначала запишите условия работы: необходимые входные данные, сигнал успешного выполнения и действия при частичной неудаче. Такой список поможет сохранять честность при последующих изменениях кода. Документируйте как успешный, так и аварийный сценарии работы. Повторные попытки, проверки со стороны человека и обработка ошибок являются неотъемлемой частью продукта, а не элементами последующей доработки.
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
Почему размещать Chrome в отдельном контейнере?
Подход «Почему мы внедряем Chrome» работает наилучшим образом, если рассматривать его как измеримую структуру. Соберите один идеальный пример работы, один случай сбоя и записку о возврате к предыдущему состоянию перед расширением объёма работ. Предпочитайте небольшие, тестируемые единицы кода вместо обширных скриптов. Когда какой-то шаг сбивается, причина сбоя должна указывать на конкретную ответственность, а не на запутанную цепочку операций. Сохраняйте структуру графа простой и типизированной. Вложенные структуры данных маскируют информацию о том, какой узел заполнил тот или иной поле, что приводит к нарушению продолжения работы после перерывов.
Untrusted Internet content
↓
Chrome container
↓
CDP
↓
Hermes
Почему CDP?
Этап Why CDP работает наилучшим образом, когда его рассматривают как измеримую поверхность. Соберите один идеальный пример работы, один случай сбоя и записку о возврате к предыдущему состоянию перед расширением объёма работ. Рассматривайте этот этап как контракт между входными данными и проверенными выходными результатами. Дайте названия элементам, определите критерии успешного выполнения и не соглашайтесь на молчаливое частичное завершение работы. Сохраняйте структуру графа простой и типизированной. Вложенные структуры скрывают информацию о том, какой узел заполнил тот или иной поле, и приводят к нарушению возобновления работы после перерывов.
chromedp/headless-shell
Проектирование сети
Этап проектирования сети работает наилучшим образом, когда его рассматривают как измеримую структуру. Соберите один идеальный пример работы, один случай сбоя и запись о возврате к предыдущему состоянию до расширения объёма работ. Записывайте временные показатели, а также стоимость токенов или запросов рядом с функциональными результатами. Отслеживание затрат на раннем этапе предотвращает неожиданные счёты при переходе от демо-среды к общедоступным средам. Сохраняйте структуру графа простой и типизированной. Вложенные структуры скрывают информацию о том, какой узел заполнил тот или иной поле, и могут нарушить работу после прерываний. Этап проектирования сети работает наилучшим образом, когда его рассматривают как измеримую структуру. Соберите один идеальный пример работы, один случай сбоя и запись о возврате к предыдущему состоянию до расширения объёма работ. Документируйте одновременно успешный путь выполнения и путь восстановления. Повторные попытки, проверки человеком и обработка неработающих сообщений являются частью продукта, а не элементами последующей доработки.
hermes-browser-link
browser-egress
Internet
▲
│
browser-egress
│
Chrome Pod
│
hermes-browser-link
│
Hermes Pod
hermes-browser-link
Шаг 1 — Остановить существующую среду Hermes
На этапе 1 «Остановка» необходимо определить входные данные, ответственного за шаг и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Лучше использовать небольшие, тестируемые единицы кода вместо обширных скриптов. При сбое шага он должен указывать на конкретную причину, а не на сложную структуру обработки данных. Внедрять человеческое утверждение для операций, связанных с тратой денег или изменением производственных данных. Конфигурация на этапе компиляции не гарантирует полноты решения бизнес-задач.
systemctl --user stop hermes-local
systemctl --user disable hermes-local
podman volume ls
hermes-data
ollama-models
Этап 2 — Выбор частной подсети
На втором этапе «Выбор этапа» необходимо определить входные данные, ответственного за выполнение этапа и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить этап с известной точки контроля, не догадываясь о скрытом состоянии. Рассматривайте этот этап как контракт между входными данными и проверенными выходными результатами. Дайте названия элементам, определите критерии успеха и не допускайте молчаливого частичного завершения работы. Внедряйте утверждение человека для операций, связанных с тратой денег или изменением производственных данных. Подключение на этапе компиляции не эквивалентно полноте выполнения бизнес-задач.
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
Этап 3 — Создание сети приватного управления браузером
На третьем этапе «Создание сцены» необходимо определить входные данные, ответственного за выполнение шага и критерии завершения перед внесением изменений в код. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Регистрируйте время выполнения и стоимость токенов или запросов рядом с функциональными результатами. Отображение стоимости заранее предотвращает неожиданные счета при переходе от демо-среды к общедоступным средам. Внедряйте человеческое утверждение для операций, связанных с тратой денег или изменением производственных данных. Подключение компонентов во время компиляции не гарантирует полноты функционала продукта. На третьем этапе «Создание сцены» необходимо определить входные данные, ответственного за выполнение шага и критерии завершения перед внесением изменений в код. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Документируйте одновременно «идеальный путь» и пути восстановления. Повторные попытки, человеческое утверждение и обработка некорректных сообщений являются частью продукта, а не элементами последующей доработки.
podman network create \
--internal \
--subnet 10.77.0.0/24 \
hermes-browser-link
podman network inspect hermes-browser-link
Шаг 4 — Создание сети выхода браузера
При работе над шагом 4 «Создание» сначала запишите условия работы: необходимые входные данные, сигнал о успешном выполнении и действия при частичной неудаче. Такой список поможет сохранять честность при последующих изменениях кода. Лучше использовать небольшие, тестируемые единицы кода, чем обширные скрипты. При сбое на каком-либо этапе причина неудачи должна указывать на конкретную ответственность, а не на запутанную цепочку операций. Выполняйте проверки после дорогостоящих шагов. Функция возобновления работы не должна повторно оплачивать один и тот же вызов большой языковой модели, когда оператор пытается выполнить следующий узел.
podman network create browser-egress
Шаг 5 — Пересоздание пода Hermes
При выполнении шага 5 «Воссоздание сцены» сначала запишите контракт: необходимые входные данные, сигнал о успехе и действия при частичной неудаче. Такой чек-лист поможет сохранять честность при последующих изменениях кода. Рассматривайте эту сцену как контракт между входными данными и проверенными выходными результатами. Укажите названия элементов, определите критерии успеха и не допускайте безответственного частичного выполнения задачи. Создавайте контрольные точки после дорогостоящих операций. При повторной попытке выполнения последующего элемента система не должна снова запрашивать один и тот же вызов LLM.
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
Шаг 6 — Воссоздание Ollama
При работе над шагом 6 «Воссоздание среды Ollama» сначала запишите условия взаимодействия: необходимые входные данные, сигнал о успешном выполнении и действия при частичной неудаче. Такой список поможет сохранять честность при последующих изменениях кода. Запишите также время выполнения и стоимость токенов или запросов рядом с функциональными результатами. Отслеживание затрат заранее предотвращает неожиданные счета при переходе от демо-среды к общедоступным средам. Ведите журнал с информацией об идентификаторе запроса, идентификаторе модели и времени задержки при каждом вызове. Без такой записи периодические ошибки поставщика могут показаться багами приложения. При работе над шагом 6 «Воссоздание среды Ollama» сначала запишите условия взаимодействия: необходимые входные данные, сигнал о успешном выполнении и действия при частичной неудаче. Такой список поможет сохранять честность при последующих изменениях кода. Одновременно задокументируйте успешный сценарий работы и сценарий восстановления. Повторные попытки, проверки человеком и обработка неработоспособных сообщений являются частью продукта, а не элементами последующей доработки.
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
Шаг 7 — Пересоздание Hermes
Этап пересоздания Hermes в рамках шага 7 работает наилучшим образом, если рассматривать его как измеримую структуру. Сохраните один пример успешной работы, один случай сбоя и записку о возврате к предыдущему состоянию перед расширением объёма работ. Предпочитайте небольшие, тестируемые единицы кода вместо обширных скриптов. При сбое какого-либо шага причина сбоя должна указывать на конкретную ответственность, а не на запутанную цепочку операций. Сохраняйте структуру графа простой и типизированной. Вложенные структуры данных маскируют информацию о том, какой узел заполнил тот или иной поле, и мешают возобновлению работы после прерываний.
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
Шаг 8 — Загрузка безголового шелла Chrome
Этап 8 «Загрузка Chrome» работает наилучшим образом, если рассматривать его как измеримую поверхность. Сохраните один идеальный пример работы, один случай сбоя и записку о возврате к предыдущему состоянию перед расширением объёма работ. Рассматривайте этот этап как контракт между входными данными и проверенными выходными результатами. Дайте названия создаваемым элементам, определите критерии успешного завершения и не допускайте молчаливого частичного выполнения задачи. Сохраняйте структуру графа простой и типизированной. Вложенные структуры скрывают информацию о том, какой узел заполнил тот или иной поле, что приводит к нарушению возобновления работы после перерывов.
podman pull docker.io/chromedp/headless-shell:latest
Этап 9 — Создание отдельного пода Chrome
Шаг 9 «Создание этапа» работает наилучшим образом, если рассматривать его как измеримую поверхность. Соберите один идеальный пример работы, один случай сбоя и записку о возврате к предыдущему состоянию до расширения объёма работ. Записывайте временные показатели, а также стоимость токенов или запросов рядом с функциональными результатами. Отображение стоимости на раннем этапе предотвращает неожиданные счёты при переходе от демо-среды к общедоступным средам. Сохраняйте структуру графа простой и типизированной. Вложенные структуры скрывают информацию о том, какой узел заполнил какое поле, и могут нарушить возобновление работы после прерываний. Шаг 9 «Создание этапа» работает наилучшим образом, если рассматривать его как измеримую поверхность. Соберите один идеальный пример работы, один случай сбоя и записку о возврате к предыдущему состоянию до расширения объёма работ. Документируйте одновременно успешный путь выполнения и путь восстановления. Повторные попытки, проверки человеком и обработка неработающих сообщений являются частью продукта, а не элементами последующей доработки.
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
Шаг 10 — Запуск Chrome внутри браузерного подпроцесса
На этапе «Запуск Chrome на шаге 10» необходимо определить входные данные, ответственного за шаг и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Лучше использовать небольшие, тестируемые единицы кода вместо обширных скриптов. При сбое шага он должен указывать на конкретную причину, а не на сложную структуру обработки данных. Внедрять утверждение человека там, где происходит трата средств или изменение данных в продакшене. Конфигурация на этапе компиляции не заменяет полноты бизнес-логики.
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
Шаг 11 — Тестирование Chrome из контейнера Hermes
На этапе тестирования Chrome в рамках Шага 11 необходимо заранее определить входные данные, ответственного за выполнение шага и критерии завершения перед внесением изменений в код. Операторы должны иметь возможность перезапустить шаг, исходя из известной точки контроля, без необходимости угадывания скрытого состояния. Рассматривайте этот этап как контракт между входными данными и проверенными результатами. Дайте названия соответствующим элементам, определите критерии успеха и не допускайте молчаливого частичного выполнения задачи. Обеспечьте человеческое утверждение для операций, связанных с расходованием средств или изменением производственных данных. Простая настройка во время компиляции не гарантирует полноты выполнения бизнес-задач.
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
Шаг 12 — Проверка наличия у Chrome доступа в Интернет
На этапе проверки шага 12 необходимо определить входные данные, ответственного за выполнение шага и критерии завершения перед внесением изменений в код. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Записывайте время выполнения и стоимость токенов или запросов рядом с функциональными результатами. Отображение стоимости заранее предотвращает неожиданные счета при переходе с демо-среды в общедоступные среды. Внедряйте человеческое утверждение для операций, связанных с тратой денег или изменением производственных данных. Настройки во время компиляции не гарантируют полноты функционала продукта. На этапе проверки шага 12 необходимо определить входные данные, ответственного за выполнение шага и критерии завершения перед внесением изменений в код. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Документируйте одновременно «идеальный» путь выполнения и путь восстановления. Повторные попытки, человеческое утверждение и обработка некорректных сообщений являются частью продукта, а не элементами последующей доработки.
podman exec hermes-browser \
curl -I https://example.com
browser-egress
Шаг 13 — Проверка отсутствия прямого доступа Hermes в Интернет
При выполнении этапа Шаг 13 «Проверка Hermes» сначала запишите условия работы: необходимые входные данные, сигнал о успешном выполнении и действия при частичной неудаче. Такой чек-лист поможет сохранять честность при последующих изменениях кода. Предпочитайте небольшие, тестируемые модули вместо обширных скриптов. При сбое на каком-либо этапе причина неудачи должна указывать на конкретную ответственность, а не на запутанную цепочку операций. Выполняйте контрольные точки после дорогостоящих шагов. Система возобновления работы не должна повторно взимать плату за один и тот же вызов LLM при повторной попытке обработки последующего узла оператором.
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
Шаг 14 — Настройка Hermes на удаленную инстанцу Chrome
При работе над этапом Шаг 14 «Point Hermes» сначала запишите контракт: необходимые входные данные, сигнал успешного выполнения и действия при частичной неудаче. Такой чек-лист поможет сохранять честность при последующих изменениях кода. Рассматривайте этот этап как контракт между входными данными и проверенными выходными результатами. Дайте названия элементам, определите критерии успешности и не допускайте безусловного частичного завершения работы. Выполняйте контрольные точки после дорогостоящих шагов. Система возобновления работы не должна снова взимать плату за один и тот же вызов большой языковой модели, когда оператор пытается выполнить следующий узел заново.
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
Шаг 15 — Проверка с помощью Hermes
При работе над этапом тестирования Шаг 15 сначала запишите «контракт»: необходимые входные данные, сигнал о успехе и действия при частичной неудаче. Такой чек-лист помогает сохранять честность при последующих изменениях кода. Запишите время выполнения и стоимость токенов или запросов рядом с функциональными результатами. Отображение стоимости заранее предотвращает неожиданные счета при переходе с демо-среды в общедоступные среды. Выполняйте контрольные точки после дорогостоящих шагов. Система возобновления работы не должна снова взимать плату за один и тот же вызов LLM при повторной попытке обработки последующего узла. При работе над этапом тестирования Шаг 15 сначала запишите «контракт»: необходимые входные данные, сигнал о успехе и действия при частичной неудаче. Такой чек-лист помогает сохранять честность при последующих изменениях кода. Документируйте одновременно успешный сценарий работы и сценарий восстановления. Повторные попытки, проверки человеком и обработка неработоспособных сообщений являются частью продукта, а не элементами последующей доработки.
podman exec -it \
--user 10000:10000 \
-w /opt/data/workspace \
hermes \
hermes
Важно: речь идет о доступе через браузер, а не об неограниченном интернет-доступе Hermes
Этот этап работы в браузере будет наиболее эффективным, если рассматривать его как измеримую среду. Соберите один идеальный пример работы, один случай сбоя и записку о возврате к предыдущему состоянию перед расширением объема работ. Предпочитайте небольшие, тестируемые единицы кода вместо обширных скриптов. Когда происходит сбой на каком-либо шаге, он должен указывать на конкретную ответственность, а не на запутанную цепочку операций. Сохраняйте структуру графа простой и типизированной. Вложенные структуры данных маскируют информацию о том, какой узел заполнил тот или иной поле, и мешают возобновлению работы после прерываний.
Hermes browser tools
↓
Chrome
↓
Internet
curl https://example.com
Почему бы не разместить Chrome в контейнере Hermes?
Этот этап работает лучше всего, если рассматривать его как измеримую поверхность. Сохраните один идеальный пример работы, один случай сбоя и записку о возврате к предыдущему состоянию перед расширением объёма работ. Рассматривайте этот этап как контракт между входными данными и проверенными выходными результатами. Дайте названия всем элементам, определите критерии успеха и не соглашайтесь на молчаливое частичное выполнение задачи. Сохраняйте структуру графа простой и типизированной. Вложенные структуры скрывают информацию о том, какой узел заполнил тот или иной поле, что приводит к нарушению возобновления работы после перерывов.
127.0.0.1:9222
Hermes pod:
private network only
Browser pod:
private network
+
Internet network
Не загружайте свой обычный профиль Chrome
Подход «Не монтируйте вашу сцену» работает наилучшим образом, когда его рассматривают как измеримую поверхность. Зафиксируйте один идеальный пример работы, один случай сбоя и записку о возврате к предыдущему состоянию перед расширением объема работ. Записывайте временные показатели, а также стоимость токенов или запросов рядом с функциональными результатами. Отслеживание затрат на раннем этапе предотвращает неожиданные счета при переходе от демо-среды к общедоступным средам. Сохраняйте состояние графа простым и типизированным. Вложенные структуры скрывают информацию о том, какой узел записал какое поле, и нарушают возможность продолжения работы после прерываний. Подход «Не монтируйте вашу сцену» работает наилучшим образом, когда его рассматривают как измеримую поверхность. Зафиксируйте один идеальный пример работы, один случай сбоя и записку о возврате к предыдущему состоянию перед расширением объема работ. Документируйте одновременно успешный путь выполнения и путь восстановления. Повторные попытки, проверки человеком и обработка неработающих сообщений являются частью продукта, а не элементами последующей доработки.
-v "$HOME/.config/google-chrome:/chrome-profile"
Необязательно: профиль браузера постоянного агента
Для необязательной стадии работы агента в браузере, предусматривающей постоянную работу, необходимо заранее определить входные данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг, исходя из известной точки контроля, без необходимости угадывать скрытое состояние. Лучше использовать небольшие, тестируемые единицы кода вместо обширных скриптов. При сбое шага причина должна быть связана с конкретной функцией, а не с запутанной структурой обработки данных. Внедрять человеческое утверждение там, где происходит трата средств или изменение данных в продакшене. Наличие связей на этапе компиляции не гарантирует полноты функционала системы.
podman volume create hermes-browser-profile
Human browser profile separate
Agent browser profile separateHost filesystem separate
CDP должен оставаться приватным
Поскольку CDP должен оставаться на этапе приватного использования, необходимо определить входные данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Рассматривайте этот этап как контракт между входными данными и проверенными выходными результатами. Дайте названия результатам работы, определите критерии успеха и не допускайте молчаливого частичного завершения задачи. Внедрите процедуру утверждения человеком для операций, связанных с тратой денег или изменением производственных данных. Подключение компонентов во время компиляции не гарантирует полноты выполнения бизнес-задач.
10.77.0.20:9222
hermes-browser-link
0.0.0.0:9222 -> Chrome
Проверка изоляции
На этапе проверки изоляции необходимо заранее определить входные данные, ответственного за выполнение шага и критерии завершения перед внесением изменений в код. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии системы. Регистрируйте время выполнения операций, а также стоимость токенов или запросов рядом с функциональными результатами. Отображение стоимости на раннем этапе предотвращает неожиданные счета при переходе от демо-среды к общедоступным средам. Внедряйте человеческое утверждение для операций, связанных с тратой средств или изменением производственных данных. Настройки, выполненные во время компиляции, не гарантируют полноты функционала продукта. На этапе проверки изоляции необходимо заранее определить входные данные, ответственного за выполнение шага и критерии завершения перед внесением изменений в код. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии системы. Документируйте одновременно «идеальный» сценарий работы и сценарий восстановления. Повторные попытки, человеческое утверждение и обработка некорректных сообщений являются частью продукта, а не элементами, добавляемыми позже.
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
Автоматическое запускание обоих подов
При работе над этапом автоматического запуска обоих подов сначала опишите контракт: необходимые входные данные, сигнал о успехе и действия при частичной неудаче. Такой чек-лист поможет сохранять честность при последующих изменениях кода. Предпочитайте небольшие, тестируемые единицы кода вместо обширных скриптов. Если какой-то шаг не сработает, причина неудачи должна указывать на конкретную ответственность, а не на запутанную цепочку операций. Вносите контрольные точки после дорогостоящих шагов. Функция возобновления работы не должна повторно запрашивать один и тот же вызов LLM при попытке оператора перезапустить более поздний узел.
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
Устранение неполадок
При работе на этапе устранения неполадок сначала запишите контракт: необходимые входные данные, сигнал успешного выполнения и то, что происходит при частичной неудаче. Такой чек-лист помогает сохранять честность при последующих изменениях кода. Рассматривайте этот этап как контракт между входными данными и проверенными выходными результатами. Укажите названия элементов, определите критерии успешности и не допускайте безусловного частичного завершения работы. Выполняйте контрольные точки после дорогостоящих операций. Система возобновления работы не должна снова взимать плату за один и тот же вызов LLM, когда оператор пытается выполнить следующий шаг.
Hermes не может подключиться к порту 9222
Когда при работе с Hermes не удается достичь нужной стадии, сначала запишите условия работы: необходимые входные данные, сигнал о успешном выполнении и действия при частичной неудаче. Такой чек-лист помогает сохранять честность при последующих изменениях кода. Записывайте время выполнения и стоимость токенов или запросов рядом с функциональными результатами. Очевидность затрат с самого начала предотвращает неожиданные счета при переходе от демо-среды к общедоступным средам. Выполняйте контрольные точки после дорогостоящих шагов. Система возобновления работы не должна снова взимать плату за один и тот же вызов LLM при повторной попытке обработки последующего узла. Когда при работе с Hermes не удается достичь нужной стадии, сначала запишите условия работы: необходимые входные данные, сигнал о успешном выполнении и действия при частичной неудаче. Такой чек-лист помогает сохранять честность при последующих изменениях кода. Документируйте одновременно успешный сценарий работы и сценарий восстановления. Повторные попытки, проверки человеком и обработка неработоспособных сообщений являются частью продукта, а не элементами последующей доработки.
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 запускается, но страницы выходят из строя
Chrome может запускаться, но для лучшей работы необходимо рассматривать его как измеримую среду. Сначала зафиксируйте один успешный пример работы, один случай сбоя и записку о возврате к предыдущему состоянию, прежде чем расширять объем работ. Предпочитайте небольшие, тестируемые единицы кода вместо обширных скриптов. При сбое какого-либо шага причина должна быть связана с конкретной функцией, а не с запутанной цепочкой операций. Сохраняйте структуру графа простой и типизированной. Вложенные структуры данных мешают понять, какой узел заполнил тот или иной поле, и приводят к нарушению продолжения работы после перерывов.
--shm-size=2g
Chrome работает, но инструменты браузера Hermes не появляются
Chrome работает, но этап Hermes функционирует наилучшим образом, когда рассматривается как измеримая среда. Соберите один пример успешного выполнения, один случай сбоя и записку о возврате к предыдущему состоянию перед расширением объема работ. Рассматривайте этот этап как контракт между входными данными и проверенными выходными результатами. Дайте названия элементам, определите критерии успеха и не допускайте молчаливого частичного завершения задачи. Используйте инструменты с узкими схемами и четкими метками о побочных эффектах. У хостов должна быть возможность узнать, какие вызовы изменяют состояние, прежде чем они автоматически одобрят их.
browser:
cdp_url: http://10.77.0.20:9222
nano недоступен внутри контейнера Hermes
На этапе, когда nano ещё недоступен, лучше всего работать с ним как с измеримой поверхностью. Сохраните один идеальный пример работы, один случай сбоя и записку о возврате к предыдущему состоянию перед расширением объёма работ. Записывайте временные показатели, а также стоимость токенов или запросов рядом с функциональными результатами. Отображение стоимости на раннем этапе предотвращает неожиданные счёты при переходе от демо-среды к общедоступным средам. Сохраняйте структуру графа простой и типизированной. Вложенные структуры скрывают информацию о том, какой узел заполнил какое поле, и могут нарушить возобновление работы после прерываний. На этапе, когда nano ещё недоступен, лучше всего работать с ним как с измеримой поверхностью. Сохраните один идеальный пример работы, один случай сбоя и записку о возврате к предыдущему состоянию перед расширением объёма работ. Документируйте одновременно успешный путь выполнения и путь восстановления. Повторные попытки, проверки человеком и обработка неработающих сообщений являются частью продукта, а не элементами последующей доработки.
hermes config set
podman exec \
--user 10000:10000 \
hermes \
hermes config set browser.cdp_url http://10.77.0.20:9222
Готовая модель безопасности
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
Почему вы предпочитаете эту архитектуру
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