О проекте
Команда: Steppe Overflow
Кейс HackAlem.ai: Энергетика — Самрук-Казына
Стадия: Доведённый продукт
Задача кейса: AI-агент, прогнозирующий выработку ветровой электростанции по погодным данным
Суть
Агентная система почасового прогноза выработки ВЭС из двух турбин на 24–48 часов с интервалом P10–P90 и строгой защитой от утечки будущих данных. Сдан прогноз на февраль 2026 (28 выпусков), есть живой режим с планировщиком, бэктест и сайт на Streamlit с AI-чатом.
Как устроено
SCADA-CSV проходит QC и почасовую агрегацию. Архив прогнозов погоды Open-Meteo (ECMWF IFS, ICON, GFS, ERA5) доступен только через DataStore(as_of), который отдаёт лишь опубликованные к моменту прогноза прогоны и бросает LeakageError. Около 90 признаков (ветер на высотах, сдвиг, плотность воздуха, разброс моделей и прогонов, календарь) идут в ансамбль из градиентного бустинга с MAE- и MSE-потерей и физической кривой мощности. Интервал строится квантильным бустингом с конформной калибровкой (CQR). LLM-агент (или режим правил) с 8 инструментами проверяет погоду, запускает модель, анализирует результат, публикует v1 с объяснением и выпускает ревизию v2 при новом прогоне ECMWF.
Ключевые решения
- gradient boosting (MAE/MSE loss)
- physical power curve
- ensemble
- conformalized quantile regression (CQR)
- leakage-safe as_of data store
- multi-NWP features (ECMWF/ICON/GFS)
- backtest by issue protocol
- function calling agent
- LLM fact-checking
- scheduler-triggered revision
Метрики
MAE 0.168 (нормированная мощность, среднее по 3 периодам) против 0.184 у лучшего бейзлайна и 0.328 у климатологии; RMSE 0.234; покрытие P10–P90 73–78% при номинале 80%; 79 автотестов
Особенности
Утечка будущих данных исключена архитектурно (DataStore(as_of) + LeakageError + тесты), к каждому выпуску прилагается манифест с использованными прогонами погоды. Команда честно показывает, что точность упирается в прогноз ветра: с фактическим ветром MAE была бы 0.03–0.04. Агент сам выпускает ревизии при новом прогоне ECMWF (в 23 из 28 выпусков). Проект развёрнут на собственном домене.
Стек
Python · uv · Streamlit · Open-Meteo · Docker Compose · Caddy · PWA · pytest · Parquet
Модели
gpt-5.6-terra (agent) · gpt-6-luna (chat)
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-418ae9f6-steppe-overflow.
README
README.mdSteppeWind — Agentic AI прогноз выработки ВЭС
Сайт: https://steppewind.energy · Видео (75 с): docs/media/demo.mp4

