О проекте
Команда: holy-project
Кейс HackAlem.ai: Энергетика — Самрук-Казына
Стадия: Рабочий MVP
Задача кейса: AI-агент, прогнозирующий выработку ветровой электростанции по погодным данным
Суть
Агент почасового интервального прогноза мощности двух ветротурбин на 24/48 ч по архивным прогнозам погоды с CatBoost и бейзлайнами, журналом действий агента и локальной панелью на Astro.
Как устроено
10-минутные SCADA CSV проверяются и агрегируются в часы (≥4 валидных из 6), признаки строятся только из данных, доступных на момент origin. Погода — Open-Meteo Single Runs (ecmwf_ifs) или архив NOAA GFS через ecCodes, provenance gate отвергает неподтверждённую доступность прогноза. CatBoost даёт квантили p10/p50/p90, сравнивается с persistence, seasonal и power curve на rolling-origin backtest. Ограниченный агентный цикл (погода → признаки → прогноз → диагностика → запись) с опциональным анализом через OpenAI Responses API; артефакты с манифестом и хешами.
Ключевые решения
- CatBoost quantile regression
- rolling-origin backtest
- persistence/seasonal/power curve baselines
- provenance gate погоды
- NOAA GFS GRIB (ecCodes)
- Open-Meteo ecmwf_ifs
- content-hash манифест артефактов
Метрики
январский backtest (3 фолда, 288 строк): CatBoost MAE 0.2054, RMSE 0.2578, покрытие p10–p90 20.49%; power curve MAE 0.1677, RMSE 0.2732; persistence MAE 0.4702 (мощность нормирована в [0,1])
Особенности
Строгий контроль утечки: время публикации погодного прогноза проверяется отдельно от времени инициализации модели; статус degraded при переходе на baseline. Честно отмечено, что power curve лучше CatBoost по MAE и покрытие интервалов низкое. Интерфейс на русском и казахском.
Стек
Python · pandas · NumPy · CatBoost · FastAPI · Uvicorn · Astro · TypeScript · Lumen UI · Streamlit
Модели
OpenAI Responses API
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-4e01c468-holy-project.
README
README.mdWindline — воспроизводимый прогноз ветровой генерации
Windline строит почасовой прогноз нормированной активной мощности двух ветровых турбин на 24 или 48 часов. Проект объединяет проверку исходных наблюдений, погодные данные с временной проверкой происхождения, ML-модели и базовые методы, журнал действий агента и локальную панель.
Публичного развёртывания сейчас нет: приложение рассчитано на локальный запуск. Панель Astro/Lumen обращается к локальному FastAPI; Streamlit оставлен как запасной интерфейс.
Интерфейс
Скриншоты работающей локальной версии: реальные архивные прогнозы NOAA GFS, CatBoost и сохранённый запуск на 31 января 2026 года. Изображение ветропарка в шапке — декоративное, не фотография площадки.

Светлая тема и историческая оценка


