Локальные AI-агенты, Git и DevOps/aka-gst

Раздел · 20 мин

Часть I. Самостоятельная настройка с нуля

Содержание раздела
  1. 1. Что именно собирается
  2. 2. Как выбрать маршрут
  3. 3. Что человек всё равно делает сам
  4. 4. Требования к компьютеру и каталогу
  5. 5. Предварительная установка
  6. Установка базовых инструментов
  7. Проверка
  8. 6. Установка и запуск Codex
  9. Первый запуск
  10. 7. Установка и настройка Hermes Agent
  11. Установка Hermes
  12. Разделение профилей
  13. Запуск Hermes API Server
  14. 8. OpenRouter: только если нужен облачный маршрут
  15. 9. Создание рабочей папки и получение Open-LLM-VTuber
  16. Клонирование
  17. Зависимости
  18. 10. Воспроизведение upstream baseline
  19. Запуск без изменения source
  20. 11. Ollama и qwen3-vl:4b
  21. Модель и health check
  22. Текстовый smoke test
  23. 12. Безопасное изменение conf.yaml
  24. Backup и синтаксическая проверка
  25. 13. Локальный русский ASR
  26. 14. Локальный TTS через pyttsx3
  27. Список голосов без персональных путей
  28. Изолированный TTS smoke test
  29. 15. Минимальный local-agent-gateway
  30. Получение и тесты
  31. Запуск gateway
  32. 16. Порядок запуска четырёх окон
  33. Проверка портов
  34. 17. End-to-end smoke tests
  35. 18. Остановка и откат
  36. 19. Диагностика по симптомам
  37. 20. Один master prompt для AI
  38. 21. Формат итогового отчёта
  39. 22. Официальные источники и проверка актуальности

Назначение. Эта часть не требует предыдущего практикума. Она ведёт от чистой Windows- или macOS-системы до локального голосового и экранного агента, а затем показывает три взаимозаменяемых маршрута LLM: прямой Ollama, Hermes API Server или минимальный local-agent-gateway.

1. Что именно собирается

Итоговая система состоит из независимых компонентов. Их нельзя называть одним словом «агент»: у каждого своя роль.

КомпонентРольГде работаетОбязателен
CodexИнженер: читает репозиторий, планирует, меняет файлы, запускает проверкиDesktop/CLIНет, если используется Hermes как инженер
Hermes AgentИнженер и/или OpenAI-совместимый runtime с инструментамиCLI/Desktop/API serverТолько для Hermes-маршрута
Open-LLM-VTuberИнтерфейс, Live2D, диалог, WebSocket, ASR/TTS orchestrationPython-сервер + браузер/ElectronДа
OllamaЛокально запускает LLM/VLM127.0.0.1:11434Да для локального маршрута
Sherpa-ONNXЛокально распознаёт микрофонВ процессе VTuberДля voice baseline
pyttsx3Локально озвучивает ответ системным голосомВ процессе VTuberДля локального TTS
Local gatewayBearer auth, allowlists, request ID, безопасные ошибки и streaming127.0.0.1:8642Один из gateway-маршрутов
OpenRouterНеобязательный облачный провайдер моделейИнтернет/APIНет

Схема потоков

Микрофон -> Sherpa-ONNX ASR -----------------------------+
Скриншот/экран -> Open-LLM-VTuber -> выбранный LLM endpoint |
v
ответ -> pyttsx3 -> динамики

Маршрут A: Open-LLM-VTuber -> Ollama:11434
Маршрут B: Open-LLM-VTuber -> Hermes:8642 -> выбранная Hermes-модель
Маршрут C: Open-LLM-VTuber -> local-agent-gateway:8642 -> Ollama:11434

Главное различие. Codex не является постоянным локальным HTTP gateway. Он может создать, настроить и проверить gateway, но Open-LLM-VTuber не может отправлять runtime-запросы непосредственно в текущий чат Codex.

2. Как выбрать маршрут

Нужен результатВыборПочему
Самый простой полностью локальный VTuberПрямой OllamaМеньше процессов и конфигурации
Hermes, память и инструменты внутри runtimeHermes API ServerOpenAI-compatible API и полный toolset Hermes
Минимальный контролируемый шлюз к Ollamalocal-agent-gatewayУзкий код, allowlists, тесты и нейтральные ошибки
Быстро менять облачные моделиHermes + OpenRouter или прямой OpenRouterОдин API, но данные уходят во внешний сервис

