56просмотров
12.5%от подписчиков
22 марта 2026 г.
📷 ФотоScore: 62
Продолжаю методично наращивать функционал своего локального SEO-инструмента, который давно перерос в экосистему под автоматизацию аудитов, контент-планов и on-page. Решил, что без собственной pipeline-системы (сценарии / workflow) дальше будет тесно — и встроил её в ядро: единый JSON Schema для графа, Pydantic на бэкенде, REST на FastAPI, runner с топологической сортировкой и параллельными ветками на asyncio, плюс дашборд и визуальный конструктор. По стеку UI это не «ещё один Nuxt»: основной дашборд — Alpine, а канвас — React + React Flow (Vite-сборка, встраиваемый бандл). Сверху — pytest (включая smoke Playwright в CI), чтобы регрессии по API и сценариям не пролезали незаметно. Нет, это не «набросал за вечер»: интеграция формально простая только на слайде. На практике самым жёстким оказался замкнутый UX-контур «Новый сценарий → канвас → сохранить» без потери состояния и с понятной обратной связью по прогону — подсветка узла по шагам, опрос и SSE по записи прогона, чтобы не уезжать в сырой JSON при каждой мелочи. До этого чаще выигрывал JSON-редактор; теперь основной поток ближе к привычным flow-редакторам, но локально, без облачной подписки. Дальше — единая конфигурация путей к хранилищу сценариев (agent_hub_config), валидация графа на сервере (циклы, условные рёбра, параллельный DAG по правилам модели) и подсказки на клиенте, чтобы не ловить слепой 400 после долгой сборки на канвасе. Идемпотентность запусков, шаблоны, связка с планировщиком (тот же тик, что и у автономного агента, но с полем scenario_id — отдельный режим «крутить только workflow»), undo/redo на канвасе, snap-to-grid и группы — это уже слой «чтобы жить с графом каждый день». Отдельно: полный автоматический e2e «сохранил → обновил страницу → пиксель-в-пиксель тот же layout» я сознательно не продаю как закрытый объём — есть фикстуры и регрессия бэкенда; идеальный round-trip по UI добивается по мере необходимости. Итог: pipeline для сценариев в бою — можно вешать реальные SEO-цепочки (парсинг, отчёты, шаги через HUB и локальные LLM) и развивать дальше без стыда перед собственным репозиторием.