Задача и пользователи
Решение предназначено для участников HackAlem и специалистов, которым нужно воспроизвести прогноз выработки по истории двух турбин и проверить, какие данные, модель и правила использованы. Оно показывает интервальный прогноз, качество входной истории, происхождение погоды и доступные результаты исторической оценки.
Исходные CSV содержат десятиминутные наблюдения для двух турбин. Они не являются готовыми train/test-выборками. Windline сначала проверяет и агрегирует их в почасовую историю, а затем строит признаки только из сведений, доступных на момент начала прогноза.
Что реализовано
- Подготовка истории двух турбин: проверка структуры, чисел, временного порядка, дубликатов и пропусков; агрегация в часы при наличии не менее четырёх валидных наблюдений из шести.
- Горизонт 24 или 48 часов с почасовыми строками отдельно для каждой турбины и квантилями прогноза
p10,p50,p90. - CatBoost на CPU и базовые модели: persistence, seasonal и power curve. Историческая оценка использует временные rolling origins и сравнивает модели на общих доступных фактических значениях.
- Проверка доступности наблюдений и погодной информации относительно времени начала прогноза. Неизвестная или неподтверждённая доступность не считается доказанной только по времени инициализации модели.
- Ограниченный агентный цикл: проверка погоды, подготовка признаков, получение прогноза, анализ заранее разрешённых диагностик и запись результата. При отсутствии
OPENAI_API_KEYработает детерминированный анализатор; LLM не подменяет прогнозную модель. - Сохраняемые результаты, проверяемые по манифесту: прогноз CSV, метрики JSON, погода и происхождение JSON, журнал событий JSONL, отчёт Markdown и манифест.
- Локальная панель на Astro и Lumen с разделами прогноза, исторической оценки, трассы агента и качества данных; доступны русский и казахский тексты, светлая и тёмная темы.
- Вертикальный масштаб графика: приближение/отдаление, сдвиг вверх/вниз, «Авто» по диапазону квантилей и сброс «0–100%». Масштаб меняет только отображение, не прогнозные значения.
- Локализованный календарь и отдельный выбор часа в формате 00–23 (UTC+05); таблицы с прокруткой, скачивание CSV и понятные пояснения всех этапов агента с раскрываемой диагностикой.
Успешный или degraded-запуск может содержать все шесть артефактов; неуспешный запуск не публикует фиктивный CSV прогноза. Состояние degraded означает, что результат получен с ограничением, например после перехода на baseline, и его нужно читать вместе с отчётом и provenance.
Стек и архитектура
- Python 3.11+: подготовка истории, признаки, обучение, оценка, агент и CLI.
- pandas, NumPy и CatBoost: табличная обработка и квантильные модели. CatBoost запускается на CPU; стандартная конфигурация — 250 итераций, четыре потока и seed 42.
- FastAPI и Uvicorn: локальный API над тем же сервисом приложения, который использует CLI.
- Astro, TypeScript и Lumen UI: браузерная панель. Astro проксирует
/apiна API, запущенный на127.0.0.1:8000. - Streamlit: сохранённый резервный интерфейс над тем же сервисом.
- Open-Meteo Single Runs, модель
ecmwf_ifs: погодный источник по умолчанию. Его архивные данные сами по себе не доказывают точное время публикации; в competition-режиме provenance gate не принимает неподтверждённую доступность. - NOAA GFS + ecCodes: источник архивных прогнозов с ограниченным чтением GRIB-полей. На 17 проверенных архивных началах обучен отдельный CatBoost для NOAA: 1296 обучающих пар и 288 калибровочных. Прогноз на 31 января содержит 96 строк; внешний анализ OpenAI выполнен. Статус
degradedсвязан с упорядочиванием квантилей в 15 строках, а не с резервной моделью. - OpenAI Responses API: необязательный ограниченный анализ диагностик. Без ключа используется детерминированный анализатор.
Основной поток данных:
CSV турбин → проверка и почасовая история → прогноз погоды и provenance gate
→ доступные на origin признаки → CatBoost / baseline
→ проверка сетки и квантилей → аудит, артефакты и локальная панель
CLI и API используют фасад Application; состав адаптеров создаётся через build_runtime. Артефакты записываются атомарно и получают content hashes для аудита и повторного использования результата. API остаётся однопроцессным и локальным: одновременно допускается одна активная задача прогноза.
Основные каталоги: wind_forecast/ — Python-приложение и адаптеры, frontend/ — рабочий Astro-интерфейс, tests/ и frontend/tests/ — проверки, docs/ — документация. artifacts/ и .cache/ содержат локальные результаты и погодный кэш и не входят в Git. Старый дизайн-прототип и временные материалы разработки не нужны для запуска и исключены из состава проекта.
Воспроизводимый запуск
Команды выполняются из корня репозитория. Два предоставленных CSV уже лежат здесь; если используется другая папка, передайте её через --data-dir или DATA_DIR. Файлы должны оканчиваться на turbine 1.csv и turbine 2.csv (либо turbine_1.csv и turbine_2.csv).
1. Установка
Нужны Python 3.11+, Node.js 22.19+ и npm. Для повторяемости Python-зависимости берутся из lock-файла; фронтенд устанавливается по package-lock.json.
python3 -m venv .venv
.venv/bin/python -m pip install --upgrade pip
.venv/bin/python -m pip install -r requirements.lock.txt
.venv/bin/python -m pip install --no-deps -e .
cp -n .env.example .env
cd frontend
npm ci
cd ..
NOAA не требует API-ключа. OpenAI необязателен: без ключа работает детерминированный анализатор. Не добавляйте настоящий ключ в README, исходный код или артефакты; OPENAI_API_KEY хранится только в локальном .env или окружении процесса. Не перезаписывайте существующий .env, если он уже настроен.
2. Подготовка, обучение и оценка
Подготовьте реальные CSV:
.venv/bin/python -m wind_forecast.cli prepare
Для первого ограниченного запуска используйте NOAA и отдельные каталоги:
export RUN_MODE=competition WEATHER_PROVIDER=noaa_gfs AUTO_TRAIN_MODEL=0
export CACHE_DIR=.cache/wind-gfs MODEL_DIR=artifacts/models-gfs RUN_DIR=artifacts/runs-gfs-evaluated
AUTO_TRAIN_MODEL=0 предотвращает неожиданную загрузку большого погодного архива при первом запросе. Готовая модель своего источника загружается; если её нет, агент явно переходит на baseline и сохраняет degraded. Модель Open-Meteo не переиспользуется как модель GFS.
Обученная NOAA-модель сейчас есть в локальной рабочей среде, но её веса и кэш не входят в репозиторий. В чистом клоне сначала выполните обучение ниже: оно загрузит недостающие архивы GFS. Если сразу запустить прогноз с AUTO_TRAIN_MODEL=0, приложение без такой модели вернёт явно отмеченный baseline.
Проверенный ограниченный запуск обучения использует начала 12–25 января и калибровочные начала 26–28 января. Его можно воспроизвести следующей командой (первое скачивание архивов занимает существенно больше времени, чем сам fit):
WEATHER_PROVIDER=noaa_gfs CACHE_DIR=.cache/wind-gfs MODEL_DIR=artifacts/models-gfs RUN_DIR=artifacts/runs-gfs-evaluated \
.venv/bin/python -m wind_forecast.cli train --mode competition --train-start 2026-01-12 --train-end 2026-01-25 --calibration-start 2026-01-26 --calibration-end 2026-01-28
Полное обучение на диапазоне по умолчанию и январский backtest запускаются отдельно, когда есть время и сетевой бюджет: команды ниже могут скачать много архивных полей. Их успешное завершение на всём реальном периоде пока не заявлено.
WEATHER_PROVIDER=noaa_gfs CACHE_DIR=.cache/wind-gfs MODEL_DIR=artifacts/models-gfs RUN_DIR=artifacts/runs-gfs-evaluated \
.venv/bin/python -m wind_forecast.cli train --mode competition
WEATHER_PROVIDER=noaa_gfs CACHE_DIR=.cache/wind-gfs MODEL_DIR=artifacts/models-gfs RUN_DIR=artifacts/runs-gfs-evaluated \
.venv/bin/python -m wind_forecast.cli backtest --mode competition
Проверенный короткий backtest на уже загруженном архиве:
WEATHER_PROVIDER=noaa_gfs CACHE_DIR=.cache/wind-gfs MODEL_DIR=artifacts/models-gfs .venv/bin/python -m wind_forecast.cli backtest --mode competition --start 2026-01-26 --end 2026-01-28 --history-start 2026-01-12 --calibration-days 3
Три независимых временных фолда, 288 сопоставленных прогнозных строк на модель. Это небольшой январский тест, не оценка всего февраля. На нём CatBoost: MAE 0,2054, RMSE 0,2578, покрытие p10–p90 20,49%. Power curve: MAE 0,1677, RMSE 0,2732; persistence: MAE 0,4702. Мощность нормализована в [0,1]: MAE 0,2054 соответствует 20,54 процентного пункта, не «20,54% относительной ошибки». CatBoost лучше по RMSE, power curve — по MAE; низкое покрытие интервалов CatBoost требует улучшения. Перекрывающиеся горизонты не являются независимыми наблюдениями. Метрики и построчные предсказания сохранены в artifacts/models-gfs/backtest/; активная модель при backtest не изменяется.
backtest выполняет скользящую оценку по январским началам и сравнивает persistence, seasonal, power-curve и CatBoost. Погодные прогнозы каждого начала должны пройти проверку исторической доступности. Полные параметры обучения и калибровки доступны через train --help и backtest --help.
По умолчанию кэш находится в .cache/wind, модели — в artifacts/models, а результаты запусков — в artifacts/runs. Параметры --cache-dir, --model-dir и --run-dir меняют эти пути.
3. Один прогноз и ежедневная симуляция
Начало прогноза задаётся часовым ISO-8601 временем с часовым поясом. Для сценария с фиксированным UTC+05 начало 31 января в полночь можно записать и в эквивалентном UTC-виде:
.venv/bin/python -m wind_forecast.cli run --mode competition \
--origin 2026-01-31T00:00:00+05:00 --horizon 48
Ежедневный сценарий с полуночным началом UTC+05 с 31 января по 28 февраля включительно:
.venv/bin/python -m wind_forecast.cli simulate --mode competition \
--start 2026-01-31 --end 2026-02-28
Для этой сетки ожидаются 29 начал, 96 строк на запуск и 2784 строки суммарно (перекрывающиеся часы относятся к разным началам). Полный NOAA-прогон этого диапазона ещё не выполнен; сетевой объём значительно больше одного запуска. Предыдущая offline-симуляция 1–28 февраля охватывала 28 начал на синтетической погоде и не заменяет реальный прогон или оценку точности.
В CLI также доступны --cache-dir, --model-dir, --run-dir, --refresh, временные границы обучения/калибровки, число итераций и путь к demo-only weather fixture. Полный список параметров:
.venv/bin/python -m wind_forecast.cli --help
.venv/bin/python -m wind_forecast.cli run --help
4. Панель и локальный API
Запустите API и Astro в двух терминалах из корня репозитория. Это локальный сценарий с реальным NOAA, а не публичное production-развёртывание:
RUN_MODE=competition WEATHER_PROVIDER=noaa_gfs AUTO_TRAIN_MODEL=0 DEMO_OFFLINE=0 \
CACHE_DIR=.cache/wind-gfs MODEL_DIR=artifacts/models-gfs RUN_DIR=artifacts/runs-gfs-evaluated \
.venv/bin/python -m wind_forecast.presentation.api --host 127.0.0.1 --port 8000
cd frontend
npm run dev
Откройте http://127.0.0.1:4321. API предоставляет /api/health, /api/runs/latest, /api/runs/{run_id}, POST /api/forecast-jobs, чтение состояния задачи и загрузку CSV прогноза. Для демонстрации с полностью офлайн погодой запустите API вместо первой команды так:
RUN_MODE=demo DEMO_OFFLINE=1 .venv/bin/python -m wind_forecast.presentation.api \
--host 127.0.0.1 --port 8000
API использует конфигурацию серверного процесса: браузер не может переключить режим или источник. Подробности по маршрутам и ограничениям приведены в документации API. Запасной Streamlit-интерфейс можно запустить так:
RUN_MODE=demo DEMO_OFFLINE=1 .venv/bin/streamlit run app.py
5. Проверки проекта
.venv/bin/pytest -q
cd frontend
npm test
npm run check
npm run build
Перед показом проверяйте фактический результат команды и статус погоды в панели или отчёте запуска. Код competition не превращает недоказанную историческую доступность погоды в проверенную.
Как проверить решение жюри
- Выполнить установку и подготовку CSV, настроить NOAA переменными окружения выше.
- Запустить один CLI-прогноз на
2026-01-31T00:00:00+05:00, 48 часов. Проверить в выводе режим, статус и каталог артефактов; baseline должен быть явно отмечен как ограниченный результат. - Открыть панель на порту 4321: проверить NOAA как источник, две турбины, 48 часов, интервалы p10–p90 и карточку происхождения данных.
- Скачать CSV: 96 строк плюс заголовок. В манифесте проверить, что
available_atпогодного источника предшествует origin; открыть журнал этапов агента. - Повторить тот же запуск с
--refreshили кнопкой повторного расчёта. При неизменных данных и коде ожидается повторное использование результата; обновившиеся входы требуют нового запуска. - Переключить RU/ҚАЗ и тему, проверить сохранение настроек после обновления страницы. Январские метрики и февральскую симуляцию оценивать отдельно: отсутствие февральского факта должно быть явно указано.
Данные, интеграции и временные правила
- Поставленные организаторами CSV названы диапазоном до 28.02.2026, но их последняя фактическая строка — 2026-01-31 23:50. Февральских наблюдений мощности в этих файлах нет.
- Активная мощность нормирована и хранится в диапазоне
[0, 1]. Это не МВт: для пересчёта нужна подтверждённая номинальная мощность каждой турбины. - Наивные метки времени в исходных CSV трактуются текущей политикой как UTC+05 и затем сохраняются в UTC. Это явное допущение, а не подтверждение исторической временной зоны источника.
- Часовое наблюдение доступно после его завершения. Признаки прогноза используют только строки с
available_at <= origin; прогнозныеlead_hoursнумеруются от 0. - Синтетическая погода предназначена для офлайн-демо. Архивные Open-Meteo Single Runs не дают подтверждения точного времени публикации нужного прогноза. Не называйте такую погоду проверенной только потому, что известны время инициализации или скачивания.
- Адаптер NOAA GFS проверяет диапазоны байтов, версии объектов и метаданные GRIB. Время доступности — консервативная верхняя граница публикации S3, не точное время выпуска NCEP. Для проверенного начала
2026-01-31T00:00+05:00использован цикл2026-01-30T06:00Z, публикация требуемых объектов не позднее2026-01-30T10:02:14Z, то есть до origin2026-01-30T19:00Z. Проверены все 48 часов и семь погодных полей; обе турбины попадают в одну крупную ячейку GFS 0,25°. - Январский backtest допустим только там, где имеются реальные целевые наблюдения и погодный источник, доступный до каждого начала. Синтетические offline-метрики — инженерная проверка, а не оценка качества прогноза.
- Симуляция февраля не измеряет точность: фактической февральской мощности нет. Не заполняйте её последними прогнозами и не рисуйте метрики на вымышленных наблюдениях.
Подробный русскоязычный протокол приёмки, временная сетка и 5–7-минутный сценарий защиты находятся в docs/VALIDATION_FLOW_RU.md. Протокол описывает проверки и критерии; он не означает, что каждый внешний источник уже принят.
Ограничения и готовность к развёртыванию
- Отдельный NOAA CatBoost обучен на коротком январском окне; сохранён аудит остаточных ошибок на более поздних калибровочных данных. Интервалы строятся непосредственно квантильными моделями, а не этим аудитом (
used_for_intervals=false). Проверенный запускrun-20260130T190000Z-h48-9e30d93d53e5использует CatBoost и OpenAI-анализ; 15 из 96 строк потребовали упорядочивания квантилей. Выполнен короткий rolling backtest на началах 26–28 января; полный январь и весь февральский прогон ещё не выполнены.competition_valid=true— проверка входной погоды, не доказательство точности ML-модели или готовности публичного production-сервиса. - Для этой версии нет публичной демонстрационной ссылки. FastAPI ограничен
127.0.0.1/localhost, не имеет аутентификации и рассчитан на один локальный процесс; не выставляйте его в интернет без отдельной защиты. - Метаданные незавершённых API-задач хранятся в памяти процесса и теряются при его перезапуске. Сохранённые артефакты запусков остаются на диске.
- Для Astro 5.18.2 зафиксированы нерешённые замечания аудита безопасности. Считайте фронтенд локальным демо до обновления зависимости и повторной проверки.
- CatBoost и базовые модели дают прогнозы, но отсутствие февральского факта и непроверенные источники/периоды вне принятого NOAA-горизонта ограничивают выводы о качестве и калибровке интервалов.
Материалы
Авторы коммитов
История коммитов
- 2026-09-23 17:50nurs: finalOchkan.nurgaliev
- 2026-09-23 17:47nurs: xdn.nurgaliev
- 2026-09-23 17:19nurs: hotfixn.nurgaliev
- 2026-09-23 17:14nurs: xdn.nurgaliev
- 2026-09-23 16:46nurs: xdn.nurgaliev
- 2026-09-23 16:24nurs: hotfixn.nurgaliev
- 2026-09-23 16:07nurs: xdn.nurgaliev
- 2026-09-23 15:44nurs: xdn.nurgaliev
Все коммиты (11)
- 2026-09-23 15:11nurs: xdxdn.nurgaliev
- 2026-09-23 14:37nurs: che tttaaamn.nurgaliev
- 2026-09-23 14:00nurs: che tttaaamn.nurgaliev
Структура репозитория (150 файлов)
.env.example .gitignore .hackflow/BOARD.md .hackflow/BRIEF.md .hackflow/prompts/builder.md .hackflow/prompts/product.md .hackflow/prompts/qa.md .hackflow/reports/.gitignore .hackflow/reports/.gitkeep .streamlit/config.toml AGENTS.md Dataset HackAlemAI для участников 11.03.2023-28.02.2026 - turbine 1.csv Dataset HackAlemAI для участников 11.03.2023-28.02.2026 - turbine 2.csv HackAlem AI_ Agentic AI для прогнозирования выработки ВЭС - Google Документы.pdf README.md app.py docs/API.md docs/DEMO.md docs/NOAA_GFS.md docs/VALIDATION_FLOW_RU.md docs/architecture/2026-09-23-modular-redesign.md docs/images/backtest.png docs/images/dashboard-dark.png docs/images/dashboard-light.png docs/superpowers/plans/2026-09-23-composition-root.md docs/superpowers/plans/2026-09-23-lumen-web.md docs/superpowers/plans/2026-09-23-wind-power-agent.md docs/superpowers/specs/2026-09-23-custom-turbine-design.md docs/superpowers/specs/2026-09-23-lumen-web-design.md docs/superpowers/specs/2026-09-23-wind-power-agent-design.md frontend/README.md frontend/astro.config.mjs frontend/package-lock.json frontend/package.json frontend/public/images/wind-landscape.webp frontend/src/components/AppShell.astro frontend/src/components/MetricCard.astro frontend/src/components/SectionHeader.astro frontend/src/components/StatusBadge.astro frontend/src/features/agent-trace/AgentTrace.astro frontend/src/features/agent-trace/reasons.mjs frontend/src/features/agent-trace/render.ts frontend/src/features/agent-trace/trace.css frontend/src/features/backtest/BacktestPanel.astro frontend/src/features/backtest/render.ts frontend/src/features/data-quality/DataQualityPanel.astro frontend/src/features/data-quality/render.ts frontend/src/features/forecast/ForecastTable.astro frontend/src/features/forecast/Overview.astro frontend/src/features/forecast/chart.d.mts frontend/src/features/forecast/chart.mjs frontend/src/features/forecast/date-time/ForecastDateTime.astro frontend/src/features/forecast/date-time/date-time.d.mts frontend/src/features/forecast/date-time/date-time.mjs frontend/src/features/forecast/percent-axis.d.mts frontend/src/features/forecast/percent-axis.mjs frontend/src/features/forecast/render.ts frontend/src/layouts/DashboardLayout.astro frontend/src/lib/api.ts frontend/src/lib/dashboard-model.mjs frontend/src/lib/dashboard.ts frontend/src/lib/forecast-workflow.d.mts frontend/src/lib/forecast-workflow.mjs frontend/src/lib/format.ts frontend/src/lib/preferences.d.mts frontend/src/lib/preferences.mjs frontend/src/lib/types.ts frontend/src/pages/index.astro frontend/src/styles/global.css frontend/src/styles/tokens.css frontend/tests/agent-trace.test.mjs frontend/tests/dashboard-model.test.mjs frontend/tests/forecast-chart.test.mjs frontend/tests/forecast-date-time.test.mjs frontend/tests/forecast-workflow.test.mjs frontend/tests/interface-contract.test.mjs frontend/tests/percent-axis.test.mjs frontend/tests/preferences.test.mjs frontend/tsconfig.json pyproject.toml requirements.lock.txt scripts/hackflow scripts/run-worker skills/architecture.md skills/backend.md skills/frontend.md tests/__init__.py tests/fixtures/weather/README.md tests/fixtures/weather/synthetic_48h.json tests/test_acceptance.py tests/test_agent.py tests/test_api.py tests/test_app_entry.py tests/test_architecture.py tests/test_artifacts.py tests/test_bootstrap.py tests/test_cli.py tests/test_code_identity.py tests/test_config.py tests/test_contracts.py tests/test_dashboard.py tests/test_data.py tests/test_e2e.py tests/test_evaluation.py tests/test_features.py tests/test_gfs_wiring.py tests/test_llm.py tests/test_models.py tests/test_noaa_gfs.py tests/test_weather.py wind_forecast/__init__.py wind_forecast/agent.py wind_forecast/application/__init__.py wind_forecast/application/code_identity.py wind_forecast/application/forecasting/__init__.py wind_forecast/application/forecasting/fallback_policy.py wind_forecast/application/forecasting/quality.py wind_forecast/application/forecasting/weather_policy.py wind_forecast/application/ports.py wind_forecast/artifacts.py wind_forecast/bootstrap.py wind_forecast/cli.py wind_forecast/config.py wind_forecast/contracts.py wind_forecast/data.py wind_forecast/evaluation.py wind_forecast/features.py wind_forecast/infrastructure/__init__.py wind_forecast/infrastructure/weather/__init__.py wind_forecast/infrastructure/weather/demo.py wind_forecast/infrastructure/weather/noaa_gfs.py wind_forecast/infrastructure/weather/noaa_gfs_archive.py wind_forecast/infrastructure/weather/noaa_gfs_codec.py wind_forecast/infrastructure/weather/noaa_gfs_common.py wind_forecast/llm.py wind_forecast/models.py wind_forecast/presentation/__init__.py wind_forecast/presentation/api/__init__.py wind_forecast/presentation/api/__main__.py wind_forecast/presentation/api/app.py wind_forecast/presentation/api/jobs.py wind_forecast/presentation/api/schemas.py wind_forecast/presentation/api/serialization.py wind_forecast/service.py wind_forecast/ui/__init__.py wind_forecast/ui/charts.py wind_forecast/ui/components.py wind_forecast/ui/dashboard.py wind_forecast/ui/theme.css wind_forecast/weather.py
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.