О проекте
Команда: OnlyFriends
Кейс HackAlem.ai: Энергетика — Самрук-Казына
Стадия: Доведённый продукт
Задача кейса: AI-агент, прогнозирующий выработку ветровой электростанции по погодным данным
Суть
Воспроизводимый почасовой прогноз нормализованной мощности двух турбин на 48 часов по архивным выпускам ECMWF IFS, с LangGraph-агентом, ретропрогнозом февраля, дашбордом Operations и ассистентом для вопросов по прогнозу.
Как устроено
10-минутные SCADA агрегируются в часовые цели; для каждого выпуска берётся архивный запуск ECMWF из Open-Meteo Single Runs с допущением доступности +7 ч. Признаки: ветер 10/100 м, компоненты, сдвиг, плотность воздуха, возраст выпуска. Обучаются монотонная кривая мощности, CatBoost-модели и смеси 50/50 с помесячной rolling-валидацией; победитель выбирается по MAE окт 2025–янв 2026. LangGraph-агент выполняет цикл загрузка → проверки → расчёт → анализ → запись происхождения (хеш погоды, версия модели); ответы на вопросы через OpenAI с данными прогноза.
Ключевые решения
- CatBoost
- монотонная кривая мощности
- rolling/causal validation
- nested model search (9 сеток)
- LangGraph
- LangChain tools
- LangSmith tracing
- leakage-safe replay
Метрики
Коммит: v1 модели MAE 0.158, RMSE 0.234 (нормализованная мощность)
Особенности
Очень аккуратная работа с доступностью данных: явно зафиксированное допущение публикации ECMWF +7 ч, версии модели с проверкой, что обучение закончилось до выпуска, хеши и provenance каждого прогноза; watch-процесс пересчитывает прогноз каждые 15 минут только при изменении погоды.
Стек
Python · uv · CatBoost · LangGraph · LangChain · React · TypeScript · Vite · pytest
Модели
OpenAI
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-cc2bfdd3-onlyfriends.
README
README.mdOnlyFriends: прогноз мощности ВЭС
Воспроизводимый почасовой прогноз нормализованной активной мощности двух турбин на 48 часов. Для каждого исторического запуска используется отдельный архивный выпуск ECMWF IFS, доступность которого оценивается до момента расчёта. Числовой прогноз выполняет обученная модель; кодовый оркестратор запускает загрузку, проверки, расчёт, анализ и запись происхождения результата.
Веб-интерфейс React + TypeScript + Vite находится в frontend/. Он получает погоду и прогноз обученной модели через windpower.api; порядок запуска API и интерфейса описан в документации фронтенда.
Состояние
Реализованы загрузка истории, обучение с помесячной проверкой, архив погоды, прогноз одного выпуска, последовательный ретропрогноз и API для визуализации. История организаторов не публикуется в Git; положите свои копии двух CSV в raw/. Февральских значений мощности в исходных файлах нет, поэтому февральский MAE/RMSE нельзя вычислить до получения факта.
Отдельный агент на LangGraph выполняет ограниченный прогнозный цикл, LangChain предоставляет погодные и поисковые инструменты, а LangSmith поддерживает необязательную трассировку.
Данные и временные правила
raw/*turbine 1.csvиraw/*turbine 2.csv: исходные 10-минутные данные с колонкамиСтатистическое время,Средняя скорость ветра(m/s),Нормализованная активная мощность,Средняя температура окружающей среды(°C).- Часовая цель — средняя мощность из минимум четырёх корректных записей. Недостаточно покрытые часы не используются. 12 неоднозначных 10-минутных меток при смене часового пояса Казахстана исключены с учётом в отчёте.
- Рабочее предположение: исходные метки заданы в
Asia/Almaty; ежедневный запуск происходит в 00:00 этого пояса. Для обучения разрешены цели только до 2026-02-01 00:00 локального времени. Метки внутри кода хранятся в UTC. - Метеоисточник: Open-Meteo Single Runs API,
models=ecmwf_ifs, координаты43.645150,78.535604и43.643198,78.538828. Оба пункта попадают в одну модельную ячейку около43.620384,78.47891; различие турбин модель изучает по идентификатору и их мощности. - Источник не отдаёт точное историческое время публикации в ответе. Мы допускаем запуск ECMWF не раньше чем через 7 часов после инициализации. Это явное допущение, а не доказанный timestamp публикации. Его правило и время выбранного запуска сохраняются с прогнозом. Open-Meteo называет архив Single Runs hindcasts; неизменность ответа со времени исходного выпуска не доказана. Поэтому строгую историческую доступность погоды нельзя подтвердить одним этим API — для эксплуатации нужен архив оригинальных файлов с временем получения либо подтверждёнными журналами публикации.
- Скорость ветра запрашивается в м/с. В прогнозе используются только переменные архивного выпуска: ветер на 10 и 100 м, направление на 100 м, температура на 2 м, давление, календарное время и горизонт. Дополнительные признаки — компоненты ветра, сдвиг между высотами, возраст выпуска, соседние прогнозные часы того же выпуска и оценка плотности воздуха. Измеренный в будущем ветер не является входом прогнозной модели.
Сведения об API, доступности запусков и лицензии: Single Runs, условия Open-Meteo. Данные Open-Meteo распространяются по CC BY 4.0 с указанием источника; открытый API предназначен для некоммерческого использования.
Установка
Нужны Python 3.10+ и uv. Из корня репозитория:
uv sync
uv run pytest -q
Первое обучение скачивает около 688 ежедневных архивных выпусков и кэширует ответы в artifacts/weather/. Если архив временно недоступен, пропущенные даты фиксируются в training_manifest.json; фактическая погода их не заменяет. Файлы raw/, artifacts/ и .venv/ по умолчанию игнорируются Git. Для проверки результата в репозитории отдельно сохранены выбранные модели, метрики, 29 актуальных выпусков и итоговые CSV; исходные SCADA и полный погодный кэш не публикуются.
Обучение и прогноз
API и визуализация
uv run python -m windpower.api
# во втором терминале:
cd frontend
npm ci
npm run dev
API слушает только 127.0.0.1:8000 и по умолчанию использует artifacts/model/model.joblib. Для архива интерфейс переводит локальную дату выпуска 00:00 Asia/Almaty в UTC: выпуск 31 января соответствует 2026-01-30T19:00:00Z. API подбирает раннюю версию модели для этого выпуска и проверяет, что её обучение закончилось до момента запуска. Режим live получает актуальный прогноз ECMWF и может начать 48-часовое окно с будущей даты в пределах десятидневного окна API. Ответ содержит по 48 погодных и модельных точек для каждой из двух координат, версию модели, погодный выпуск или время получения, хеш и предупреждения. Прогнозы API сохраняются отдельно в artifacts/dashboard_runs/.
Экран Operations превращает почасовой прогноз в краткую сводку для оператора: показывает ожидаемые 3-часовые изменения средней нормализованной мощности двух турбин от 25 п.п., низкую выработку не выше 15% не менее трёх часов, разницу с предыдущим сопоставимым прогнозом и этапы LangGraph. Пороги служат сигналами для проверки, а не подтверждёнными пределами безопасности. При открытой вкладке live-прогноз пересчитывается каждые 15 минут; сравнение использует только общие прогнозные часы. Исторический выпуск сравнивается только с более ранним выпуском.
Для автономного контроля при закрытом браузере запустите в отдельном терминале uv run python -m windpower.watch --interval-minutes 15. Он проверяет погоду сразу после старта и затем каждые 15 минут; модель вызывается только если для того же часа выпуска изменились погодные значения или версия модели. --once делает одну проверку. Процесс должен оставаться запущенным; в промышленной среде его запуск и перезапуск следует поручить менеджеру процессов.
Вопросы ассистенту отправляются через POST /api/ask вместе с ID сохранённого прогноза, выбранным часом, турбиной и горизонтом. Сервер читает именно этот прогноз. Пик нормализованной мощности рассчитывается напрямую по почасовым значениям; для других вопросов используется OPENAI_API_KEY из .env или окружения, и ключ в браузер не передаётся. На вопросы с объяснением ассистент отвечает несколькими предложениями с конкретными значениями прогноза и оговоркой о неопределённости; простые численные ответы остаются короткими. Для объяснения причин ветра сервер дополнительно получает прогноз давления на уровне моря в пяти соседних точках ECMWF. Для исторического режима используется тот же архивный выпуск, а для live контекст запрашивается отдельно и совпадение погодного выпуска не утверждается. Градиент давления помогает объяснить возможный механизм, но не доказывает конкретный фронт или циклон.
Примеры: /api/forecast?mode=historical&issue=2026-01-30T19%3A00%3A00Z и /api/forecast?mode=live. Если модель или погода недоступны, API выдаёт структурированную ошибку, без подстановки чисел. Историческое время публикации погодного выпуска по-прежнему оценивается правилом +7 часов; это ограничение показано в UI и не считается доказательством фактической доступности.
uv run python -m windpower train
uv run python -m windpower forecast --issue 2026-01-31
uv run python -m windpower backtest --from 2026-01-31 --to 2026-02-28
uv run python -m windpower run --issue 2026-02-01
uv run python scripts/verify_outputs.py
uv run python scripts/run_model_search.py
uv run python scripts/run_turbine_control.py
ForecastAgent принимает predictor(features) -> DataFrame с полями turbine_id, valid_time_utc, lead_hour и predicted_power для 48 часов по каждой турбине. ForecastAgent(...).run(issue_utc) принимает точный час UTC, возвращает AgentResult и при успехе сохраняет JSON с прогнозом, сводкой по двум 24-часовым окнам, временем и хешем погодного выпуска и версией модели. Исходный ответ погоды хранится отдельно в кеше. Контракт проверяется синтетическим предиктором из tests/test_agent.py; его значения не являются прогнозом ВЭС.
run_daily(first_issue_utc, last_issue_utc) последовательно запускает граф по дням и прекращает прогон при первой ошибке. Лимит — 29 запусков: 31 января и 1–28 февраля; для всех дат используется один час UTC.
research_sources(query) вызывает отдельный инструмент search_web, который возвращает до пяти ссылок и кратких фрагментов текущей выдачи. Поиск предназначен для исследования документации и не вызывается во время ретропрогноза. Его результаты не подтверждают историческую доступность сведений и не попадают в признаки модели. При недоступности сервиса поиск завершается ошибкой, не подменяя погодные данные.
Для необязательной трассировки задайте LANGSMITH_TRACING=true, LANGSMITH_API_KEY и при необходимости LANGSMITH_PROJECT. Ключ задаётся через переменную окружения. Агент отправляет в LangSmith шаги и их статус, скрывая входы и выходы; без ключа работает локально. Для ретропрогноза требуется отдельно подтвердить фактическое время публикации погодных выпусков: текущая проверка использует оценку run_time_utc + 7h <= issue_time_utc.
train строит монотонную кривую мощности от прогнозного ветра, прямые CatBoost-модели с базовыми и расширенными погодными признаками, двухэтапную коррекцию ветра с кривой мощности и фиксированные смеси 50/50. Глубина 4/6, регуляризация 3/10, 500 деревьев и seed 42 заданы заранее. Основной победитель выбирается по средней MAE на октябре 2025 — январе 2026 при условии улучшения в большинстве месяцев: погодная модель сравнивается с лучшей базовой прямой моделью, смесь — с лучшей прямой. Для первого выпуска 31 января модель выбирается только по октябрю — декабрю 2025. Проверочный месяц определяется датой выпуска, поэтому его известные целевые часы следующего месяца тоже оцениваются. Каждый месяц должен иметь не менее 80% ежедневных погодных выпусков; фактическое покрытие указано в CSV метрик. Затем создаются две версии модели: с метками строго до 31 января 00:00 и строго до 1 февраля 00:00 по местному времени. Прогноз отвергается, если последняя обучающая метка не раньше времени выпуска. Февраль не участвует в подборе.
forecast сохраняет 48 значений для каждой турбины и 48 суммарных значений станции. Сумма двух нормализованных мощностей имеет диапазон [0, 2]; трактовка как эквивалента номинала одной турбины предполагает одинаковую паспортную мощность обеих машин. backtest повторяет 29 запусков с 31 января по 28 февраля включительно и сохраняет каждый выпуск отдельно. run для 31 января читает обучающие метки и погодные выпуски только до момента выпуска; 1 февраля обучает новую версию после поступления данных за 31 января. Он проверяет хеш исходных CSV, погодного архива для обучения и версию алгоритма; при изменении переобучает модель и создаёт прогноз. Если часть архивных выпусков ранее не загрузилась, агент повторяет попытку и проверяет, появился ли новый допустимый вход. Бинарные модели сохраняются по неизменяемым версиям. Повтор запуска с теми же моделью и погодным выпуском возвращает тот же файл; новый выпуск получает отдельный run_id.
Оркестратор run отвечает только за полный цикл одного выпуска. Его допустимые операции: проверка истории и кэша, обучение при изменении допустимых входов, запрос архивной погоды, прогноз и запись результатов. Он не меняет исходные CSV, не заменяет недостающую погоду фактической и не строит численный прогноз свободным текстом. Выход — путь к CSV либо явная ошибка с JSON-журналом. Цикл завершается после одного успешного выпуска или конечной ошибки; передача задач другим агентам не предусмотрена. Для него не нужен LLM: выбор и проверки детерминированы, а численный прогноз делает CatBoost.
Качество на месяцах подбора модели
На четырёх последовательных месяцах (октябрь 2025 — январь 2026) оценено 11 528 прогнозов «турбина × час × выпуск» для выбранной модели. Таблица показывает среднее по месячным метрикам, поэтому повторяющиеся целевые часы учитываются как отдельные прогнозы разных выпусков. Эти месяцы использованы для выбора кандидата; таблица не является независимой оценкой будущей ошибки. Покрытие ежедневных погодных выпусков — 100% в каждом из четырёх месяцев. Из 123 выпусков у 112 есть все 96 целевых меток по двум турбинам; 11 имеют неполные метки и учтены в отчёте покрытия.
| Модель | MAE | RMSE |
|---|---|---|
| Базовая кривая мощности | 0,18296 | 0,23788 |
| Прямая CatBoost, базовые признаки | 0,15955 | 0,23618 |
| Прежняя смесь 50/50 | 0,15907 | 0,23322 |
| CatBoost, погодные признаки (выбрана) | 0,15351 | 0,23121 |
| Смесь с погодными признаками | 0,15470 | 0,22845 |
Выбранная модель снизила MAE относительно базовой кривой на 16,1%, относительно прежней смеси — на 3,5%. Она лучше базовой прямой CatBoost в октябре, ноябре и декабре; в январе немного уступает. На 123 парных днях выпуска её MAE ниже прежней смеси в 78 днях. Парная разность средней месячной MAE равна −0,00555, а 95% интервал бутстрэпа по дням внутри месяцев — [−0,00815; −0,00295]. Интервал исследовательский: модель выбиралась на этих же месяцах, а соседние дни могут зависеть друг от друга. MAE по горизонтам 1–24 и 25–48: 0,14489 и 0,16223. Самый сложный месяц — декабрь (0,18846). Эти значения не являются метриками февраля.
Девять моделей и подбор гиперпараметров
Дополнительный GridSearchCV использует только временные folds июля–сентября 2025 года. После заморозки параметров каждая модель обучается заново перед октябрём, ноябрём, декабрём и январём и оценивается на одинаковых известных часах архивных выпусков. Часы после 31 января без факта исключены. Исходный погодный архив содержит 682 выпуска; шесть дней 5–10 августа 2025 года отсутствуют в кэше. Таблица даёт среднее четырёх месячных метрик, а не ошибку февраля.
| Семейство | Лучшие параметры внутреннего поиска | MAE | RMSE | MAE 1–24 ч | MAE 25–48 ч |
|---|---|---|---|---|---|
Рабочая CatBoost weather_d6_l10 | 500 деревьев, depth=6, l2=10 | 0,153514 | 0,231209 | 0,144887 | 0,162230 |
| CatBoost | depth=4, l2=10 | 0,154588 | 0,233887 | 0,146376 | 0,162881 |
| MLP | hidden=(32,), alpha=0,01 | 0,167046 | 0,227539 | 0,155280 | 0,178918 |
| ExtraTrees | depth=10, min_leaf=10 | 0,169208 | 0,227447 | 0,159508 | 0,178995 |
| RandomForest | depth=10, min_leaf=30 | 0,169902 | 0,231004 | 0,160578 | 0,179313 |
| HistGradientBoosting | l2=1, max_leaf_nodes=15 | 0,172695 | 0,231702 | 0,164444 | 0,181046 |
| Ridge + сплайн ветра | alpha=100 | 0,175656 | 0,230507 | 0,168621 | 0,182740 |
| ElasticNet + сплайн ветра | alpha=0,001, l1_ratio=0,7 | 0,177054 | 0,231013 | 0,170446 | 0,183709 |
| Изотоническая кривая | ветер 100 м | 0,182958 | 0,237876 | 0,176154 | 0,189815 |
| Наивная средняя за прошлое окно | 30 дней | 0,323139 | 0,368021 | 0,323994 | 0,322278 |
Новый CatBoost выиграл у рабочей модели только октябрь: 0,121957 против 0,122753; в ноябре–январе проиграл. Его средняя MAE выше на 0,001074. Остальные восемь моделей также не улучшили среднюю MAE. Правило выбора требует выигрыш как минимум в 3 из 4 месяцев и меньшую среднюю MAE; для версии 31 января — в 2 из первых 3. Рабочие версии и февральский прогноз оставлены прежними. Полные сетки, метрики по месяцам, двум турбинам и дням выпуска, парные разности и допущения находятся в artifacts/model_search/ и протоколе оценки. Разбор версий, скачков и различий турбин включает отдельную контрольную модель каждой турбины.
Результаты
| Путь | Содержимое |
|---|---|
artifacts/model/model.joblib | Активная версия для выпусков с 1 февраля. Загружать только из доверенного каталога: формат joblib исполняет Python при десериализации. |
artifacts/model/versions/*.joblib | Неизменяемые бинарные версии, включая модель для выпуска 31 января. |
artifacts/model/early_model_metadata.json | Версия ранней модели, отсечка данных и месяцы выбора. |
artifacts/model/provenance/*.json | Неизменяемые записи о версии модели и хешах допустимых обучающих входов. Для выпуска 31 января хеш SCADA вычислен только по почасовым строкам до выпуска. |
artifacts/model/validation_metrics.csv | MAE, RMSE, смещение и MAE по горизонтам 1–24/25–48 для каждого кандидата и месяца. |
artifacts/model/validation_metrics_by_turbine.csv | Те же метрики по каждой турбине. |
artifacts/model/validation_metrics_by_issue_day.csv | Парные ошибки по датам выпуска для проверки устойчивости улучшения. |
artifacts/model/validation_comparison.csv | Явные разности метрик по месяцам, турбинам и горизонтам. |
artifacts/model/validation_paired_day_deltas.csv и validation_paired_day_summary.json | Разности по дням и исследовательские интервалы неопределённости. |
artifacts/model/validation_issue_coverage.csv | Полные и частичные выпуски по доступным целевым меткам. |
artifacts/model_search/* | Результаты GridSearch и временной проверки девяти семейств, контроль отдельных турбин и происхождение исходных данных. |
artifacts/model/training_manifest.json | Размеры выборок, качество SCADA, недоступные погодные даты и временные допущения. |
artifacts/weather/*.json | Исходный ответ погодного API, параметры запроса и SHA-256. |
artifacts/forecasts/*.csv | Время выпуска и целевого часа, горизонт, турбина, мощность [0,1], версия модели, хеш погоды и координаты модельной ячейки. |
artifacts/station_forecasts/*.csv | Сумма прогнозов двух турбин по каждому выпуску, с явной единицей и диапазоном [0,2]. |
artifacts/runs/*.json | Статус, шаги, анализ результата и происхождение отдельного прогноза. |
artifacts/backtest_*.csv | Все прогнозы последовательного ретропрогноза. |
artifacts/february_latest_forecast.csv | Один последний допустимый прогноз для каждого часа февраля и каждой турбины: 1 344 строки для передачи на оценку. |
MAE и RMSE выражены в долях нормализованной мощности, а не в МВт·ч. Для расчёта физической выработки нужны паспортные мощности и подтверждённая база нормализации. Ошибки февраля рассчитываются отдельно при появлении фактических февральских значений; их нельзя выдавать за результаты проверки на исторических месяцах.
Описание требований и выбранной архитектуры: spec, implementation plan, проверки.
Авторы коммитов
История коммитов
- 2026-09-23 17:57Merge docs/wind-power-agentic-context into mainaidarBARMEN
- 2026-09-23 17:55refactor: remove operations dashboardaidarBARMEN
- 2026-09-23 17:52Merge docs/wind-power-agentic-context into mainF1zhen
- 2026-09-23 17:51dsfdsaidarBARMEN
- 2026-09-23 17:49Merge branch 'main' into somethingAdul23
- 2026-09-23 17:42smthF1zhen
- 2026-09-23 17:42New222aidarBARMEN
- 2026-09-23 17:40ReadmeAdil
Все коммиты (51)
- 2026-09-23 17:33Merge AIdar backend into main, preserve local frontendF1zhen
- 2026-09-23 17:26Merge remote-tracking branch 'origin/main'F1zhen
- 2026-09-23 17:24add stop turbine logicF1zhen
- 2026-09-23 17:22NewaidarBARMEN
- 2026-09-23 17:09feat: add forecast operations monitoring and Luna assistantaidarBARMEN
- 2026-09-23 17:06design v2, analyticsF1zhen
- 2026-09-23 16:24Merge main with API-driven wind forecast dashboardaidarBARMEN
- 2026-09-23 16:13feat: connect dashboard to forecast agent and grounded Q&AaidarBARMEN
- 2026-09-23 16:03Merge branch 'something'Adil
- 2026-09-23 15:58second commitAdil
- 2026-09-23 15:50fix: validate turbine control input provenanceF1zhen
- 2026-09-23 15:46feat: benchmark nine forecast models and turbine controlF1zhen
- 2026-09-23 15:30feat: define nine bounded model gridsF1zhen
- 2026-09-23 15:27feat: add causal search folds and simple baselinesF1zhen
- 2026-09-23 15:25docs: specify temporal model search and benchmark planF1zhen
- 2026-09-23 15:11Merge weather feature model into mainF1zhen
- 2026-09-23 15:09feat: report paired validation gains and uncertaintyF1zhen
- 2026-09-23 15:07Merge remote-tracking branch 'origin/main'F1zhen
- 2026-09-23 15:03fix: require stable gain for weather blendsF1zhen
- 2026-09-23 15:02feat: train weather model and replay February forecastsF1zhen
- 2026-09-23 14:56feat: version weather-aware candidates and stable selectionF1zhen
- 2026-09-23 14:49feat: derive weather physics and run-local context featuresF1zhen
- 2026-09-23 14:49Merge pull request #2 from BAITC-Hacks/somethingaidarBARMEN
- 2026-09-23 14:47frontend step 1Adil
- 2026-09-23 14:47fix: align blend clipping and issue-month validationF1zhen
- 2026-09-23 14:44docs: plan weather feature validation experimentF1zhen
- 2026-09-23 14:39fix: make historical replay causal and publish verified forecastsF1zhen
- 2026-09-23 14:28Add web source research and bounded daily forecast replayaidarBARMEN
- 2026-09-23 14:21v1 version of models with MAE-0.158, RMSE-0,234F1zhen
- 2026-09-23 14:17Add LangGraph forecast agent with LangChain and LangSmith tracingaidarBARMEN
- 2026-09-23 14:12feat: train and replay leakage-safe wind power forecastsF1zhen
- 2026-09-23 14:01First commitAdil
- 2026-09-23 13:53Merge remote-tracking branch 'origin/main'F1zhen
- 2026-09-23 13:51Merge pull request #1 from BAITC-Hacks/model_evaluationZhenis Esimbekov
- 2026-09-23 13:51feat: select wind power model with rolling validationF1zhen
- 2026-09-23 13:50docs: expand wind forecasting project visionaidarBARMEN
- 2026-09-23 13:48feat: build leakage-safe forecast examplesF1zhen
- 2026-09-23 13:47feat: fetch archived weather runs safelyF1zhen
- 2026-09-23 13:46docs: clarify agent rules and repository scopeaidarBARMEN
- 2026-09-23 13:45feat: parse and aggregate turbine historyF1zhen
- 2026-09-23 13:42docs: plan wind power model implementationF1zhen
- 2026-09-23 13:41docs: define wind power forecasting designF1zhen
- 2026-09-23 13:32docs: scaffold wind forecasting project contextaidarBARMEN
Структура репозитория (337 файлов)
.env.example .gitattributes .gitignore AGENTS.md README.md artifacts/agent_runs/248d0b75d0074aaa859f.json artifacts/backtest_2026-01-31_2026-02-28.csv artifacts/backtest_station_2026-01-31_2026-02-28.csv artifacts/february_latest_forecast.csv artifacts/forecasts/2026-01-31_105fbfbbec63f9b131c0.csv artifacts/forecasts/2026-01-31_82c9a4732b6a293bb934.csv artifacts/forecasts/2026-02-01_1a23bb123e9117ce1367.csv artifacts/forecasts/2026-02-01_3c15eb56d6a774009e3b.csv artifacts/forecasts/2026-02-02_1131f73cd313701ea42a.csv artifacts/forecasts/2026-02-02_b0fbfdad725c1e7d6ad4.csv artifacts/forecasts/2026-02-03_212029d3080d52d9e4fd.csv artifacts/forecasts/2026-02-03_a69a017110d566549ffa.csv artifacts/forecasts/2026-02-04_7004436591eeaafc39b6.csv artifacts/forecasts/2026-02-04_f30826c27901b2471cda.csv artifacts/forecasts/2026-02-05_5a6bf76a458d2d6ef611.csv artifacts/forecasts/2026-02-05_a3f43ea9da785b8792af.csv artifacts/forecasts/2026-02-06_9b9a65bed76112ad6550.csv artifacts/forecasts/2026-02-06_bac45252b354618f50e0.csv artifacts/forecasts/2026-02-07_40f1b88e634e124752c4.csv artifacts/forecasts/2026-02-07_69c47344ac9e45c2a5db.csv artifacts/forecasts/2026-02-08_0052b10718b6ed2c0d46.csv artifacts/forecasts/2026-02-08_a146f343d09c25467051.csv artifacts/forecasts/2026-02-09_4982a93a9d83ee4ddaa4.csv artifacts/forecasts/2026-02-09_b6c9de98de91ffd4ca2d.csv artifacts/forecasts/2026-02-10_06be96d43c34d8cd906a.csv artifacts/forecasts/2026-02-10_f7bf4c324a436eeee7c7.csv artifacts/forecasts/2026-02-11_27d2f66313da287e3836.csv artifacts/forecasts/2026-02-11_a12ffaa178902ac17c39.csv artifacts/forecasts/2026-02-12_96d009861a91fab80048.csv artifacts/forecasts/2026-02-12_b40652708580c61c98bc.csv artifacts/forecasts/2026-02-13_1d93dbecc68238d9cb03.csv artifacts/forecasts/2026-02-13_f98896ee2d0ca133a921.csv artifacts/forecasts/2026-02-14_cdd696de100c784e4edf.csv artifacts/forecasts/2026-02-14_e0637988d4328988ec80.csv artifacts/forecasts/2026-02-15_2ba2e4f6e3cb189da8a8.csv artifacts/forecasts/2026-02-15_ec4294a0b9cb5f1ae684.csv artifacts/forecasts/2026-02-16_8784b733d1ae6403bf96.csv artifacts/forecasts/2026-02-16_fc07a60e4be15259aa70.csv artifacts/forecasts/2026-02-17_03b59d78a3f9d2bf2cfc.csv artifacts/forecasts/2026-02-17_5a45447c1a0f9606961f.csv artifacts/forecasts/2026-02-18_285557dfe25182c32924.csv artifacts/forecasts/2026-02-18_e78b2b21b2e68d9a69d9.csv artifacts/forecasts/2026-02-19_982304903e0b73fda60a.csv artifacts/forecasts/2026-02-19_f6344c76f33215f22c98.csv artifacts/forecasts/2026-02-20_50cdda18c4924a004303.csv artifacts/forecasts/2026-02-20_efb3b5bd641262f9196c.csv artifacts/forecasts/2026-02-21_04d6594181e7c34a8ddf.csv artifacts/forecasts/2026-02-21_871eba10ee4f65854cea.csv artifacts/forecasts/2026-02-22_4a9947db00525a240b74.csv artifacts/forecasts/2026-02-22_6f9caeae595c4c1b3bd7.csv artifacts/forecasts/2026-02-23_692038e56cd9730e417c.csv artifacts/forecasts/2026-02-23_c046db3ef30e60e6c621.csv artifacts/forecasts/2026-02-24_33970c2e3fb33ddeaa57.csv artifacts/forecasts/2026-02-24_8090714f5353c3415bfd.csv artifacts/forecasts/2026-02-25_79d768514c76c9049553.csv artifacts/forecasts/2026-02-25_cef849076fe64e8f04b3.csv artifacts/forecasts/2026-02-26_18b587c899d4e90d667d.csv artifacts/forecasts/2026-02-26_f80554419b2c4b109b15.csv artifacts/forecasts/2026-02-27_a30753899b82dfb0e622.csv artifacts/forecasts/2026-02-27_fa3ce5d838f1b5d3a4aa.csv artifacts/forecasts/2026-02-28_5622dd1a4c0595177791.csv artifacts/forecasts/2026-02-28_8159c141a847228c1fb1.csv artifacts/model/early_model_metadata.json artifacts/model/model.joblib artifacts/model/model_metadata.json artifacts/model/provenance/38f23a1cf5ef3657_aabce9cc9e94.json artifacts/model/provenance/7a9f78e7185f367e_b1d5c2ec3840.json artifacts/model/provenance/aab1aa6175191b6a_086b3325e329.json artifacts/model/provenance/bf3acae84b67ba31_e42c34e78da5.json artifacts/model/training_manifest.json artifacts/model/validation_comparison.csv artifacts/model/validation_issue_coverage.csv artifacts/model/validation_metrics.csv artifacts/model/validation_metrics_by_issue_day.csv artifacts/model/validation_metrics_by_turbine.csv artifacts/model/validation_paired_day_deltas.csv artifacts/model/validation_paired_day_summary.json artifacts/model/versions/38f23a1cf5ef3657.joblib artifacts/model/versions/7a9f78e7185f367e.joblib artifacts/model/versions/aab1aa6175191b6a.joblib artifacts/model/versions/bf3acae84b67ba31.joblib artifacts/model_search/best_params.json artifacts/model_search/inner_grid.csv artifacts/model_search/outer_by_issue_day.csv artifacts/model_search/outer_by_turbine.csv artifacts/model_search/outer_monthly.csv artifacts/model_search/paired_day_deltas.csv artifacts/model_search/paired_day_uncertainty.json artifacts/model_search/selection.json artifacts/model_search/turbine_control_by_turbine.csv artifacts/model_search/turbine_control_monthly.csv artifacts/model_search/turbine_control_summary.json artifacts/runs/0052b10718b6ed2c0d46.json artifacts/runs/03b59d78a3f9d2bf2cfc.json artifacts/runs/04d6594181e7c34a8ddf.json artifacts/runs/06be96d43c34d8cd906a.json artifacts/runs/105fbfbbec63f9b131c0.json artifacts/runs/1131f73cd313701ea42a.json artifacts/runs/18b587c899d4e90d667d.json artifacts/runs/1a23bb123e9117ce1367.json artifacts/runs/1d93dbecc68238d9cb03.json artifacts/runs/212029d3080d52d9e4fd.json artifacts/runs/27d2f66313da287e3836.json artifacts/runs/285557dfe25182c32924.json artifacts/runs/2ba2e4f6e3cb189da8a8.json artifacts/runs/33970c2e3fb33ddeaa57.json artifacts/runs/3c15eb56d6a774009e3b.json artifacts/runs/40f1b88e634e124752c4.json artifacts/runs/4982a93a9d83ee4ddaa4.json artifacts/runs/4a9947db00525a240b74.json artifacts/runs/50cdda18c4924a004303.json artifacts/runs/5622dd1a4c0595177791.json artifacts/runs/5a45447c1a0f9606961f.json artifacts/runs/5a6bf76a458d2d6ef611.json artifacts/runs/692038e56cd9730e417c.json artifacts/runs/69c47344ac9e45c2a5db.json artifacts/runs/6f9caeae595c4c1b3bd7.json artifacts/runs/7004436591eeaafc39b6.json artifacts/runs/79d768514c76c9049553.json artifacts/runs/8090714f5353c3415bfd.json artifacts/runs/8159c141a847228c1fb1.json artifacts/runs/82c9a4732b6a293bb934.json artifacts/runs/871eba10ee4f65854cea.json artifacts/runs/8784b733d1ae6403bf96.json artifacts/runs/96d009861a91fab80048.json artifacts/runs/982304903e0b73fda60a.json artifacts/runs/9b9a65bed76112ad6550.json artifacts/runs/a12ffaa178902ac17c39.json artifacts/runs/a146f343d09c25467051.json artifacts/runs/a30753899b82dfb0e622.json artifacts/runs/a3f43ea9da785b8792af.json artifacts/runs/a69a017110d566549ffa.json artifacts/runs/b0fbfdad725c1e7d6ad4.json artifacts/runs/b40652708580c61c98bc.json artifacts/runs/b6c9de98de91ffd4ca2d.json artifacts/runs/bac45252b354618f50e0.json artifacts/runs/c046db3ef30e60e6c621.json artifacts/runs/cdd696de100c784e4edf.json artifacts/runs/cef849076fe64e8f04b3.json artifacts/runs/e0637988d4328988ec80.json artifacts/runs/e78b2b21b2e68d9a69d9.json artifacts/runs/ec4294a0b9cb5f1ae684.json artifacts/runs/efb3b5bd641262f9196c.json artifacts/runs/f30826c27901b2471cda.json artifacts/runs/f6344c76f33215f22c98.json artifacts/runs/f7bf4c324a436eeee7c7.json artifacts/runs/f80554419b2c4b109b15.json artifacts/runs/f98896ee2d0ca133a921.json artifacts/runs/fa3ce5d838f1b5d3a4aa.json artifacts/runs/fc07a60e4be15259aa70.json artifacts/station_forecasts/2026-01-31_105fbfbbec63f9b131c0.csv artifacts/station_forecasts/2026-01-31_82c9a4732b6a293bb934.csv artifacts/station_forecasts/2026-02-01_1a23bb123e9117ce1367.csv artifacts/station_forecasts/2026-02-01_3c15eb56d6a774009e3b.csv artifacts/station_forecasts/2026-02-02_1131f73cd313701ea42a.csv artifacts/station_forecasts/2026-02-02_b0fbfdad725c1e7d6ad4.csv artifacts/station_forecasts/2026-02-03_212029d3080d52d9e4fd.csv artifacts/station_forecasts/2026-02-03_a69a017110d566549ffa.csv artifacts/station_forecasts/2026-02-04_7004436591eeaafc39b6.csv artifacts/station_forecasts/2026-02-04_f30826c27901b2471cda.csv artifacts/station_forecasts/2026-02-05_5a6bf76a458d2d6ef611.csv artifacts/station_forecasts/2026-02-05_a3f43ea9da785b8792af.csv artifacts/station_forecasts/2026-02-06_9b9a65bed76112ad6550.csv artifacts/station_forecasts/2026-02-06_bac45252b354618f50e0.csv artifacts/station_forecasts/2026-02-07_40f1b88e634e124752c4.csv artifacts/station_forecasts/2026-02-07_69c47344ac9e45c2a5db.csv artifacts/station_forecasts/2026-02-08_0052b10718b6ed2c0d46.csv artifacts/station_forecasts/2026-02-08_a146f343d09c25467051.csv artifacts/station_forecasts/2026-02-09_4982a93a9d83ee4ddaa4.csv artifacts/station_forecasts/2026-02-09_b6c9de98de91ffd4ca2d.csv artifacts/station_forecasts/2026-02-10_06be96d43c34d8cd906a.csv artifacts/station_forecasts/2026-02-10_f7bf4c324a436eeee7c7.csv artifacts/station_forecasts/2026-02-11_27d2f66313da287e3836.csv artifacts/station_forecasts/2026-02-11_a12ffaa178902ac17c39.csv artifacts/station_forecasts/2026-02-12_96d009861a91fab80048.csv artifacts/station_forecasts/2026-02-12_b40652708580c61c98bc.csv artifacts/station_forecasts/2026-02-13_1d93dbecc68238d9cb03.csv artifacts/station_forecasts/2026-02-13_f98896ee2d0ca133a921.csv artifacts/station_forecasts/2026-02-14_cdd696de100c784e4edf.csv artifacts/station_forecasts/2026-02-14_e0637988d4328988ec80.csv artifacts/station_forecasts/2026-02-15_2ba2e4f6e3cb189da8a8.csv artifacts/station_forecasts/2026-02-15_ec4294a0b9cb5f1ae684.csv artifacts/station_forecasts/2026-02-16_8784b733d1ae6403bf96.csv artifacts/station_forecasts/2026-02-16_fc07a60e4be15259aa70.csv artifacts/station_forecasts/2026-02-17_03b59d78a3f9d2bf2cfc.csv artifacts/station_forecasts/2026-02-17_5a45447c1a0f9606961f.csv artifacts/station_forecasts/2026-02-18_285557dfe25182c32924.csv artifacts/station_forecasts/2026-02-18_e78b2b21b2e68d9a69d9.csv artifacts/station_forecasts/2026-02-19_982304903e0b73fda60a.csv artifacts/station_forecasts/2026-02-19_f6344c76f33215f22c98.csv artifacts/station_forecasts/2026-02-20_50cdda18c4924a004303.csv artifacts/station_forecasts/2026-02-20_efb3b5bd641262f9196c.csv artifacts/station_forecasts/2026-02-21_04d6594181e7c34a8ddf.csv artifacts/station_forecasts/2026-02-21_871eba10ee4f65854cea.csv artifacts/station_forecasts/2026-02-22_4a9947db00525a240b74.csv artifacts/station_forecasts/2026-02-22_6f9caeae595c4c1b3bd7.csv artifacts/station_forecasts/2026-02-23_692038e56cd9730e417c.csv artifacts/station_forecasts/2026-02-23_c046db3ef30e60e6c621.csv artifacts/station_forecasts/2026-02-24_33970c2e3fb33ddeaa57.csv artifacts/station_forecasts/2026-02-24_8090714f5353c3415bfd.csv artifacts/station_forecasts/2026-02-25_79d768514c76c9049553.csv artifacts/station_forecasts/2026-02-25_cef849076fe64e8f04b3.csv artifacts/station_forecasts/2026-02-26_18b587c899d4e90d667d.csv artifacts/station_forecasts/2026-02-26_f80554419b2c4b109b15.csv artifacts/station_forecasts/2026-02-27_a30753899b82dfb0e622.csv artifacts/station_forecasts/2026-02-27_fa3ce5d838f1b5d3a4aa.csv artifacts/station_forecasts/2026-02-28_5622dd1a4c0595177791.csv artifacts/station_forecasts/2026-02-28_8159c141a847228c1fb1.csv assets/Wind turbine by Poly by Google - 8Tke6WIyZtg.glb docs/AGENTIC_DESIGN.md docs/ARCHITECTURE.md docs/CODING_RULES.md docs/EVALS.md docs/FORECAST_DIAGNOSTICS.md docs/PROJECT_VISION.md docs/SECURITY.md docs/TOOLS.md docs/superpowers/plans/2026-09-23-model-search.md docs/superpowers/plans/2026-09-23-planet-frontend.md docs/superpowers/plans/2026-09-23-weather-features.md docs/superpowers/plans/2026-09-23-wind-power-forecast.md docs/superpowers/specs/2026-09-23-model-search-design.md docs/superpowers/specs/2026-09-23-weather-features-design.md docs/superpowers/specs/2026-09-23-wind-power-forecast-design.md evals/.gitkeep frontend/.gitignore frontend/README.md frontend/index.html frontend/package-lock.json frontend/package.json frontend/public/models/ATTRIBUTION.md frontend/public/models/supplied-turbine.glb frontend/src/App.test.tsx frontend/src/App.tsx frontend/src/analytics/AnalyticsSection.tsx frontend/src/analytics/analytics.css frontend/src/components/AssistantBar.tsx frontend/src/components/Icon.tsx frontend/src/components/MetricsPanel.tsx frontend/src/components/Settings.tsx frontend/src/components/Timeline.tsx frontend/src/data/february2026.json frontend/src/data/shelek-terrain.json frontend/src/forecast/environment.test.ts frontend/src/forecast/environment.ts frontend/src/forecast/forecast.test.ts frontend/src/forecast/forecast.ts frontend/src/forecast/testFixture.ts frontend/src/forecast/windApi.test.ts frontend/src/forecast/windApi.ts frontend/src/main.tsx frontend/src/scene/DynamicLighting.tsx frontend/src/scene/Landscape.tsx frontend/src/scene/ModelAsset.tsx frontend/src/scene/Planet.tsx frontend/src/scene/PlanetInteraction.tsx frontend/src/scene/PlanetScene.tsx frontend/src/scene/SeasonalEnvironment.tsx frontend/src/scene/SkyController.tsx frontend/src/scene/Turbine.tsx frontend/src/scene/WindField.tsx frontend/src/scene/config.ts frontend/src/scene/environmentPresets.ts frontend/src/scene/interaction.test.ts frontend/src/scene/interaction.ts frontend/src/scene/landscapeCoordinates.test.ts frontend/src/scene/placement.test.ts frontend/src/scene/placement.ts frontend/src/scene/useWindAt.test.tsx frontend/src/scene/useWindAt.ts frontend/src/scene/windMotion.test.ts frontend/src/scene/windMotion.ts frontend/src/styles.css frontend/src/turbines/SelectionSummary.tsx frontend/src/turbines/TurbineFilters.tsx frontend/src/turbines/TurbineTable.tsx frontend/src/turbines/TurbinesPage.test.tsx frontend/src/turbines/TurbinesPage.tsx frontend/src/turbines/tableModel.ts frontend/src/turbines/turbineTable.test.ts frontend/src/turbines/turbines.css frontend/tsconfig.json frontend/vite.config.ts pyproject.toml scripts/run_model_search.py scripts/run_turbine_control.py scripts/verify_outputs.py src/.gitkeep tests/.gitkeep tests/__init__.py tests/test_agent.py tests/test_cli.py tests/test_dashboard_api.py tests/test_data.py tests/test_features.py tests/test_forecast_qa.py tests/test_model.py tests/test_model_search.py tests/test_operations.py tests/test_regional_weather.py tests/test_reporting.py tests/test_source_search.py tests/test_training.py tests/test_watch.py tests/test_weather.py uv.lock windpower/__init__.py windpower/__main__.py windpower/agent.py windpower/agent_tools.py windpower/api.py windpower/cli.py windpower/data.py windpower/features.py windpower/forecast.py windpower/forecast_qa.py windpower/model.py windpower/model_loader.py windpower/model_search.py windpower/operations.py windpower/regional_weather.py windpower/reporting.py windpower/search_estimators.py windpower/source_search.py windpower/store.py windpower/training.py windpower/turbine_control.py windpower/validation.py windpower/watch.py windpower/weather.py windpower/weather_provider.py windpower/workflow.py
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.