temporality
ENИзменить страницу↗
Эксплуатация

Эксплуатация харнеса

Как правильно развернуть, настроить и эксплуатировать Temporality как рабочий харнес — стек, обновления, провайдеры, аутентификация, знания, навыки, песочницы, наблюдаемость, бэкапы и диагностика.

Это руководство — для того, кто отвечает за работающий стенд: развёртывание, обновление, настройка провайдеров и доступа, наблюдаемость и разбор типовых проблем. Повседневная работа пользователя разобрана в соседних разделах, точные значения переменных — в Справочнике.

#1. Стек: что где крутится и где живёт состояние

Развёртывание

Compose поднимает семь сервисов:

Сервис Образ Роль
postgres pgvector/pgvector:pg17 Единственное постоянное хранилище: события, знания, пользователи, конфиги, секреты, ревью
journal temporality/journal Event store API: чтение/поиск событий, SSE-потоки ранов
agent-kernel temporality/agent-kernel Ядро: Temporal-воркер (долгоживущие раны), API :8090, песочницы, MCP, каналы
debugger temporality/debugger Веб-интерфейс :3000, прокси к kernel и journal
temporal temporalio/auto-setup Движок durable-выполнения (своё хранилище)
searxng searxng Метапоиск для инструмента web_search
lightpanda lightpanda/browser Headless-браузер (CDP) для инструмента browser

Где живёт состояние — важно для бэкапов и миграций:

Ничего важного не живёт в контейнерах: их можно пересоздавать.

#2. Развёртывание и обновление

#Перенос скиллов и агентов между стендами

Набор поведенческих конфигураций переносится одним JSON-файлом во внутреннем формате temporality.transfer/v1:

curl -H "Authorization: Bearer $ADMIN_TOKEN" \
  "https://stand-a.example/kernel-api/v1/workspace/export?type=all" -o transfer.json
curl -H "Authorization: Bearer $ADMIN_TOKEN" -F [email protected] \
  "https://stand-b.example/kernel-api/v1/workspace/import?mode=merge"

Обновление стенда до последнего релиза:

docker compose pull && docker compose up -d

Для контролируемого обновления (или отката) версия закрепляется явно:

TEMPORALITY_VERSION=2026.2.113 docker compose up -d

Порядок обновления стенда:

  1. Прочитай заметки релиза (аннотация тега) — миграции и ломающие изменения пишутся туда.
  2. docker compose pull journal debugger agent-kernel
  3. docker compose up -d — миграции Postgres применяются автоматически при старте kernel (migrations/workspace, миграции квот); журнал миграций — идемпотентный.
  4. Проверь здоровье: docker compose ps (все healthy), дашборд /dashboard, один тестовый ран.

Откат — подними предыдущий закреплённый TEMPORALITY_VERSION. Миграции схемы не откатываются: перед крупными обновлениями делай дамп (§11). Локальная сборка из исходников вместо GHCR:

docker compose -f docker-compose.yml -f docker-compose.dev.yml up -d --build agent-kernel debugger

(docker-compose.dev.yml переключает образы на build из репозитория; перебивает только указанные сервисы.) Признак частого сбоя: при первой сборке двух целей одновременно buildx иногда спотыкается о блокировку кэша — повторная сборка проходит.

#3. Провайдеры и модели

Минимум для работы — три переменные провайдера по умолчанию:

TEMPORALITY_MODEL_BASE_URL=https://api.provider.com/v1
TEMPORALITY_MODEL_ID=mimo-v2.6-flash
TEMPORALITY_MODEL_API_KEY=...

Полная настройка — на странице /providers: несколько провайдеров, каталоги моделей, назначение моделей по ролям.

#Роли моделей и куда какая попадает

Каталог моделей синхронизируется с провайдером по расписанию (KERNEL_PROVIDER_MODELS_REFRESH, по умолчанию 24h, 0 — выключить цикл) плюс ручной refresh и probe-проверка в UI.

Судья (judge) — отдельная chat-модель для оценок. Она используется шире, чем кажется: контур качества, нормализация областей знаний, супервайзерские проходы и кейсы, вердикт worth_skill при майнинге навыков, выбор модели в мастерах-черновиках (агент/навык/команда): env-модель → judge-модель → первый chat-кандидат каталога. Не-chat записи каталога (ASR, embedding, image) из кандидатов отфильтрованы — если мастер «взял первую попавшуюся ASR-модель», обнови каталог и назначь роли явно.

