О проекте
Команда: Low Prior-IT
Кейс HackAlem.ai: Энергетика — Самрук-Казына
Стадия: Доведённый продукт
Задача кейса: AI-агент, прогнозирующий выработку ветровой электростанции по погодным данным
Суть
Прогноз почасовой нормализованной мощности двух ветротурбин на 24–48 часов. Детерминированный ForecastAgent работает на CatBoost по погоде и SCADA и пересчитывает прогноз при изменении входов. Есть React-дашборд, экран Evidence и replay февраля 2026 (2 784 строки).
Как устроено
Агент отбирает снимки погоды ECMWF IFS 00 UTC с явной предпосылкой available_at = run_init + 10h и проверяет доступность и покрытие. Признаки: ветер и направление на 100 м, температура, календарь, лид и SCADA на момент выпуска; для каждой турбины обучается свой CatBoost. Параметры выбираются на хронологических фолдах ноября–декабря, модель сравнивается с константой, климатологией, persistence и SCADA-only на январе, затем дообучается до 31.01. LLM-аналитик (OpenAI или NVIDIA) получает только read-only инструменты и цифры не меняет. Всё воспроизводится командой npm run reproduce.
Ключевые решения
- CatBoost weather-SCADA
- Ridge baseline
- хронологическая кросс-валидация
- persistence/климатология baseline
- ECMWF IFS / GFS / ICON previous runs
- read-only LLM tools
- fingerprint-based refresh
Метрики
Январь, 2784 пары, норм. мощность: CatBoost weather-SCADA MAE 0.162 / RMSE 0.233 vs климатология 0.267/0.342, persistence 0.338/0.459, CatBoost SCADA 0.312/0.389
Особенности
Все модели сравниваются на одинаковых парах выпуск/цель. Воспроизведение идёт одной командой, CSV в чистом клоне совпадает побайтно. Ограничения описаны честно: hindcast не равен архиву оперативных прогнозов, февральских метрик нет, январь не считается независимым holdout.
Стек
Python · FastAPI · CatBoost · uv · SQLite · React · TypeScript · Vite · Vitest · GitHub Actions
Модели
OpenAI · NVIDIA
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-9c72e88a-low-prior-it.
README
README.mdLow Prior Energy
Low Prior Energy прогнозирует почасовую нормализованную мощность двух ветротурбин на 24–48 часов вперёд. React-дашборд операционного управления подключается к сервису FastAPI и детерминированному агенту прогнозирования: он отбирает подходящие снимки погоды, строит погодные/SCADA-признаки, запускает CatBoost-модели по каждой турбине, проверяет результаты, объясняет их и пересчитывает прогноз при изменении входных данных. Проводник (explorer) поддерживает разные типы энергоактивов; солнечная и гидроэнергетика — задачи на будущее.
Для жюри
Цикл агента: получение погоды → проверка доступности и подготовка → модель → почасовой прогноз → проверка и необязательный LLM-анализ → пересчёт при обновлении входов. OpenAI/NVIDIA-аналитик получает только read-only инструменты и никогда не меняет численные прогнозы. Без ключа работает детерминированный анализ.
Погода действительно входит в модель: ветер и направление на 100 м, температура на 2 м, календарь, лид и SCADA, доступная на момент выпуска. Параметры выбираются только по ноябрю–декабрю 2025; январь используется для сравнения после фиксации выбора. Все пять моделей оцениваются на одинаковых парах выпуск/цель, с разрезами по турбинам и лидам 1–24 / 25–48. Январь уже использовался в предыдущих экспериментах, поэтому это не новый независимый holdout.
| Модель | Пар | MAE | RMSE |
|---|---|---|---|
| Константа (медиана) | 2784 | 0.26817 | 0.34506 |
| Климатология (турбина × час) | 2784 | 0.26656 | 0.34237 |
| Persistence | 2784 | 0.33767 | 0.45934 |
| CatBoost SCADA | 2784 | 0.31224 | 0.38933 |
| CatBoost weather-SCADA | 2784 | 0.16181 | 0.23328 |
Метрики — ошибка нормализованной мощности на шкале [0,1], не проценты «точности» и не МВт. Подробные разрезы и результаты фолдов: отчёт обучения, машиночитаемые результаты, экран Evidence.
Главный артефакт: февральский CSV и манифест: 29 выпусков с 31 января по 28 февраля, две турбины, по 48 часов — 2 784 строки. Сохранены полные горизонты, включая пограничные цели января и марта. Февральских фактов нет, поэтому февральские MAE/RMSE не заявляются.
Существенное ограничение: это реконструкция с реальными погодными модельными данными, не доказанный архив оперативных прогнозов. Open-Meteo описывает ранний ECMWF IFS как Cycle 49R1 hindcast. available_at = run_init + 10h — явно принятая предпосылка по опубликованному расписанию, а не подтверждение публикации каждого запуска. Строгая часть кейса о фактической доступности в прошлом остаётся открытой. Источники, пропуски и правила импорта.
После установки зависимостей три основные команды:
npm run reproduce
npm run dev
npm run check
Первая воспроизводит подготовку, импорт, выбор модели, январскую оценку, дообучение, февральский replay и регистрацию модели для дашборда. Вторая запускает сайт/API и остаётся работать; третья выполняется в другом терминале. Время полного воспроизведения на этой машине: 485,3 с в чистом клоне (около 8 минут); повтор с готовым кешем — 4,5 с. Seed = 42, CPU, два потока CatBoost; время зависит от CPU. CSV чистого клона совпал побайтно, повторный запуск не изменил опубликованные файлы. Веса обучаются из исходных файлов, не требуют ручного копирования с компьютера автора.
Установка и дашборд
Требования: Node.js 22.12+ и uv. Из корня репозитория:
uv sync --locked
npm ci
Затем выполните три команды выше. Дашборд: http://127.0.0.1:5173; API: http://127.0.0.1:8000; интерактивные маршруты: http://127.0.0.1:8000/docs. Vite проксирует /api и /health на бэкенд. При необходимости запускайте npm run dev:api / npm run dev:web отдельно.
В Explore выберите Казахстан, ветровую площадку и её турбины, затем нажмите Open forecast. После воспроизведения обновите рабочую область, выберите зарегистрированную модель catboost-weather-scada-v1 и Verified archive, укажите выпуск 2026-01-31 12:00 UTC и выберите 24 или 48 часов. Запустите прогноз, чтобы посмотреть график, погоду, происхождение данных (provenance), события агента и почасовой экспорт. Run February replay использует ежедневные выпуски в 12:00 UTC. Модель остаётся помеченной как предварительная (provisional), поскольку предпосылки о задержке публикации и SCADA независимо не подтверждены. Перечисление архива само по себе не доказывает историческую достоверность: смотрите доказательства по каждому снимку.
Evidence описывает зафиксированный январский бенчмарк независимо от модели, выбранной в данный момент для прогноза. Profile → Appearance предлагает General, Light и Black. У глобуса есть доступный с клавиатуры резервный справочник стран/станций.
HTTP-проверка при запущенном сайте:
uv run python scripts/smoke_demo.py
uv run python scripts/smoke_demo.py --archive
Вторая команда задействует воспроизведённую погодную модель, 29 ежедневных архивных прогнозов, обновление при неизменных входах и экспорт CSV. Обе команды создают локальные записи; ни одна не оценивает точность за февраль.
Протокол воспроизведения
- Входные данные под контролем Git:
data/raw/turbine_1.csv,turbine_2.csvиdata/weather/ecmwf_ifs_single_runs.csv.gz. - Канонический SCADA содержит только полные почасовые интервалы. Исходные часы зафиксированы как UTC+06:00, метки времени обозначают начало интервала, доступность предполагает задержку отчётности 10 минут. Пропущенные показания не заполняются нулями; невалидные строки помещаются в карантин и подсчитываются. Эти правила исходных часов отличаются от текущего гражданского времени.
- Во всём обучении и replay используются только запуски ECMWF 00 UTC. Выпуск в 12:00 UTC = 17:00 Asia/Almaty в феврале 2026 (18:00 по зафиксированным часам SCADA) использует лиды запуска 13–60. Предполагаемая 10-часовая задержка публикации оставляет два часа до выпуска.
- Отсчёт обучающих периодов начинается 15 марта 2024, 12:00 UTC. Пропущенные погодные периоды пропускаются и подсчитываются при обучении. Инференс и оценка по-прежнему требуют полного подходящего снимка.
- Три заранее заданные погодные конфигурации соревнуются на хронологических ноябрьско-декабрьских фолдах. Январское сравнение использует отсечку 1 января 2026, 00:00 UTC, выпуски с 1 по 29 января в полдень и одинаковые цели для всех моделей. Константа/климатология — медианы за период обучения; persistence читает только наблюдения, доступные на момент каждого выпуска.
- Финальная погодная модель использует зафиксированные победившие параметры и отсечку 31 января 2026, 12:00 UTC. Январские метрики не оценивают эти дообученные веса. SCADA после последнего наблюдения не синтезируется в феврале.
- Воспроизведение вызывает код
WindService.execute_backtest/ForecastAgentAPI сweather_source="archive"и без февральских фактов. Загрузки API/воркера остаются неподтверждёнными до отдельного документированного импорта; они никогда не продвигаются автоматически. - Локальные кеши и файлы моделей игнорируются. Завершённые кеши проходят проверку контрольных сумм; изменённые входные данные/код создают новую ревизию эксперимента. CSV и манифест лежат в отслеживаемой папке
results/february-2026/.npm run reproduce -- --no-registerгенерирует результаты без публикации в локальный реестр API.
Офлайн-импорт явно принимает документированную предпосылку hindcast/расписания. Чтобы удовлетворить строгим требованиям исторического replay, предоставьте современные прогнозы с оригинальными доказательствами публикации и повторите тот же процесс. Изменения в проверках меток времени не требуются.
Архитектура
flowchart LR
UI[React-дашборд] --> API[FastAPI]
API --> Agent[ForecastAgent]
Agent --> Weather[Неизменяемые снимки погоды]
Weather --> Guards[Проверки доступности и покрытия]
Guards --> ML[Погода + SCADA / CatBoost]
ML --> Audit[Численный аудит + опциональный read-only LLM]
Audit --> DB[(SQLite / CSV)]
DB --> UI
Weather --> Refresh[Изменение отпечатка]
Refresh --> Agent
| Область | Расположение |
|---|---|
| Дашборд, проводник, Evidence | frontend/ |
| API, хранилище, обучение, оценка | backend/wind_backend/ |
| Погода, проверки времени, оркестрация, облачные объяснения | agent/wind_agent/ |
| Общие типизированные контракты | contracts/wind_contracts/ |
| Сгенерированные OpenAPI / TypeScript | contracts/openapi.json, frontend/src/generated/api.ts |
| Воспроизведение одной командой | scripts/reproduce.py |
| Итоговые артефакты для проверки | results/february-2026/, docs/model-selection-results.json |
Исходное распределение обязанностей между тремя участниками команды сохранено в docs/team-plan.md.
Маршруты API
Все бизнес-маршруты используют /api/v1. Полные типы запросов/ответов и примеры — в /docs и закоммиченном файле OpenAPI.
| Метод | Маршрут после /api/v1 | Назначение / результат |
|---|---|---|
| GET | /assets | Реестр энергоактивов с метаданными страны/площадки и явной возможностью прогноза |
| GET | /turbines | Метаданные настроенных турбин |
| GET | /datasets | Метаданные импортированных наборов данных |
| POST | /datasets | Импорт валидированных наблюдений (201) |
| GET | /datasets/{id}/observations?start=...&end=... | Наблюдения во включительном, учитывающем часовой пояс окне для сравнения на графике |
| GET | /models | Метаданные доступных демо- и обученных моделей |
| GET | /evidence | Зафиксированный хронологический бенчмарк, сравнения, происхождение данных и ограничения |
| GET | /evidence/export | Скачать тот же типизированный отчёт evidence в JSON |
| POST | /models/train | Обучить базовую модель, используя только данные, доступные на момент отсечки (201) |
| GET | /weather/snapshots?turbine_id=... | Сохранённая погода и происхождение данных |
| POST | /weather/fetch | Загрузить неподтверждённого кандидата Single Runs (201) |
| POST | /weather/snapshots | Импорт неизменяемого снимка/ревизии (201) |
| GET | /forecasts?limit=20 | Последние запуски, включая статус и результаты |
| POST | /forecasts | Поставить прогноз в очередь (202) |
| GET | /forecasts/{id} | Опрос статуса запуска, результата, ошибок и событий |
| GET | /forecasts/{id}/events | Журнал решений агента |
| POST | /forecasts/{id}/refresh | Переиспользовать неизменённые входы или поставить новый запуск |
| GET | /forecasts/{id}/export | Скачать почасовой CSV с происхождением данных |
| GET | /backtests | История replay |
| POST | /backtests | Поставить в очередь ежедневный скользящий replay (202) |
| GET | /backtests/{id} | Прогресс, дочерние запуски, метрики, отсутствующие факты |
| GET | /backtests/{id}/export | CSV, ограниченный целевыми часами оценки |
GET /health находится вне версионированного префикса. Жизненный цикл задачи: queued → running → succeeded | failed. Опрашивайте каждые 1–2 секунды; ответ 202 означает «в очереди», а не «завершено». Ошибки HTTP используют { "code": "...", "message": "..." }; сбои задач — run.error. Основные статусы ошибок: 404 неизвестный ресурс, 409 недоступный архив/неизменяемая запись/экспорт не готов, 422 неверные входные данные, 503 временный сбой транспорта погодных данных.
Целостность данных и ограничения
Каждое признаковое наблюдение подчиняется и valid_time <= issue_time, и available_at <= issue_time. Каждая обучающая метка подчиняется отсечке обучения. Модель не может прогнозировать выпуск раньше своей отсечки. Архивная погода должна иметь run_init <= issue_time, available_at <= issue_time, обязательное доказательство и каждую запрошенную почасовую цель. Полные контрольные суммы модели/истории, неизменяемые снимки, отпечатки и обновление по-прежнему обеспечиваются принудительно. Будущие валидные времена погоды ожидаемы; будущая публикация отклоняется.
Мощность нормализована в диапазоне [0,1]. Номинальные мощности и высоты ступиц неизвестны: агрегация по станциям в МВт, коррекция по высоте ступицы или калиброванная неопределённость не заявляются. Ветер на 100 м — ковариата модели, а не измерение турбины. Пропуски августовской погоды пропускаются только при обучении и фиксируются. Hindcast-данные и доступность, выведенная из расписания, не позволяют безусловно утверждать соответствие исторической доступности требованиям соревнования. Февральских фактических данных во входных данных нет. Прогнозы солнечной/гидроэнергетики и автоматизированное планирование новых моментов выпуска остаются задачами на будущее.
Опциональные облачные объяснения: OpenAI / NVIDIA. Учётные данные хранятся в локальном .env; никогда не коммитьте их. Настройте WINDFARM_DB, WINDFARM_MODELS и WINDFARM_TURBINES согласованно для воспроизведения и API. Для детерминированного офлайн-эксперимента ключ не нужен.
Проверка
npm run contracts
npm run check
Коммитьте оба сгенерированных файла контрактов вместе. CI проверяет расхождение сгенерированных контрактов. Тесты покрывают поздние/будущие наблюдения, отсечки моделей, неподтверждённую и неполную погоду, выбор снимков, неизменяемые артефакты, общие пары сравнения, フронтенд-сценарии и закоммиченные февральские CSV/манифест. scripts/run_tests.py использует локальную для репозитория временную директорию, чтобы избежать проблем с ACL системного temp в Windows. Компонентные тесты не заменяют визуальную проверку в браузере/WebGL.
Работа из интегрированной ветки main
Создайте фиче-ветку от текущей main, делайте коммиты сфокусированными и открывайте PR с доказательствами валидации. Проверьте настроенную идентичность автора перед коммитом; см. CONTRIBUTING.md. Изменения контрактов включают регенерированные типы и совместимое поведение фронтенда.
Чек-лист приёмки
- Значения погоды используются в модели прогнозирования.
- Выбор модели использует только хронологические ноябрьско-декабрьские фолды.
- Январское сравнение включает константу, климатологию, persistence и оба набора признаков CatBoost на одинаковых парах.
- Февральский CSV прогноза и манифест происхождения данных закоммичены; синтетическая погода не используется.
- Пропущенная обучающая погода подсчитывается; инференс остаётся строгим.
- Воспроизведение одной командой восстанавливает веса модели и реестр дашборда из чистого клона.
- Агент проверяет, прогнозирует, анализирует и пересчитывает при изменении подходящих входов.
- Историческая публикация каждого точного погодного прогноза независимо доказана (ограничение hindcast).
- Задержка наблюдений, номинальные мощности и высоты ступиц независимо подтверждены.
- Февральская точность измерена по предоставленным фактическим данным (факты недоступны).
См. обзор для жюри и исходный кейс.
Авторы коммитов
История коммитов
- 2026-09-23 17:56lastGenpactal
- 2026-09-23 17:54lastGenpactal
- 2026-09-23 17:53lastGenpactal
- 2026-09-23 17:34Keep replay status responsive and accept documented weather exportsGenpactal
- 2026-09-23 17:27Verify reproduction cache and immutable input integrityGenpactal
- 2026-09-23 17:25Reproduce and publish February archive forecasts with noon issue timesGenpactal
- 2026-09-23 17:25Expose forecast wind summaries to the read-only analystGenpactal
- 2026-09-23 17:25Show matched weather and baseline evidence with explicit provenanceGenpactal
Все коммиты (49)
- 2026-09-23 17:21Train weather-aware models and compare five baselines on matched forecastsGenpactal
- 2026-09-23 17:13Import ECMWF 00 UTC snapshots with explicit availability assumptionsGenpactal
- 2026-09-23 16:59Merge branch 'main' of https://github.com/BAITC-Hacks/hack-9c72e88a-low-prior-itGenpactal
- 2026-09-23 16:59faviconGenpactal
- 2026-09-23 16:52Merge pull request #1 from BAITC-Hacks/ml-aiagentAbylaikhan
- 2026-09-23 16:51Merge origin/main and preserve cloud analysis with model evidenceRiceEnjoyer21
- 2026-09-23 16:48Merge model evidence updates with dashboard flow fixesGenpactal
- 2026-09-23 16:44Fix dashboard navigation, refresh, and replay user flowsGenpactal
- 2026-09-23 16:43fix(agent): reject incomplete tool responses and prepare merge handoffRiceEnjoyer21
- 2026-09-23 16:41Add model evidence workspace and auditable forecast operationsDinGoMaDDoG
- 2026-09-23 16:39Merge remote-tracking branch 'origin/main' into ml-aiagentRiceEnjoyer21
- 2026-09-23 16:36llm addedRiceEnjoyer21
- 2026-09-23 16:08Fix contributor email mapping and document author setupDinGoMaDDoG
- 2026-09-23 16:05chore: record corrected contributor emailDinGoMaDDoG
- 2026-09-23 16:03fix: git email for contribution attributionDinGoMaDDoG
- 2026-09-23 15:59fix: git email for contribution attributionDinGoMaDDoG
- 2026-09-23 15:58Merge energy explorer and profile themes into mainGenpactal
- 2026-09-23 15:58Add energy globe explorer and profile appearance themesGenpactal
- 2026-09-23 15:52Merge ml-aiagent into main and reconcile data provenance docsRiceEnjoyer21
- 2026-09-23 15:48Merge danik helpers into integrated mainDinGoMaDDoG
- 2026-09-23 15:48Document selected CatBoost gains and January 31 refit for mergeRiceEnjoyer21
- 2026-09-23 15:46catboost trainedRiceEnjoyer21
- 2026-09-23 15:37Merge current main and reconcile model training contractsRiceEnjoyer21
- 2026-09-23 15:33Add chronological CatBoost selection and extended SCADA featuresRiceEnjoyer21
- 2026-09-23 15:24back branchDinGoMaDDoG
- 2026-09-23 15:20Merge data, weather, and backend work into unified mainGenpactal
- 2026-09-23 15:18Prepare CatBoost training for merge with confirmed UTC+06 interval startsRiceEnjoyer21
- 2026-09-23 15:15Merge remote-tracking branch 'origin/main' into ml-aiagentRiceEnjoyer21
- 2026-09-23 15:08Merge ML forecasting and agent work into mainGenpactal
- 2026-09-23 15:06Polish frontend theme states and documentationGenpactal
- 2026-09-23 15:00new filesGenpactal
- 2026-09-23 14:59website style enchanceGenpactal
- 2026-09-23 14:59forecasting validatedRiceEnjoyer21
- 2026-09-23 14:57Add wind backend, agent, frontend, and contracts scaffoldingDinGoMaDDoG
- 2026-09-23 14:25Clean up backend filesDinGoMaDDoG
- 2026-09-23 14:15Merge branch 'main' into ml-aiagentRiceEnjoyer21
- 2026-09-23 14:13deletedRiceEnjoyer21
- 2026-09-23 14:10Complete wind forecasting skeleton and team integration guideGenpactal
- 2026-09-23 14:01first pushDinGoMaDDoG
- 2026-09-23 13:59skeleton commitGenpactal
- 2026-09-23 13:57carcasRiceEnjoyer21
Структура репозитория (163 файлов)
.editorconfig .env.example .gitattributes .github/pull_request_template.md .github/workflows/ci.yml .gitignore .mailmap .python-version CONTRIBUTING.md DATA.md README.md agent/wind_agent/__init__.py agent/wind_agent/analysis.py agent/wind_agent/interfaces.py agent/wind_agent/nvidia.py agent/wind_agent/openai.py agent/wind_agent/orchestrator.py agent/wind_agent/scada.py agent/wind_agent/source_data.py agent/wind_agent/temporal.py agent/wind_agent/weather.py agent/wind_agent/worker.py artifacts/README.md backend/wind_backend/__init__.py backend/wind_backend/catboost_model.py backend/wind_backend/config.py backend/wind_backend/evaluation.py backend/wind_backend/evidence.py backend/wind_backend/features.py backend/wind_backend/main.py backend/wind_backend/ml.py backend/wind_backend/model_selection.py backend/wind_backend/ridge_model.py backend/wind_backend/routes.py backend/wind_backend/service.py backend/wind_backend/storage.py config/turbines.example.json contracts/openapi.json contracts/wind_contracts/__init__.py contracts/wind_contracts/evidence.py contracts/wind_contracts/models.py contracts/wind_contracts/scada.py data/README.md data/raw/turbine_1.csv data/raw/turbine_2.csv data/weather/ecmwf_ifs_single_runs.csv.gz data/weather/gfs_seamless_previous_runs.csv.gz data/weather/icon_seamless_previous_runs.csv.gz docs/agent.md docs/backend.md docs/data-and-replay.md docs/demo.md docs/explorer.md docs/frontend-theme.md docs/frontend.md docs/implementation-spec.md docs/initial-training-results.md docs/judges-walkthrough.md docs/legacy-data-notes.md docs/merge-request.md docs/ml-training.md docs/model-selection-results.json docs/nvidia-agent.md docs/openai-agent.md docs/task.pdf docs/tuned-training-results.md examples/observations.demo.csv frontend/index.html frontend/package.json frontend/public/favicon.ico frontend/public/favicon.png frontend/public/geo/README.md frontend/public/geo/countries.geojson frontend/src/App.tsx frontend/src/ForecastChart.tsx frontend/src/api.ts frontend/src/components/AgentPanel.tsx frontend/src/components/DataWorkspace.tsx frontend/src/components/ForecastInsights.tsx frontend/src/components/ForecastTable.tsx frontend/src/components/Icon.tsx frontend/src/components/ProfileMenu.tsx frontend/src/components/ReplayPanel.tsx frontend/src/components/StationMap.tsx frontend/src/components/WeatherPanel.tsx frontend/src/evidence/EvidenceView.tsx frontend/src/evidence/evidence.css frontend/src/evidence/metrics.test.mjs frontend/src/evidence/metrics.ts frontend/src/explore/ExploreView.tsx frontend/src/explore/GlobeCanvas.tsx frontend/src/explore/catalog.ts frontend/src/explore/explore.css frontend/src/format.ts frontend/src/generated/api.ts frontend/src/insights.css frontend/src/insights.ts frontend/src/main.tsx frontend/src/navigation.ts frontend/src/styles.css frontend/src/theme.ts frontend/src/themes.css frontend/src/useDashboard.ts frontend/tests/explore.test.mjs frontend/tests/flow/dashboard.test.tsx frontend/tests/flow/fixtures.ts frontend/tests/flow/navigation.test.tsx frontend/tests/flow/profile.test.tsx frontend/tests/flow/setup.ts frontend/tests/flow/weather-selection.test.tsx frontend/tests/insights.test.mjs frontend/tsconfig.json frontend/vite.config.ts frontend/vitest.config.ts package-lock.json package.json pyproject.toml requirements.txt scripts/check_nvidia.py scripts/check_openai.py scripts/convert_scada.py scripts/data_report.py scripts/export_contracts.py scripts/export_openapi.py scripts/fetch_weather.py scripts/import_csv.py scripts/import_weather_archive.py scripts/prepare_dataset.py scripts/prepare_globe_map.py scripts/python.mjs scripts/refit_selected.py scripts/run_tests.py scripts/smoke_demo.py scripts/train_evaluate.py scripts/tune_model.py scripts/validate_models.py tests/__init__.py tests/conftest.py tests/test_api.py tests/test_assets.py tests/test_branch_integration.py tests/test_catboost.py tests/test_data.py tests/test_data_scripts.py tests/test_evidence.py tests/test_forecast_analysis.py tests/test_leakage.py tests/test_legacy_weather.py tests/test_ml.py tests/test_model_selection.py tests/test_nvidia.py tests/test_openai.py tests/test_scada.py tests/test_source_data.py tests/test_tuning_cli.py tests/test_weather_adapter.py tests/test_worker.py uv.lock windagent/__init__.py windagent/openmeteo.py windagent/scada.py windagent/settings.py windagent/weather.py
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.