Кратко
SteppeWind прогнозирует почасовую выработку ветроэлектростанции из двух турбин (Алматинская область, 43.64° с. ш., 78.54° в. д.) на следующие 24–48 часов.
Для кого: оператор ВЭС и диспетчер. Выработка ветра нестабильна, а график поставки в энергосистему нужно заявить заранее, за сутки. Ошибка прогноза оборачивается штрафами за небаланс и неэффективным планированием.
Главное требование задачи — честная ретроспектива. Прогноз на каждый день тестового периода (февраль 2026) строится только по тем прогнозам погоды, которые уже были опубликованы на момент прогноза. Фактическая погода, ставшая известной позже, не используется. Это гарантируется кодом и проверяется тестами.
AI-агент сам проходит весь цикл:
- получает прогнозы погоды;
- проверяет их качество;
- запускает модель;
- анализирует результат;
- публикует прогноз с объяснением;
- пересчитывает его, когда выходит новый прогон погоды.
Что реализовано
-
Прогноз на тестовый период. 28 ежедневных выпусков (31.01–27.02.2026) по 48 часов, мощность каждой турбины и ВЭС, интервал P10–P90. Для каждого выпуска есть манифест: какие прогоны погоды использованы и когда они были опубликованы. Всё лежит в
artifacts/submission/. -
Защита от утечки будущего. Все данные проходят через
DataStore(as_of):- он отдаёт только прогоны, опубликованные к моменту прогноза, и только завершившиеся часы SCADA;
- попытка взять более поздние данные вызывает
LeakageError.
-
Основная модель — ансамбль из трёх компонентов:
- градиентный бустинг с MAE-потерей;
- градиентный бустинг с MSE-потерей;
- физическая кривая мощности турбин.
Бустинг обучен на ~90 признаках из прогнозов ECMWF, ICON и GFS: ветер на разных высотах, направление, сдвиг ветра, плотность воздуха, разброс между погодными моделями и между последними прогонами ECMWF, календарь.
-
Интервал P10–P90: квантильный бустинг с конформной калибровкой (CQR).
-
AI-агент (подробнее — в разделе AI-агент):
- 8 инструментов, режим LLM (OpenAI) и режим правил;
- ревизия прогноза после выхода нового прогона погоды;
- проверка фактов в тексте LLM;
- демо-сценарии сбоя данных;
- журналы всех 28 выпусков LLM-агента.
-
Живой режим. Прогноз на настоящее «завтра» по свежим прогнозам Open-Meteo. Планировщик на сервере каждые 15 минут проверяет, вышел ли новый прогон ECMWF, и сам запускает агента.
-
Бэктест на трёх контрольных периодах по протоколу теста, 6 моделей для сравнения, метрики MAE, RMSE, смещение, покрытие интервала.
-
Веб-интерфейс (Streamlit):
- «Прогноз»: карточки, объяснение AI-агента с причинами уверенности, график с предыдущим прогнозом и ветром в подсказке, режимы «Февраль 2026 · тест», «Сейчас», «История» (прогноз против факта);
- «Погода»: прогнозы четырёх моделей на момент выпуска и проверка времени их публикации;
- «Качество прогноза»: метрики, «прогноз против факта», распределение ошибок;
- «Данные»: загрузка своего CSV и мгновенная оценка точности;
- «AI-агент»: схема цикла, шаги и решения, версии прогноза, живой запуск, демо сбоев;
- плавающий чат с AI-помощником;
- установка как приложение (PWA).
-
Развёртывание: Docker Compose — приложение, планировщик агента, Caddy с автоматическим HTTPS.
-
Проверки:
- 79 автотестов (
uv run pytest); scripts/check_site.pyпроходит основной пользовательский сценарий на сайте.
- 79 автотестов (
Как это работает
┌──────────────────────── AI-агент (LLM или правила) ────────────────────────┐
CSV турбин ─► │ погода ─► проверка ─► модель ─► анализ ─► публикация ─► новый прогон? ─► пересчёт │
Open-Meteo ─► └────────────────────────────────────────────────────────────────────────────┘
│ все данные только через DataStore(as_of): опубликованное к моменту прогноза
▼
признаки (48 ч × ~90) ─► ансамбль + интервал P10–P90 ─► прогноз + манифест + объяснение ─► сайт
-
Выпуск для даты D делается в D 14:00 по местному времени (UTC+6) и покрывает D+1 00:00 … D+2 23:00.
-
DataStoreвыбирает самый свежий прогон ECMWF, опубликованный к этому моменту (обычно 00Z того же дня). Для GFS, ICON и ECMWF 0.25° берётся самый свежий прогноз из уже вышедших. -
Из прогнозов погоды строится таблица признаков: 48 целевых часов × ~90 признаков.
-
Модель выдаёт прогноз по каждой турбине и по ВЭС с интервалом P10–P90.
-
Агент проверяет прогноз:
- правдоподобие;
- согласованность с ветром;
- сравнение с климатической нормой и прошлым выпуском;
- уверенность.
Затем публикует версию v1 с объяснением.
-
Когда выходит следующий прогон ECMWF, агент пересчитывает прогноз. Если изменение существенное, публикует ревизию v2.
Результаты (бэктест)
Средняя ошибка прогноза нормированной мощности ВЭС (0–1, где 1 — номинал) по 48 часам каждого выпуска. Три контрольных периода, ~30 ежедневных выпусков каждый. Модели обучены только на данных до первого выпуска периода.
MAE
| Модель | фев 2025 | дек 2025 | янв 2026 | среднее |
|---|---|---|---|---|
| Основная модель (ансамбль) | 0.168 | 0.182 | 0.156 | 0.168 |
| ECMWF IFS → кривая мощности по анемометру турбин | 0.174 | 0.215 | 0.163 | 0.184 |
| ECMWF IFS → кривая, обученная на прогнозах | 0.186 | 0.211 | 0.183 | 0.193 |
| ECMWF 0.25° (Previous Runs) → обученная кривая | 0.218 | 0.218 | 0.217 | 0.217 |
| ICON (Previous Runs) → обученная кривая | 0.204 | 0.225 | 0.225 | 0.218 |
| GFS (Previous Runs) → обученная кривая | 0.282 | 0.234 | 0.254 | 0.257 |
| Климатология (среднее по месяцу и часу) | 0.326 | 0.353 | 0.304 | 0.328 |
RMSE
| Модель | фев 2025 | дек 2025 | янв 2026 | среднее |
|---|---|---|---|---|
| Основная модель (ансамбль) | 0.236 | 0.252 | 0.213 | 0.234 |
| ECMWF IFS → кривая, обученная на прогнозах | 0.239 | 0.274 | 0.231 | 0.248 |
| ECMWF IFS → кривая мощности по анемометру турбин | 0.260 | 0.307 | 0.242 | 0.270 |
| Климатология (среднее по месяцу и часу) | 0.361 | 0.383 | 0.341 | 0.362 |
Полные таблицы — в artifacts/reports/backtest.md.
Интервал P10–P90 (номинальное покрытие 80%): фактическое покрытие 73% (фев 2025), 77% (дек 2025), 78% (янв 2026). Небольшой недобор объясняется сезонным сдвигом между окном калибровки и периодом прогноза.
Выводы
-
Ансамбль лучше всех моделей для сравнения на каждом периоде: MAE −9% относительно лучшей из них, −49% относительно климатологии. Систематическое смещение близко к нулю.
-
Точность ограничена прогнозом погоды, а не моделью. Если подставить фактический ветер на турбине, MAE было бы 0.03–0.04. Прогноз ветра ECMWF на сутки вперёд ошибается в среднем на 2–2.5 м/с.
-
Проверено и не принято:
- прогноз ECMWF в 4 соседних точках сетки (MAE 0.1682 против 0.1684 — в пределах шума);
- повышенный вес свежих данных — тоже без выигрыша.
Код оставлен как опция:
neighbors.use_in_modelвconfig/settings.yaml.
Прогноз на февраль 2026
Готовые файлы в artifacts/submission/:
| Файл | Содержимое |
|---|---|
forecast_feb2026.csv | все 28 выпусков × 48 часов (1 344 строки): прогноз на D+1 и D+2 от каждого выпуска |
forecast_feb2026_dayahead.csv | по одному значению на каждый час февраля (672 строки): прогноз, выпущенный накануне |
manifests/<дата>.json | для каждого выпуска: момент прогноза, версия модели, использованные прогоны погоды и время их публикации, итог проверки на утечку |
| Колонка | Описание |
|---|---|
issue_date, issue_time_utc | дата выпуска и момент прогноза (14:00 UTC+6 = 08:00 UTC) |
target_time_local, target_time_utc | прогнозируемый час (UTC+6 и UTC), начало часа |
horizon_h, lead_day | горизонт от момента прогноза в часах; сутки упреждения: 1 = D+1, 2 = D+2 |
p_t1, p_t2, p_farm | нормированная мощность (0–1): турбина 1, турбина 2, ВЭС (среднее двух) |
p_farm_q10, p_farm_q90 | интервал P10–P90 для ВЭС |
ifs_run_time, model_version | прогон ECMWF, по которому построен прогноз; версия модели |
Модель обучена один раз, на всех фактах, известных к первому выпуску (31.01.2026 14:00 UTC+6). Данных SCADA за февраль нет, поэтому от выпуска к выпуску меняются только прогнозы погоды.
AI-агент
Агент выпускает прогноз сам, вызывая инструменты. Все числа считают инструменты (детерминированный код), а агент выбирает порядок действий, принимает решения и пишет объяснение для диспетчера.
| Инструмент | Что делает |
|---|---|
check_available_runs | какие прогоны погодных моделей уже опубликованы на текущий момент |
fetch_weather | собирает прогнозы ECMWF, ICON и GFS на 48 часов (только опубликованные) |
validate_weather | проверяет покрытие, физичность значений, согласие моделей и свежесть прогона; предлагает исключить подозрительные источники |
run_forecast | запускает модель; можно исключить источники |
analyze_forecast | правдоподобие, согласованность с ветром, сравнение с климатической нормой и прошлым выпуском, уверенность |
publish_forecast | публикует версию прогноза с объяснением (в LLM-режиме — после проверки фактов) |
advance_to_next_update | переводит время до выхода следующего прогона ECMWF |
compare_with_published | сравнивает новый расчёт с опубликованной версией и советует, нужна ли ревизия |
Цикл выпуска.
- В 14:00 агент публикует версию v1. Это и есть прогноз для сдачи, он построен строго по данным на момент выпуска.
- Затем агент дожидается следующего прогона ECMWF (обычно в 19:00) и пересчитывает прогноз.
- Если прогноз изменился существенно (в среднем больше 3 п.п. или хотя бы на один час больше 15 п.п.), агент публикует ревизию v2 и объясняет, что изменилось.
За февраль 2026 ревизия понадобилась в 23 выпусках из 28. Журналы всех выпусков, сделанные LLM-агентом (gpt-5.6-terra, ~30 с на выпуск), лежат в artifacts/agent/<дата>/: в run.json все шаги и решения, рядом CSV каждой версии.
Режимы с одним набором инструментов.
- LLM — OpenAI Responses API с вызовом инструментов. Модель сама решает, какой инструмент вызвать, исключать ли источник и нужна ли ревизия, и пишет объяснение. Включается ключом
OPENAI_API_KEYв.env. - Правила — тот же цикл с решениями по порогам и объяснением по шаблону. Работает без ключа и без интернета. Если LLM недоступна или не опубликовала прогноз, агент автоматически завершает выпуск по правилам.
Проверка фактов.
- Каждое число в объяснении LLM сверяется с результатами инструментов, с учётом единиц: доли, проценты, п.п.
- Если в тексте есть число без источника, публикация отклоняется, и модель переписывает текст.
- На подменённых числах проверка ловит 90% подмен.
Демо сбоев данных. На странице «AI-агент» можно выбрать один из трёх сценариев и увидеть, как агент реагирует:
- «испорчен прогноз ICON» — агент исключает ICON и объясняет почему;
- «пропуски в GFS» — агент исключает GFS;
- «опоздал прогон ECMWF» — агент работает на старом прогоне и понижает уверенность.
Живой режим. windagent live строит прогноз на настоящее «завтра» по свежим прогнозам Open-Meteo. windagent live --watch — планировщик: каждые 15 минут он проверяет новые прогоны ECMWF и при появлении нового запускает агента. На сервере это отдельный контейнер scheduler. На сайте живой прогноз — режим «Сейчас» на странице «Прогноз».
Технологии
- Python 3.12, менеджер окружения uv
- pandas, numpy, pyarrow — обработка данных, хранение в Parquet
- scikit-learn — градиентный бустинг (
HistGradientBoostingRegressor), изотоническая регрессия для кривой мощности - httpx — запросы к Open-Meteo (с ограничением частоты и повторами)
- OpenAI API (Responses API, вызов инструментов) — LLM-режим агента и чат; необязательно
- Streamlit, Plotly — веб-интерфейс и графики
- Docker Compose, Caddy — развёртывание, HTTPS (Let's Encrypt), PWA
- pytest — тесты; Playwright — проверка сценария на сайте и запись демо-видео (
scripts/) - Open-Meteo API — архивные и свежие прогнозы погоды (ECMWF IFS, ECMWF 0.25°, GFS, ICON), реанализ ERA5
Архитектура
| Модуль | Назначение |
|---|---|
windagent/data/scada.py | загрузка CSV турбин, контроль качества, почасовая агрегация |
windagent/data/openmeteo.py, weather.py | клиент Open-Meteo и локальный кэш прогнозов (cache/weather/) |
windagent/data/store.py | DataStore(as_of): единственная точка доступа к данным, защита от утечки |
windagent/protocol.py | протокол выпусков: момент прогноза и целевые часы |
windagent/features/ | таблица «выпуск × целевой час» и производные признаки |
windagent/models/ | ансамбль, интервал P10–P90 (CQR), кривая мощности, модели для сравнения |
windagent/eval/ | метрики и бэктест |
windagent/forecast.py | итоговая модель, прогноз выпуска с манифестом, прогон тестового периода |
windagent/agent/ | инструменты агента, оркестраторы (LLM и правила), проверка фактов |
windagent/live.py | живой режим и планировщик |
windagent/ui/, app/streamlit_app.py, app/serve.py | веб-интерфейс; serve.py прогревает модель и данные до первого посетителя |
windagent/cli.py | командная строка windagent |
config/settings.yaml | все параметры: координаты, модели погоды, задержки публикации, периоды |
Dockerfile, docker-compose.yml, deploy/ | образ, сервисы app / scheduler / caddy, конфигурация Caddy и PWA, скрипт выкладки |
scripts/check_site.py, scripts/record_demo.py | проверка пользовательского сценария на сайте, запись демо-видео |
Установка и запуск
Вариант 1 — uv (рекомендуется). uv сам скачает Python 3.12 и точные версии библиотек из uv.lock.
# установка uv (macOS / Linux), если его нет:
curl -LsSf https://astral.sh/uv/install.sh | sh
git clone https://github.com/BAITC-Hacks/hack-418ae9f6-steppe-overflow.git
cd hack-418ae9f6-steppe-overflow
uv sync
Вариант 2 — pip. Нужен Python 3.12.
python3.12 -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txt pytest
pip install -e . --no-deps
Во втором варианте команды ниже запускаются без префикса uv run.
Вариант 3 — Docker. Ничего, кроме Docker, не нужно.
docker build -t steppewind .
docker run --rm -p 8501:8501 steppewind
Интерфейс откроется на http://localhost:8501.
LLM-режим и чат (необязательно):
cp .env.example .env
Затем впишите в .env свой OPENAI_API_KEY. Файл .env не попадает в git.
Как проверить
Всё ниже работает без интернета и без API-ключей: данные, архив погоды, модель и готовый прогноз уже лежат в репозитории.
# 1. Автотесты (79), в том числе: ни один из 28 выпусков февраля не использует данные из будущего
uv run pytest
# 2. Данные турбин и архив прогнозов погоды
uv run windagent data
uv run windagent weather status
# 3. Прогноз одного выпуска: какие прогоны погоды использованы и когда опубликованы + 48 часов
uv run windagent forecast --date 2026-02-10
# 4. Все 28 выпусков → artifacts/submission/ (~15 с); с закоммиченной моделью совпадает с файлами побайтно
uv run windagent submission
# 5. AI-агент на одной дате: шаги, решения, объяснение, ревизия (режим правил без ключа)
# перезаписывает журнал LLM-агента в artifacts/agent/2026-02-10/ (вернуть: git checkout artifacts/agent)
uv run windagent agent --date 2026-02-10
# 6. Бэктест на трёх контрольных периодах (~2 мин) → artifacts/reports/backtest.md
uv run windagent features build
uv run windagent backtest --period all
# 7. Веб-интерфейс на http://localhost:8501
uv run python app/serve.py --server.port 8501
Дополнительно:
uv run windagent train— переобучить итоговую модель с нуля (~1 мин, послеfeatures build);uv run windagent agent --period test— агент на всех 28 выпусках;uv run windagent backtest --baselines-only— только модели для сравнения, ~10 с.
Сценарий в интерфейсе (или на https://steppewind.energy):
- «Прогноз» → листайте выпуски кнопками ‹ ›. Карточки, объяснение AI-агента, график с предыдущим прогнозом. «Пересчитать» строит выпуск заново и сверяет с сохранённым.
- Режим «История» — прогноз против фактической выработки на прошлых датах. Режим «Сейчас» — живой прогноз на завтра.
- «AI-агент» → выберите «Демо сбоя: испорчен прогноз ICON» → «Запустить агента». Агент сам исключит источник и объяснит решение.
- «Данные» → «Попробовать на примере» или загрузите CSV с фактом за февраль 2026 (формат датасета организаторов, одна или две турбины). Точность прогноза посчитается сразу.
- Кнопка чата внизу справа — вопросы о прогнозе (нужен ключ OpenAI на сервере).
Автоматическая проверка сценария на сайте (нужны pip install playwright и Google Chrome):
python scripts/check_site.py https://steppewind.energy --no-llm
Скрипт проходит все страницы как пользователь и печатает PASS/FAIL по 12 шагам.
Обновить архив погоды из Open-Meteo (нужен интернет; для проверки не требуется):
uv run windagent weather download --what single,previous,era5
Данные и интеграции
Данные турбин — Dataset/
Две турбины, 10-минутные записи с 11.03.2023 по 31.01.2026:
- время (UTC+6);
- средняя скорость ветра (м/с);
- нормализованная активная мощность (0–1);
- температура (°C).
Часовой пояс UTC+6 установлен сопоставлением с реанализом ERA5. Пропуски: 6.6% у турбины 1 (включая перерыв 18.05–17.07.2024) и 1.9% у турбины 2. Если у одной турбины нет данных, для ВЭС используется вторая.
Прогнозы погоды — Open-Meteo (бесплатно, без ключа)
| API | Что берём | Роль |
|---|---|---|
| Single Runs | прогоны ecmwf_ifs 00/06/12/18 UTC с точным временем старта, с 15.03.2024 | основной прогноз ветра |
| Previous Runs | ecmwf_ifs025, gfs_seamless, icon_seamless: прогнозы, выпущенные 1–3 суток назад | дополнительные модели |
| Historical Weather (ERA5) | реанализ | только анализ (проверка часового пояса); в прогнозе не используется |
Задержка публикации. Прогон считается доступным через фиксированную задержку после старта: ECMWF — 7 ч, GFS — 5 ч, ICON — 4 ч (config/settings.yaml).
Previous Runs. Сравнением с прогонами ECMWF проверено, что значение «N суток назад» для часа V берётся из прогона, стартовавшего примерно за 24·N часов до V. Для каждого целевого часа используется минимальное N, прогон которого уже опубликован.
OpenAI API (необязательно)
LLM-режим агента и чат на сайте. Без ключа агент работает в режиме правил, а чат отключён.
Переменная (.env) | По умолчанию | Назначение |
|---|---|---|
OPENAI_API_KEY | — | ключ OpenAI |
OPENAI_MODEL | gpt-5.6-terra | модель агента |
OPENAI_CHAT_MODEL | gpt-6-luna | модель чата |
CHAT_LIMIT_PER_IP / CHAT_LIMIT_TOTAL | 20 / 500 | вопросов в чат в день: с одного адреса / всего |
AGENT_LLM_LIMIT_PER_IP / AGENT_LLM_LIMIT_TOTAL | 3 / 40 | LLM-запусков агента в день с сайта |
Планировщик живого режима делает не больше 8 LLM-запусков в сутки, дальше работает по правилам.
Ограничения
- Данных SCADA за февраль 2026 нет, поэтому прогноз на тестовый период строится только по прогнозам погоды, без коррекции по свежим наблюдениям.
- Точность упирается в прогноз ветра: ошибка ECMWF на сутки вперёд — 2–2.5 м/с. Внезапные простои и ограничения мощности модель не предсказывает, а оценка идёт по фактической выработке.
- Отдельные прогоны ECMWF есть только с 15.03.2024, поэтому модели, использующие погоду, обучаются на ~22 месяцах. В марте–августе 2024 в архиве нет прогонов 06/18 UTC; на выпуски это не влияет, используется прогон 00 UTC.
- Интервал P10–P90 на контрольных периодах накрывает факт в 73–78% случаев при номинале 80%.
- Разные платформы. Журналы агента посчитаны на сервере (x86), файл сдачи — на Mac (ARM). Из-за разного округления на процессорах версия v1 в журналах на 5 датах отличается от файла сдачи в отдельных часах, меньше чем на 1 п.п. На одной платформе результаты совпадают точно.
- Проверка фактов гарантирует, что в тексте LLM нет чисел без источника. Но она не проверяет, что число приписано правильной величине.
- Время в интерфейсе везде UTC+6, как в данных SCADA. Официальное время Алматы с 2024 года — UTC+5.
- Бесплатный Open-Meteo ограничен 10 000 запросов в сутки на IP; для проверки проекта интернет не нужен.
Deployed-версия
https://steppewind.energy — прогноз на февраль 2026, живой прогноз на завтра, AI-агент, погода, качество, загрузка своих данных, чат.
Развёртывание: Docker Compose на отдельном сервере — приложение, планировщик агента, Caddy с автоматическим HTTPS (Let's Encrypt). Выкладка текущего коммита — ./deploy/deploy.sh.
Авторы коммитов
История коммитов
- 2026-09-23 17:41Caddy: заголовки безопасности (HSTS, nosniff, X-Frame-Options), без Server; deploy перезапускает Caddymadeburo
- 2026-09-23 17:31README: предупреждение о перезаписи журнала агентаmadeburo
- 2026-09-23 17:26README: финальная версия (демо, живой режим, агент, проверка сценария); scripts/check_site.pymadeburo
- 2026-09-23 17:21Вкладка «Сейчас»: кнопка «Обновить» без обрезкиmadeburo
- 2026-09-23 17:19Демо-видео: запись сайта с субтитрами (mp4, 75 с) и короткий GIF для README; сценарий записиmadeburo
- 2026-09-23 17:08Погода: все погодные модели показаны по умолчаниюmadeburo
- 2026-09-23 17:03docker-compose: планировщик без pull из реестра и без проверки веб-портаmadeburo
- 2026-09-23 17:02Модель без изменений: соседние точки ECMWF выключены (флаг use_in_model), калибровка интервала — 60 днейmadeburo
Все коммиты (32)
- 2026-09-23 16:45Агент: живой режим с планировщиком, проверка фактов LLM, демо сбоев данных; редизайн главнойmadeburo
- 2026-09-23 16:16Плитка «Мощность завтра»: отклонение от нормы только за завтра (согласовано с объяснением агента)madeburo
- 2026-09-23 16:15Журналы LLM-агента для всех 28 выпусков февраля; уточнения о платформенных расхожденияхmadeburo
- 2026-09-23 16:07Сайт: символ на кнопке чата с подсказкой, статус системы, светлее второй цвет, прогрев при стартеmadeburo
- 2026-09-23 16:03PWA: установка сайта как приложенияmadeburo
- 2026-09-23 15:57Интерфейс: агент на главной, схема цикла агента, второй цвет, мобильная вёрсткаmadeburo
- 2026-09-23 15:41Сайт: плавающий чат, проверка на своих данных, меньше отступ сверхуmadeburo
- 2026-09-23 15:34Фирменный стиль сайта: логотип, favicon, зелёная палитра, Manrope, новые графикиmadeburo
- 2026-09-23 15:25E7b: экран AI-агента — журнал шагов, версии прогноза, живой запуск, чат с лимитамиmadeburo
- 2026-09-23 15:21README: сайт развёрнут на https://steppewind.energymadeburo
- 2026-09-23 15:19deploy.sh: выкладка текущего коммита на сервер через git archive и docker composemadeburo
- 2026-09-23 15:15Модель чата по умолчанию: gpt-6-luna (дешевле и новее gpt-5.6-luna)madeburo
- 2026-09-23 15:14E6: AI-агент — инструменты, оркестраторы (OpenAI и правила), пересчёт при новых прогонахmadeburo
- 2026-09-23 15:09Модели OpenAI по умолчанию: gpt-5.6-terra (агент), gpt-5.6-luna (чат)madeburo
- 2026-09-23 15:02E7a: веб-интерфейс Streamlit и Docker-развёртываниеmadeburo
- 2026-09-23 14:52Домен проекта: https://steppewind.energymadeburo
- 2026-09-23 14:49gitignore: убрано упоминание внутренних документовmadeburo
- 2026-09-23 14:47E5: прогноз на февраль 2026 с интервалами P10-P90 и манифестамиmadeburo
- 2026-09-23 14:36Агент будет использовать OpenAI API: .env.examplemadeburo
- 2026-09-23 14:35E4: основная модель — ансамбль градиентного бустинга и физической кривойmadeburo
- 2026-09-23 14:19README: структура по шаблону жюри, результаты бэктеста, инструкции проверки; requirements.txtmadeburo
- 2026-09-23 14:16E3: кривая мощности, бейзлайны, метрики и бэктест по протоколу выпусковmadeburo
- 2026-09-23 14:15E2: архив прогнозов погоды Open-Meteo и DataStore(as_of)madeburo
- 2026-09-23 14:12E0+E1: скелет проекта, загрузка SCADA, QC и почасовая агрегацияmadeburo
Структура репозитория (207 файлов)
.dockerignore .env.example .gitignore .python-version .streamlit/config.toml Dataset/Dataset HackAlemAI для участников 11.03.2023-28.02.2026 - turbine 1.csv Dataset/Dataset HackAlemAI для участников 11.03.2023-28.02.2026 - turbine 2.csv Dockerfile README.md app/assets/favicon.svg app/assets/logo.svg app/assets/symbol.svg app/serve.py app/streamlit_app.py artifacts/.gitkeep artifacts/agent/2026-01-31/forecast_v1.csv artifacts/agent/2026-01-31/forecast_v2.csv artifacts/agent/2026-01-31/run.json artifacts/agent/2026-02-01/forecast_v1.csv artifacts/agent/2026-02-01/run.json artifacts/agent/2026-02-02/forecast_v1.csv artifacts/agent/2026-02-02/forecast_v2.csv artifacts/agent/2026-02-02/run.json artifacts/agent/2026-02-03/forecast_v1.csv artifacts/agent/2026-02-03/forecast_v2.csv artifacts/agent/2026-02-03/run.json artifacts/agent/2026-02-04/forecast_v1.csv artifacts/agent/2026-02-04/forecast_v2.csv artifacts/agent/2026-02-04/run.json artifacts/agent/2026-02-05/forecast_v1.csv artifacts/agent/2026-02-05/forecast_v2.csv artifacts/agent/2026-02-05/run.json artifacts/agent/2026-02-06/forecast_v1.csv artifacts/agent/2026-02-06/forecast_v2.csv artifacts/agent/2026-02-06/run.json artifacts/agent/2026-02-07/forecast_v1.csv artifacts/agent/2026-02-07/forecast_v2.csv artifacts/agent/2026-02-07/run.json artifacts/agent/2026-02-08/forecast_v1.csv artifacts/agent/2026-02-08/forecast_v2.csv artifacts/agent/2026-02-08/run.json artifacts/agent/2026-02-09/forecast_v1.csv artifacts/agent/2026-02-09/forecast_v2.csv artifacts/agent/2026-02-09/run.json artifacts/agent/2026-02-10/forecast_v1.csv artifacts/agent/2026-02-10/forecast_v2.csv artifacts/agent/2026-02-10/run.json artifacts/agent/2026-02-11/forecast_v1.csv artifacts/agent/2026-02-11/run.json artifacts/agent/2026-02-12/forecast_v1.csv artifacts/agent/2026-02-12/forecast_v2.csv artifacts/agent/2026-02-12/run.json artifacts/agent/2026-02-13/forecast_v1.csv artifacts/agent/2026-02-13/forecast_v2.csv artifacts/agent/2026-02-13/run.json artifacts/agent/2026-02-14/forecast_v1.csv artifacts/agent/2026-02-14/forecast_v2.csv artifacts/agent/2026-02-14/run.json artifacts/agent/2026-02-15/forecast_v1.csv artifacts/agent/2026-02-15/forecast_v2.csv artifacts/agent/2026-02-15/run.json artifacts/agent/2026-02-16/forecast_v1.csv artifacts/agent/2026-02-16/forecast_v2.csv artifacts/agent/2026-02-16/run.json artifacts/agent/2026-02-17/forecast_v1.csv artifacts/agent/2026-02-17/forecast_v2.csv artifacts/agent/2026-02-17/run.json artifacts/agent/2026-02-18/forecast_v1.csv artifacts/agent/2026-02-18/forecast_v2.csv artifacts/agent/2026-02-18/run.json artifacts/agent/2026-02-19/forecast_v1.csv artifacts/agent/2026-02-19/forecast_v2.csv artifacts/agent/2026-02-19/run.json artifacts/agent/2026-02-20/forecast_v1.csv artifacts/agent/2026-02-20/forecast_v2.csv artifacts/agent/2026-02-20/run.json artifacts/agent/2026-02-21/forecast_v1.csv artifacts/agent/2026-02-21/run.json artifacts/agent/2026-02-22/forecast_v1.csv artifacts/agent/2026-02-22/run.json artifacts/agent/2026-02-23/forecast_v1.csv artifacts/agent/2026-02-23/forecast_v2.csv artifacts/agent/2026-02-23/run.json artifacts/agent/2026-02-24/forecast_v1.csv artifacts/agent/2026-02-24/forecast_v2.csv artifacts/agent/2026-02-24/run.json artifacts/agent/2026-02-25/forecast_v1.csv artifacts/agent/2026-02-25/forecast_v2.csv artifacts/agent/2026-02-25/run.json artifacts/agent/2026-02-26/forecast_v1.csv artifacts/agent/2026-02-26/forecast_v2.csv artifacts/agent/2026-02-26/run.json artifacts/agent/2026-02-27/forecast_v1.csv artifacts/agent/2026-02-27/run.json artifacts/models/production.pkl.gz artifacts/reports/backtest.md artifacts/reports/backtest_preds.parquet artifacts/submission/forecast_feb2026.csv artifacts/submission/forecast_feb2026_dayahead.csv artifacts/submission/manifests/2026-01-31.json artifacts/submission/manifests/2026-02-01.json artifacts/submission/manifests/2026-02-02.json artifacts/submission/manifests/2026-02-03.json artifacts/submission/manifests/2026-02-04.json artifacts/submission/manifests/2026-02-05.json artifacts/submission/manifests/2026-02-06.json artifacts/submission/manifests/2026-02-07.json artifacts/submission/manifests/2026-02-08.json artifacts/submission/manifests/2026-02-09.json artifacts/submission/manifests/2026-02-10.json artifacts/submission/manifests/2026-02-11.json artifacts/submission/manifests/2026-02-12.json artifacts/submission/manifests/2026-02-13.json artifacts/submission/manifests/2026-02-14.json artifacts/submission/manifests/2026-02-15.json artifacts/submission/manifests/2026-02-16.json artifacts/submission/manifests/2026-02-17.json artifacts/submission/manifests/2026-02-18.json artifacts/submission/manifests/2026-02-19.json artifacts/submission/manifests/2026-02-20.json artifacts/submission/manifests/2026-02-21.json artifacts/submission/manifests/2026-02-22.json artifacts/submission/manifests/2026-02-23.json artifacts/submission/manifests/2026-02-24.json artifacts/submission/manifests/2026-02-25.json artifacts/submission/manifests/2026-02-26.json artifacts/submission/manifests/2026-02-27.json cache/weather/.gitkeep cache/weather/era5.parquet cache/weather/previous_ecmwf_ifs025.parquet cache/weather/previous_gfs_seamless.parquet cache/weather/previous_icon_seamless.parquet cache/weather/single_ecmwf_ifs.parquet cache/weather/single_ecmwf_ifs_missing.json cache/weather/single_ecmwf_ifs_nb_e.parquet cache/weather/single_ecmwf_ifs_nb_e_missing.json cache/weather/single_ecmwf_ifs_nb_ne.parquet cache/weather/single_ecmwf_ifs_nb_ne_missing.json cache/weather/single_ecmwf_ifs_nb_sw.parquet cache/weather/single_ecmwf_ifs_nb_sw_missing.json cache/weather/single_ecmwf_ifs_nb_w.parquet cache/weather/single_ecmwf_ifs_nb_w_missing.json config/settings.yaml deploy/Caddyfile deploy/deploy.sh deploy/pwa/apple-touch-icon.png deploy/pwa/favicon.svg deploy/pwa/icon-192.png deploy/pwa/icon-512.png deploy/pwa/manifest.webmanifest deploy/pwa/maskable-512.png deploy/pwa/offline.html deploy/pwa/sw.js docker-compose.yml docs/media/demo.gif docs/media/demo.mp4 pyproject.toml requirements.txt scripts/check_site.py scripts/record_demo.py tests/__init__.py tests/test_agent.py tests/test_agent_view.py tests/test_baselines_backtest.py tests/test_forecast.py tests/test_gbm.py tests/test_live_and_faults.py tests/test_pwa.py tests/test_scada.py tests/test_ui.py tests/test_upload.py tests/test_weather_store.py uv.lock windagent/__init__.py windagent/__main__.py windagent/agent/__init__.py windagent/agent/factcheck.py windagent/agent/orchestrator.py windagent/agent/tools.py windagent/cli.py windagent/config.py windagent/data/__init__.py windagent/data/openmeteo.py windagent/data/scada.py windagent/data/store.py windagent/data/weather.py windagent/eval/__init__.py windagent/eval/backtest.py windagent/eval/metrics.py windagent/features/__init__.py windagent/features/build.py windagent/features/engineer.py windagent/forecast.py windagent/live.py windagent/models/__init__.py windagent/models/baselines.py windagent/models/gbm.py windagent/models/power_curve.py windagent/models/quantile.py windagent/protocol.py windagent/ui/__init__.py windagent/ui/agent_view.py windagent/ui/charts.py windagent/ui/components.py windagent/ui/data.py windagent/ui/theme.py windagent/ui/upload.py
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.