Рекомендованный учебный маршрут. Сначала докажите прямой Ollama baseline. Затем добавьте ровно один gateway. Так ошибка всегда локализуется между уже проверенными границами.

3. Что человек всё равно делает сам

  • Подтверждает установщики и системные диалоги Windows/macOS.
  • Проходит вход в ChatGPT/Codex, GitHub, Hermes/Nous Portal или OpenRouter.
  • Даёт браузеру доступ к микрофону, камере или демонстрации экрана.
  • Произносит тестовую фразу и подтверждает, был ли слышен звук.
  • Решает, публиковать ли ветку и создавать ли draft PR.
  • Никогда не вставляет секрет в чат: вводит его локально в защищённый файл или системный prompt.

Почему AI не может сделать буквально всё. Авторизация, выбор устройства ввода, прослушивание динамиков и выдача GUI-разрешений являются границами человеческого контроля. Хороший агент доходит до такой границы, сообщает одну точную операцию и после неё продолжает без повторного объяснения.

4. Требования к компьютеру и каталогу

ПараметрWindowsmacOS
ОСWindows 10/11 x64; PowerShell 7 желательноmacOS 13+ желательно; Intel или Apple Silicon
ТерминалWindows Terminal + PowerShell 7Terminal/iTerm + zsh
Рабочая папкаC:\dev\agent-lab~/dev/agent-lab
ПутьASCII, без OneDrive и длинных имёнБез iCloud Drive и сложных пробелов
RAM16 ГБ минимум для 4B VLM; больше лучше16 ГБ unified memory минимум; больше лучше
Свободное местоНе менее 15-25 ГБНе менее 15-25 ГБ

5. Предварительная установка

Устанавливайте системные компоненты вручную. AI сначала проверяет наличие и только затем предлагает отсутствующее. Не запускайте одновременно несколько package manager-команд.

Установка базовых инструментов

Windows PowerShell 7

winget install --id Microsoft.PowerShell --source winget
winget install --id Git.Git -e
winget install --id GitHub.cli -e
winget install --id Gyan.FFmpeg -e
winget install --id astral-sh.uv -e
# Ollama: установите официальное Windows-приложение или:
winget install --id Ollama.Ollama -e
# После установки закройте и заново откройте Terminal.

macOS Terminal (zsh)

# Установите Homebrew с brew.sh, если его ещё нет.
brew install git gh ffmpeg uv
brew install --cask ollama
# Запустите Ollama из Applications один раз.
exec zsh

Проверка

Windows PowerShell 7

pwsh --version
git --version
gh --version
uv --version
ffmpeg -version
ollama --version
gh auth status

macOS Terminal (zsh)

zsh --version
git --version
gh --version
uv --version
ffmpeg -version
ollama --version
gh auth status

Нормальный результат. Все version-команды завершаются с кодом 0. `gh auth status` может требовать `gh auth login`; токен нельзя копировать в отчёт.

6. Установка и запуск Codex

Codex используется здесь как инженерный агент. Выбирайте Desktop-приложение, если важны изображения и удобные разрешения, либо CLI для воспроизводимого терминального процесса.

Первый запуск

Windows PowerShell 7

# Рекомендуется официальный Codex Desktop installer.
# Для CLI используйте официальный установщик, показанный приложением/документацией.
codex --version
Set-Location C:\dev\agent-lab
codex

macOS Terminal (zsh)

# Установите Codex Desktop для macOS либо официальный CLI.
codex --version
mkdir -p ~/dev/agent-lab
cd ~/dev/agent-lab
codex

Windows sandbox. Если CLI сообщает, что `codex-windows-sandbox-setup.exe` не найден, сначала обновите Codex и перезапустите терминал. Не обходите проблему постоянным полным разрешением. Для разовой read-only команды допустимо выбрать однократное выполнение вне сломанной sandbox только после проверки команды и cwd.

macOS permissions. Первый доступ Codex к каталогу Desktop/Documents, браузеру или автоматизации может вызвать системный диалог Privacy & Security. Разрешайте только нужный каталог или действие; Full Disk Access для практикума не требуется.

PROMPT: безопасная проверка Codex

Работай как инженер в режиме контролируемого агента на Windows.
Текущая рабочая папка: C:\dev\agent-lab. Не предполагай, что команды другой ОС работают здесь.