#Стрим и таймауты

Переменная Дефолт Смысл
TEMPORALITY_MODEL_FIRST_TOKEN_TIMEOUT 2m Ожидание первого токена; адаптивно +60с за МБ промпта
TEMPORALITY_MODEL_STREAM_IDLE_TIMEOUT 90s Тишина в стриме между токенами
TEMPORALITY_MODEL_STREAM_NO_PROGRESS_TIMEOUT 4m Стрим жив, но общий прогресс встал
TEMPORALITY_MODEL_TIMEOUT 180s Базовый таймаут HTTP-запроса
TEMPORALITY_MODEL_ACTIVITY_TIMEOUT 20m Потолок одной модельной активности
TEMPORALITY_MODEL_MAX_OUTPUT_TOKENS 16384 (код) / 1024 (compose) Лимит генерации. Compose-стек сознательно ставит 1024 — подними осознанно
TEMPORALITY_MODEL_TEMPERATURE / _REASONING — Переопределение параметров запроса

Буферизующие гейтвеи (отдают весь ответ одним чанком) — не поломка. В трейсе это видно как вердикт «провайдер не стримит (один чанк)» на длинных вызовах; ретраи стрима — по лестнице с нарастающим интервалом («↻ повтор стрима после N с»). Диагностика «Ожидание подключения», которая долго не сменяется токенами, означает проблему SSE-транспорта до провайдера, а не выбор модели. Зависший вызов можно толкнуть вручную — кнопка ↻ на живой строке вызова модели отменяет запрос и перезапускает ход.

#4. Аутентификация и доступ

Четыре режима, от простого к корпоративному:

  1. Без аутентификации — KERNEL_AUTH_TOKENS пуст. Только для локальных экспериментов.
  2. Bearer-токены — KERNEL_AUTH_TOKENS=token:user:role:projects,.... Для сервисных агентов и скриптов.
  3. Пароль + сессии — основной режим UI. Вход password-first, форма «Пароль | API-токен». Сессии: KERNEL_SESSION_TTL (скользящая, 12h), KERNEL_SESSION_ABSOLUTE_TTL (7d); KERNEL_COOKIE_SECURE=true за HTTPS.
  4. OIDC SSO — федерация (Keycloak/Entra/Authentik), JIT-провижининг, маппинги групп на роли, роль deny = «вход успешен, доступ запрещён» до ручного решения. Конфиг — /users (admin-only), каждое изменение пишет аудит-событие.

Self-service: пользователь меняет свой пароль через меню аккаунта (POST /v1/auth/password). Аккаунт с паролем подтверждает текущий; SSO-аккаунт без локального пароля задаёт первый с пустым полем current — минимум 8 символов, bearer-токен переживает смену. Break-glass: при включённом SSO парольный вход остаётся только у admin (недоступность IdP не блокирует эксплуатацию).

Проектный скоупинг: роль + список проектов в токене, для SSO — маппинги claim'ов; * означает все проекты. Оргструктура (/org) дополнительно ограничивает видимость по подразделениям.

#5. Секреты

#6. Знания, подсказки и embeddings

Семантический слой (похожесть знаний, подсказки похожего опыта, предсказание конфликтов, семантический поиск) требует модель embeddings:

KERNEL_EMBEDDINGS_MODEL=intfloat/multilingual-e5-small

Модель грузится ин-процесс (rembed) с Hugging Face. Если она не загрузилась, ядро работает дальше, но с баннером «настроены не все инструменты» и без семантики — ретраи идут с нарастающим интервалом; проверь доступ до huggingface.co. Кэш модели — на диске; при проблемах прав владельца смотри лог (есть fallback на пользователя ОС).

Эксплуатация знаний:

#7. Навыки и артефакты

Навыки — версионируемые процедуры с контрактом. Пути создания: описание в UI, импорт, вручную и майнинг — супервайзер ищет повторяющиеся три-граммы вызовов инструментов между ранами, детерминированный гейт отсекает read-only последовательности, судья выносит вердикт worth_skill с обоснованием; кандидат попадает в очередь и префиллится черновиком на /skills. Версии: черновик 0.x, применение/отклонение редакций — человеком; в списке навыков бейджи draft и «↺ N» — ожидающие черновики-редакции. Не копи неприменённые редакции: просматривай очередь по бейджу.