Перед изменением файлов:
1. Покажи карту релевантной части репозитория и входные точки.
2. Сформулируй одну атомарную цель.
3. Перечисли файлы чтения и изменения.
4. Назови риски, предположения и реальные команды проверки.
5. Сначала покажи план. Не меняй файлы до моего явного «одобряю».

Ограничения:
- не используй sudo; не выполняй rm -rf, git reset --hard, git clean -fd и force push;
- не изменяй main и upstream без отдельного явного разрешения;
- не читай и не печатай .env, токены, SSH-ключи, cookies, keychain и полный conf.yaml;
- не трогай файлы вне текущего проекта;
- не ставь глобальные пакеты без отдельного обоснования;
- не скрывай ошибки и не заменяй тест утверждением;
- после изменения покажи краткий diff, реальный минимальный тест и git status --short;
- если требуется расширение scope, остановись и запроси новый атомарный шаг.

Классифицируй ошибки как environment, configuration, dependency, source или test limitation.
Не задавай вопросов, ответ на которые можно безопасно получить read-only проверкой. Останавливайся
только перед секретом, GUI-разрешением ОС, внешней публикацией или расширением scope.

Текущая задача: только инвентаризировать среду. Выполни Get-Location и версии git, gh, uv, ollama. Ничего не изменяй. Не печатай токены.

PROMPT: тот же шаг на macOS

Работай как инженер в режиме контролируемого агента на macOS.
Текущая рабочая папка: ~/dev/agent-lab. Не предполагай, что команды другой ОС работают здесь.

Перед изменением файлов:
1. Покажи карту релевантной части репозитория и входные точки.
2. Сформулируй одну атомарную цель.
3. Перечисли файлы чтения и изменения.
4. Назови риски, предположения и реальные команды проверки.
5. Сначала покажи план. Не меняй файлы до моего явного «одобряю».

Ограничения:
- не используй sudo; не выполняй rm -rf, git reset --hard, git clean -fd и force push;
- не изменяй main и upstream без отдельного явного разрешения;
- не читай и не печатай .env, токены, SSH-ключи, cookies, keychain и полный conf.yaml;
- не трогай файлы вне текущего проекта;
- не ставь глобальные пакеты без отдельного обоснования;
- не скрывай ошибки и не заменяй тест утверждением;
- после изменения покажи краткий diff, реальный минимальный тест и git status --short;
- если требуется расширение scope, остановись и запроси новый атомарный шаг.

Классифицируй ошибки как environment, configuration, dependency, source или test limitation.
Не задавай вопросов, ответ на которые можно безопасно получить read-only проверкой. Останавливайся
только перед секретом, GUI-разрешением ОС, внешней публикацией или расширением scope.

Текущая задача: только инвентаризировать среду. Выполни pwd и версии git, gh, uv, ollama. Ничего не изменяй. Не читай Keychain.

7. Установка и настройка Hermes Agent

Hermes может играть две роли: инженерный CLI и постоянный OpenAI-compatible API Server. Не смешивайте их в одном объяснении: интерфейс `hermes chat` не является endpoint, а `hermes gateway` является.

Установка Hermes

Windows PowerShell 7