Артефакты — документы, которые агенты подгружают по требованию. Статусы: draft / in_review / rejected / approved / superseded (жизненный цикл — на уровне версии: правка утверждённого — только новая редакция и повторное согласование). Ревью-цикл: submit (идемпотентен по версии) → уведомление ревьюерам → решение только человеком (само-одобрение запрещено на уровне API) → approved/rejected. Ревьюеры: режим all (все должны) или any (любого достаточно). Квота отправок на ран — ARTIFACT_SUBMIT_PER_DAY. Тела артефактов рендерят markdown с mermaid-диаграммами (типовые ошибки LLM в erDiagram чинятся автоматически).

#8. Агенты, команды и план-DAG

#9. Песочницы, инструменты и лимиты

#Egress-контроль (белые списки адресов)

Песочница с сетью попадает не в общий bridge, а в internal-сеть без маршрута наружу; единственный выход — egress-proxy (squid), чей конфиг ядро генерирует из настроек агентов. Семантика: публичный интернет разрешён (NetworkAccess), приватные диапазоны (LAN, RFC1918, metadata) запрещены по умолчанию, и только явные записи в egress_allowlist агента открывают конкретные внутренние адреса:

egress_allowlist: ["api.github.com", "*.example.com", "gitlab.corp:8443", "10.20.30.0/24"]

Формат: домен, глоб, CIDR, хост:порт. Прокси сам резолвит имена — внутренний DNS работает, а отказ сопровождается понятной ошибкой. Не-HTTP трафик наружу (ssh, произвольные порты) не ходит — для задач агентов это почти всегда не важно, и это фича. Контролируется только HTTP(S): значения секретов всё равно защищены сканером утечки и canary.

Разворачивается автоматически вместе со стеком (сервис egress-proxy + сети temporality-sandbox-internal/temporality-egress-out); без egress-стека песочницы работают по-старому через bridge.

#Прочее

#10. Наблюдаемость эксплуатации

#11. Резервное копирование и восстановление

Минимум — nightly:

docker exec temporality-postgres-1 pg_dump -U temporality temporality | gzip > backup-$(date +%F).sql.gz
tar -C /srv/temporality/sandbox -czf sandbox-$(date +%F).tgz .

Восстановление: поднять пустой стек той же версии → восстановить дамп → вернуть sandbox-корень → поднять kernel. Активные (незавершённые) раны после восстановления продолжаются, только если восстановлена и БД Temporal — в большинстве случаев достаточно принять, что незавершённые раны умрут и их перезапустят. Проверяй восстановление периодически на отдельном стенде — бэкап, который ни разу не восстанавливали, не бэкап.

#12. Диагностика типовых проблем

Симптом Где смотреть Что делать
Ран «висит» на вызове модели живая строка трейса: ожидание первого токена если «Ожидание подключения» висит долго — транспорт до провайдера (SSE/прокси), не модель; жди retry-лестницу или толкни ↻
«Провайдер не стримит (один чанк)» детали model.completed гейтвей буферизует ответ; это не ошибка — для стриминга выбери другого провайдера/эндпоинт
Ответы обрываются на середине TEMPORALITY_MODEL_MAX_OUTPUT_TOKENS подними лимит (compose-дефолт 1024 мал для больших ходов)
Консоль команды «Вывод недоступен: 404» буфер консоли буфер вымыт (6h бездействия/рестарт ядра); вывод ≤1 КБ восстановится из журнала события
Баннер «настроены не все инструменты: embeddings» лог kernel доступ до huggingface.co, корректность KERNEL_EMBEDDINGS_MODEL; ретраи автоматические
Ран упал и никто его не поднимает /supervisor проверь KERNEL_SUPERVISOR_TRIAGE_INTERVAL; спорные операции — reconcile в панели рана
429 на запусках квоты KERNEL_RUN_QUOTAS — подними лимит проекта или дефолт *
Песочница не стартует лог kernel, docker compose ps gid сокета docker (TEMPORALITY_DOCKER_GID), наличие KERNEL_SANDBOX_IMAGE
UI видит не всё (проекты) скоупинг роль+проекты токена / маппинги SSO / оргподразделения

Практика: сначала трейс (он показывает и транспорт, и вердикты ретраев), потом логи kernel, потом journal. Большинство «зависаний» — транспорт до провайдера, и трейс это прямо называет.

#13. Дисциплина изменений