iex (irm https://hermes-agent.nousresearch.com/install.ps1)
# Откройте новый PowerShell
hermes --version
hermes doctor
hermes setup --portal

macOS Terminal (zsh)

curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash
exec zsh
hermes --version
hermes doctor
hermes setup --portal

Если Nous Portal не используется, выполните `hermes model` и интерактивно выберите OpenRouter, Ollama или другой провайдер. Ключ вводится только в локальный secret prompt/конфигурацию Hermes.

Разделение профилей

Windows PowerShell 7

hermes profile create olv-runtime
olv-runtime setup
olv-runtime tools
# Для разработки отдельно:
hermes profile create coder
coder setup

macOS Terminal (zsh)

hermes profile create olv-runtime
olv-runtime setup
olv-runtime tools
# Для разработки отдельно:
hermes profile create coder
coder setup

Ограничение toolset. API Server Hermes даёт доступ к инструментам агента. Для профиля `olv-runtime` отключите terminal, file, browser, code_execution, delegation и cronjob, если VTuber не должен управлять компьютером. Профиль разделяет состояние, но не является filesystem sandbox.

Для включения Hermes API Server задайте в конфигурации профиля: enabled=true, host=127.0.0.1, port=8642 и уникальный bearer key. Предпочитайте `hermes dashboard` или `hermes config`; не публикуйте `.env` профиля.

Схема параметров — не вставляйте реальный ключ в документ или чат

API_SERVER_ENABLED=true
API_SERVER_HOST=127.0.0.1
API_SERVER_PORT=8642
API_SERVER_KEY=<UNIQUE_LOCAL_KEY>
# CORS не задавайте, если браузер не вызывает Hermes напрямую.

Запуск Hermes API Server

Windows PowerShell 7

olv-runtime gateway
# В другом окне:
Invoke-RestMethod http://127.0.0.1:8642/health

macOS Terminal (zsh)

olv-runtime gateway
# В другом окне:
curl -fsS http://127.0.0.1:8642/health

PROMPT: настроить Hermes как ограниченный runtime

Проведи настройку отдельного Hermes-профиля `olv-runtime` как loopback-only OpenAI-compatible API Server.
Сначала read-only проверь текущую версию Hermes и актуальный синтаксис через `hermes --help` и `hermes gateway --help`.
Не читай и не печатай существующие secret files. Не генерируй ключ в сообщении. Попроси меня один раз ввести новый локальный bearer key через безопасный локальный ввод.
Настрой host 127.0.0.1, port 8642, обязательную bearer-аутентификацию и минимальный toolset без terminal, file, browser, code_execution, delegation и cronjob.
Не ослабляй CORS. До изменения покажи точные параметры и план. После подтверждения запусти gateway, проверь /health, отрицательный запрос без auth и один обезличенный chat-completions smoke test. В отчёте покажи только статусы, request id и redacted key length.

8. OpenRouter: только если нужен облачный маршрут

  • Создайте ключ на сайте OpenRouter и сохраните его только в локальном secret store выбранного клиента.
  • Проверьте актуальный model id перед каждым экспериментом: бесплатные модели и лимиты меняются.
  • Не отправляйте закрытый код, `.env`, голосовые записи и несокращённые скриншоты.
  • В Hermes выберите OpenRouter через `hermes model`; не подставляйте OPENROUTER_API_KEY в командную строку.
  • В Codex OpenRouter не требуется для работы самого Codex; это отдельный runtime для приложения.

Граница данных. Облачная модель получает содержимое prompt и переданные изображения. Локальный Ollama не отправляет inference-запрос в облако, но первоначальная загрузка модели требует сети.

9. Создание рабочей папки и получение Open-LLM-VTuber

Клонирование

Windows PowerShell 7

New-Item -ItemType Directory -Force C:\dev\agent-lab | Out-Null
Set-Location C:\dev\agent-lab
git clone --recursive https://github.com/Open-LLM-VTuber/Open-LLM-VTuber.git
Set-Location .\Open-LLM-VTuber
git submodule status
git status --short

macOS Terminal (zsh)

mkdir -p ~/dev/agent-lab
cd ~/dev/agent-lab
git clone --recursive https://github.com/Open-LLM-VTuber/Open-LLM-VTuber.git
cd Open-LLM-VTuber
git submodule status
git status --short

Не используйте Code → Download ZIP. Frontend является Git submodule. Обычный ZIP может дать `Detail Not Found` и лишить проект корректной Git-истории.

Зависимости

Windows PowerShell 7

uv sync

macOS Terminal (zsh)

uv sync

Первый запуск может скачать ASR-модели. Не классифицируйте длительное отсутствие вывода как зависание, пока процесс жив и сеть/диск активны.

10. Воспроизведение upstream baseline

Запуск без изменения source

Windows PowerShell 7

Set-Location C:\dev\agent-lab\Open-LLM-VTuber
uv sync
uv run run_server.py --verbose

macOS Terminal (zsh)

cd ~/dev/agent-lab/Open-LLM-VTuber
uv sync
uv run run_server.py --verbose

  • Успех: сервер слушает `localhost:12393`, браузер получает HTTP 200 и source tree не изменён.
  • Если `conf.yaml` отсутствует, первый запуск обычно создаёт его; остановите сервер Ctrl+C и проверьте файл по имени, не печатая содержимое.
  • Если uv cache недоступен только агенту, повторите ту же команду с одноразовым разрешением вне sandbox. Это environment, а не dependency.
  • Если процесс жив, но порт не слушает, сохраните время ожидания и классифицируйте как environment до появления traceback.

11. Ollama и qwen3-vl:4b

Модель и health check

Windows PowerShell 7

ollama list
ollama pull qwen3-vl:4b
Invoke-RestMethod http://127.0.0.1:11434/api/tags | Select-Object -ExpandProperty models

macOS Terminal (zsh)

ollama list
ollama pull qwen3-vl:4b
curl -fsS http://127.0.0.1:11434/api/tags

Порт занят. На Windows Ollama tray app и на macOS Ollama.app уже могут слушать 11434. Не запускайте второй `ollama serve`, если health check работает.

Текстовый smoke test

Windows PowerShell 7

$body = @{model='qwen3-vl:4b'; messages=@(@{role='user';content='Ответь одним словом: готово'}); stream=$false} | ConvertTo-Json -Depth 5
Invoke-RestMethod -Method Post -Uri http://127.0.0.1:11434/v1/chat/completions -ContentType 'application/json' -Body $body

macOS Terminal (zsh)

curl -sS http://127.0.0.1:11434/v1/chat/completions \
-H 'Content-Type: application/json' \
-d '{"model":"qwen3-vl:4b","messages":[{"role":"user","content":"Ответь одним словом: готово"}],"stream":false}'

12. Безопасное изменение conf.yaml

Версия важнее примера. Не заменяйте весь `conf.yaml` фрагментом из другого релиза. Сначала найдите существующие ключи и их реальные отступы, затем меняйте только значения.

Для прямого Ollama выберите существующий `ollama_llm`. Для gateway выберите существующий `openai_compatible_llm`. В релизе 1.2.1 путь начинается с `character_config`, а не `system_config`.

Маршрутllm_providerbase_urlmodel/key
Прямой Ollamaollama_llmhttp://127.0.0.1:11434qwen3-vl:4b; key не нужен
Hermesopenai_compatible_llmhttp://127.0.0.1:8642/v1обычно hermes-agent + API_SERVER_KEY
local gatewayopenai_compatible_llmhttp://127.0.0.1:8642/v1qwen3-vl:4b + GATEWAY_BEARER_TOKEN

Backup и синтаксическая проверка

Windows PowerShell 7

Copy-Item .\conf.yaml ".\conf.yaml.before-setup.$(Get-Date -Format yyyyMMdd-HHmmss)"
# Откройте файл в локальном редакторе, не выводите его в терминал.
uv run python -c "from pathlib import Path; import yaml; yaml.safe_load(Path('conf.yaml').read_text(encoding='utf-8')); print('YAML_OK')

macOS Terminal (zsh)

cp conf.yaml "conf.yaml.before-setup.$(date +%Y%m%d-%H%M%S)"
# Откройте файл в локальном редакторе, не выводите его в терминал.
uv run python -c "from pathlib import Path; import yaml; yaml.safe_load(Path('conf.yaml').read_text()); print('YAML_OK')

Реальная ошибка, которую нужно узнавать. Если `basic_memory_agent` и `llm_provider` имеют одинаковый отступ, provider становится соседним ключом и Pydantic/YAML падает. Исправляйте только отступ конкретной строки, затем полностью разбирайте YAML.

PROMPT: точечно настроить conf.yaml

Работай только с локальным игнорируемым conf.yaml Open-LLM-VTuber. Не печатай весь файл и секреты.
Сначала разберись с реальной YAML-структурой программно и покажи существующие пути для basic_memory_agent.llm_provider, openai_compatible_llm.base_url, llm_api_key и model. Не полагайся на путь из моего текста, если схема отличается.
Атомарная цель: настроить выбранный мной маршрут, изменив минимальное число scalar values. Создай timestamped backup. До изменения покажи безопасный redacted diff и дождись подтверждения. После изменения полностью распарсь YAML и проверь точные пути, показывая ключ как <redacted> и только его длину. Source, templates и dependencies не меняй.

13. Локальный русский ASR

Выберите существующий backend `sherpa_onnx_asr`. Модели и допустимые значения определяются текущей версией проекта; не придумывайте имена ключей.

  • В браузере разрешите микрофон только для localhost:12393.
  • Сначала используйте наушники либо выключите динамики, чтобы доказать отсутствие feedback loop.
  • Произнесите короткую фразу с уникальным числом, например «Проверка локального распознавания 4827».
  • В evidence сохраняйте transcript, но не сохраняйте исходное аудио без необходимости.
  • Cloud ASR keys и endpoints должны отсутствовать в активном пути.

Критерий. Уникальное число и смысл русской фразы распознаны приемлемо; в логах нет cloud request. Ошибки выбора микрофона — environment, неверный backend — configuration.

14. Локальный TTS через pyttsx3

Список голосов зависит от ОС. На Windows в нашем baseline был `Microsoft Irina Desktop`. На macOS сначала установите русский системный голос в System Settings → Accessibility → Spoken Content/System Voice, затем выберите имя, реально выведенное pyttsx3.

Список голосов без персональных путей

Windows PowerShell 7

uv run python -c "import pyttsx3; e=pyttsx3.init(); [print(i, v.name, getattr(v,'languages',[])) for i,v in enumerate(e.getProperty('voices'),1)]

macOS Terminal (zsh)

uv run python -c "import pyttsx3; e=pyttsx3.init(); [print(i, v.name, getattr(v,'languages',[])) for i,v in enumerate(e.getProperty('voices'),1)]

Изолированный TTS smoke test

Windows PowerShell 7

uv run python -c "import pyttsx3; e=pyttsx3.init(); v=next(x for x in e.getProperty('voices') if x.name=='Microsoft Irina Desktop'); e.setProperty('voice',v.id); e.say('Проверка локального синтеза 4827'); e.runAndWait(); print('TTS_COMPLETED')

macOS Terminal (zsh)

# Замените <RUSSIAN_VOICE_NAME> только именем из предыдущего вывода.
uv run python -c "import pyttsx3; e=pyttsx3.init(); v=next(x for x in e.getProperty('voices') if x.name=='<RUSSIAN_VOICE_NAME>'); e.setProperty('voice',v.id); e.say('Проверка локального синтеза 4827'); e.runAndWait(); print('TTS_COMPLETED')

Неинтерактивная сессия. COMError на Windows или отсутствие слышимого звука в sandbox/SSH не доказывает поломку pyttsx3. Повторите тест в обычном пользовательском Terminal с доступом к аудиосессии. На macOS проверьте выбранный output device и системный голос.

15. Минимальный local-agent-gateway

Этот маршрут воспроизводит реализованный нами gateway: loopback-only FastAPI, bearer auth, backend/model allowlists, request ID, ограничение размера, нейтральные 4xx/502, safe logging и streaming passthrough.

Получение и тесты

Windows PowerShell 7

Set-Location C:\dev\agent-lab
git clone --branch agent/local-gateway https://github.com/aka-gst/local-agent-gateway.git
Set-Location .\local-agent-gateway
uv sync --extra test
Copy-Item .\.env.example .\.env
# Заполните .env локально, не печатая его.
uv run pytest -q

macOS Terminal (zsh)

cd ~/dev/agent-lab
git clone --branch agent/local-gateway https://github.com/aka-gst/local-agent-gateway.git
cd local-agent-gateway
uv sync --extra test
cp .env.example .env
# Заполните .env локально, не печатая его.
uv run pytest -q

Имена параметров .env — реальный token не выводить

GATEWAY_BEARER_TOKEN=<32 RANDOM BYTES, BASE64URL>
GATEWAY_ALLOWED_BACKENDS=ollama
GATEWAY_ALLOWED_MODELS=qwen3-vl:4b
GATEWAY_DEFAULT_BACKEND=ollama
GATEWAY_OLLAMA_BASE_URL=http://127.0.0.1:11434/v1
GATEWAY_UPSTREAM_TIMEOUT_SECONDS=120
GATEWAY_MAX_REQUEST_BYTES=1048576

Запуск gateway

Windows PowerShell 7

uv run local-agent-gateway
# Отдельное окно:
Invoke-RestMethod http://127.0.0.1:8642/health

macOS Terminal (zsh)

uv run local-agent-gateway
# Отдельное окно:
curl -fsS http://127.0.0.1:8642/health

Почему timeout 120. При первом запросе qwen3-vl:4b может загружаться в память дольше 30 секунд. Сначала измерьте прямой Ollama-вызов; только затем увеличивайте timeout. `upstream unavailable` при рабочем Ollama часто является timeout, а не ошибкой модели.

Streaming. Open-LLM-VTuber фактически отправляет `stream=true`. Gateway должен передавать поток без накопления всего ответа, не пересылать клиентский Authorization в Ollama и закрывать upstream при disconnect.

16. Порядок запуска четырёх окон

ОкноКаталогПроцессПроверка
1любойOllama.app/tray или ollama serve11434 /api/tags
2local-agent-gateway или Hermes profilegateway8642 /health
3Open-LLM-VTuberuv run run_server.py --verbose12393 HTTP 200
4любойhealth/smoke commandsстатусы и request id

Проверка портов

Windows PowerShell 7

Get-NetTCPConnection -State Listen -LocalPort 11434,8642,12393 -ErrorAction SilentlyContinue | Select-Object LocalAddress,LocalPort,OwningProcess

macOS Terminal (zsh)

lsof -nP -iTCP:11434 -iTCP:8642 -iTCP:12393 -sTCP:LISTEN

17. End-to-end smoke tests

  1. Text-only: в VTuber отправьте «Ответь одним словом: готово». Должен появиться ответ, gateway — HTTP 200/request id.
  2. Voice: включите microphone capture и произнесите фразу с новым уникальным числом. Сохраните только transcript и PASS/FAIL.
  3. TTS: после одного ответа подтвердите слухом локальное воспроизведение. Затем выключите микрофон.
  4. Loop control: на 15 секунд включите микрофон при динамиках и убедитесь, что новых бесконечных циклов нет; при риске используйте наушники.
  5. Vision: используйте штатную кнопку camera/screen share или file input. Если `document.querySelectorAll('input[type=file]').length` равно 0, не имитируйте upload: отметьте capability NOT RUN.

Чего не доказывает UI-ответ. Сам ответ не доказывает маршрут. Нужны request id/HTTP 200 gateway и лог выбранного upstream без prompt/response содержимого.

18. Остановка и откат

  1. Ctrl+C в окне Open-LLM-VTuber; дождитесь shutdown complete.
  2. Ctrl+C в окне gateway; проверьте освобождение 8642.
  3. Ollama tray/app можно оставить работающим; `ollama serve` остановите Ctrl+C.
  4. Восстанавливайте conf.yaml только из известного timestamped backup при остановленном VTuber.
  5. Не завершайте неизвестный PID. Сначала определите приложение-владельца порта.

19. Диагностика по симптомам

СимптомКлассМинимальная проверкаДействие
uv cache Access deniedenvironmentuv cache dir; повтор той же команды вне sandboxОднократное разрешение или локальный cache внутри workspace
11434 address in useenvironmentlistener + /api/tagsНе запускать второй Ollama
YAML ParserErrorconfigurationполный safe_load + строки вокруг ошибкиИсправить только отступ/скаляр
Pydantic literal errorconfigurationсписок допустимых backend из ошибки/кодаИспользовать точный идентификатор
Gateway 401configurationсравнение token match без выводаОдинаковый token и restart
Gateway 400 model not allowedconfigurationollama list + allowlistТочный model tag
Gateway 502 unavailableenvironment/configпрямой Ollama + времяЗапустить Ollama или увеличить timeout обоснованно
Chat endpoint errorconfigurationbase_url, health, model, request idИсправить первую упавшую границу
pyttsx3 COMErrorenvironmentинтерактивный пользовательский терминалПовторить вне sandbox
Нет file inputcapabilityDOM count и UI controlsNOT RUN; использовать camera/screen share
Звук не слышенenvironment/configсистемный output + изолированный TTSВыбрать голос/output; не менять source
Feedback loopconfiguration/environmentVAD, mic, 15 секундНаушники; настройка VAD, не повышать громкость

20. Один master prompt для AI

Этот prompt рассчитан на уже установленного Codex или Hermes. Он не отменяет системные диалоги и подтверждения внешних публикаций, но минимизирует уточняющие вопросы.

MASTER PROMPT — замените только ОС и маршрут

Я хочу с нуля настроить локальную связку Open-LLM-VTuber + Ollama qwen3-vl:4b + sherpa_onnx_asr + pyttsx3_tts на <Windows|macOS>.
LLM-маршрут: <прямой Ollama|Hermes API Server|local-agent-gateway>.

Работай как контролируемый инженер. Самостоятельно выполняй все безопасные read-only проверки и не задавай вопросы, ответ на которые виден в документации, --help, репозитории или локальном состоянии. Перед каждой группой изменений покажи атомарную цель, точные файлы, redacted diff, риски и команды теста; жди моего «одобряю». После одобрения заверши группу целиком.

Не используй sudo, destructive Git, force push, изменение main/upstream, глобальные пакеты без обоснования. Не читай и не печатай .env, conf.yaml целиком, token, SSH, cookies или keychain. Секрет запрашивай только через безопасный локальный ввод и показывай лишь match/length. Не меняй source Open-LLM-VTuber, templates или dependencies, пока не доказан source defect и я отдельно не расширил scope.

Порядок:
1. Проверь ОС, shell, cwd, git, gh, uv, ffmpeg, ollama и выбранного агента. Классифицируй проблемы.
2. Получи Open-LLM-VTuber recursive clone в коротком несинхронизируемом пути; прочитай README/CLAUDE/pyproject/quick-start; покажи карту.
3. Выполни upstream baseline: uv sync, verbose server, HTTP 200, shutdown, source-tree unchanged.
4. Проверь Ollama, скачай qwen3-vl:4b только после подтверждения, выполни text-only smoke.
5. Создай backup conf.yaml и настрой минимальные реальные YAML paths выбранного маршрута; не заменяй файл шаблоном. Полностью распарсь YAML.
6. Настрой sherpa_onnx_asr. Получи список pyttsx3 voices без путей; выбери доступный русский системный голос, на Windows предпочти Microsoft Irina Desktop, на macOS используй фактически установленный русский голос.
7. Если выбран gateway: настрой loopback 127.0.0.1:8642, bearer auth, allowlists, request id, безопасные ошибки и streaming. Для Hermes отключи опасные toolsets runtime-профиля. Для local-agent-gateway запусти pytest.
8. Запусти компоненты в правильном порядке и выполни health checks.
9. Остановись для моих ручных действий только четыре раза: browser login, secret input, microphone/screen permission и подтверждение слышимого звука.
10. Проведи text, voice, TTS, 15-second loop и доступный vision smoke. Не выдавай NOT RUN за PASS.
11. Покажи sanitised evidence: версии, backend names, request id/status, transcript тестовой фразы, TTS user-confirmed, loop result, source-tree status. Не показывай полный prompt/response.
12. Останови сервисы в обратном порядке и предложи ровно один следующий шаг.

Если команда одной ОС не подходит, сначала переведи её в native PowerShell 7 или zsh. Bash heredoc `<<'PY'` не используй в PowerShell. При любой ошибке покажи реальный вывод и не продолжай к следующей границе, пока текущая не доказана.

21. Формат итогового отчёта

Шаблон evidence

ОС: Windows / macOS
Маршрут: direct Ollama / Hermes / local-agent-gateway
Ollama model: <exact tag>
ASR: sherpa_onnx_asr — PASS / FAIL / NOT PROVEN
TTS: pyttsx3_tts, voice=<name> — PASS / FAIL / NOT PROVEN
Gateway: HTTP status=<code>, request_id=<sanitized>
Vision: PASS / FAIL / NOT RUN; method=<screen/camera/file>
Loop control: PASS / FAIL / NOT RUN; observation=15 s
Source tree: unchanged / known diff
Secrets printed: no
Не доказано: <ограничения>
Следующий атомарный шаг: <ровно один>

22. Официальные источники и проверка актуальности

  • Codex: https://developers.openai.com/codex/
  • Codex Windows sandbox: https://developers.openai.com/codex/windows/
  • Hermes Agent — установка, Portal и CLI: https://hermes-agent.nousresearch.com/docs/
  • Hermes API Server: https://hermes-agent.nousresearch.com/docs/user-guide/features/api-server/
  • Ollama — загрузка для Windows и macOS: https://ollama.com/download
  • Ollama API: https://docs.ollama.com/api
  • Open-LLM-VTuber Quick Start: https://docs.llmvtuber.com/en/docs/quick-start/
  • Open-LLM-VTuber LLM configuration: https://docs.llmvtuber.com/en/docs/user-guide/backend/llm/
  • OpenRouter API: https://openrouter.ai/docs/api-reference/overview
  • uv: https://docs.astral.sh/uv/
  • GitHub CLI: https://cli.github.com/manual/

Правило версий. Команды этого руководства сверены с локальным Open-LLM-VTuber 1.2.1 и окружением практикума. Если точный YAML path или CLI-флаг отличается, сначала прочитайте локальные README/CLAUDE/pyproject и --help, затем меняйте только фактически существующий ключ.