О проекте
Команда: Anhalt Students
Кейс HackAlem.ai: Энергетика — Самрук-Казына
Стадия: Рабочий MVP
Задача кейса: AI-агент, прогнозирующий выработку ветровой электростанции по погодным данным
Суть
Прототип прогноза почасовой выработки двух турбин ВЭС на 24–48 часов: LightGBM с физическими признаками, предупреждения для диспетчера на RU/KZ, журнал агента, загрузка SCADA с переобучением и плеер февраля.
Как устроено
Погода берётся из Open-Meteo Historical Forecast API (кэш, демо-режим) и валидируется. Строятся физические признаки: плотность воздуха ρ=P/(287.058·T), куб скорости, приближённая кривая мощности, перенос ветра с 10 на 100 м. Их получает LightGBM, при скорости выше 25 м/с прогноз обнуляется. Агент — машина решений без LLM: при плохой погоде повторяет запрос, при ошибке модели переходит на физическую кривую, хранит SHA-256 входов и ревизии. Правила рисков дают двуязычные пояснения. FastAPI + веб-UI (Chart.js), экспорт в CSV.
Ключевые решения
- LightGBM
- air density feature
- wind shear extrapolation 10→100m
- power curve
- storm cut-out 25 m/s
- walk-forward February export
- transactional SCADA retraining
Особенности
Загрузка SCADA транзакционная: перед заменой модели идёт пробное обучение, при сбое откат, данным присваивается честный статус происхождения (USER_SUPPLIED_UNVERIFIED или SYNTHETIC_DEMO). Коммиты привязаны к часам хакатона. README построен по 11 пунктам инструкции организатора.
Стек
Python · FastAPI · LightGBM · scikit-learn · pandas · Tailwind CSS · Chart.js · uv
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-98e048a9-anhalt-students.
README
README.mdSamruk WindAgent AI
HackAlem AI 2026 · кейс «Agentic AI для прогнозирования выработки ВЭС» · команда Anhalt Students.
Прототип прогноза на 24–48 часов с физическими признаками, LightGBM, предупреждениями RU/KZ и журналом работы агента. Демонстрация запускается без API-ключей. Точность на реальной выработке февраля 2026 не подтверждена.
Ниже — 11 пунктов инструкции организатора. Проверка требований и оставшиеся риски: аудит подачи.
1. Название проекта
Samruk WindAgent AI — прогнозирование почасовой выработки ВЭС и поддержка диспетчерского планирования.
- Турбина №1:
43.645150, 78.535604; мощность в конфигурации — 2,5 МВт. - Турбина №2:
43.643198, 78.538828; мощность в конфигурации — 2,5 МВт. farm— сумма отдельных прогнозов обеих турбин, 5,0 МВт. Паспортные параметры требуют подтверждения оператором.
Название команды и репозиторий взяты из материалов проекта и git remote. Состав команды и факт сдачи на платформе локальным кодом не подтверждаются.
2. Краткое описание — какую проблему решает проект и для кого.
Диспетчеру ВЭС нужен почасовой план генерации с учётом изменения погоды. Проект собирает входы по координатам, рассчитывает выработку, отмечает сильный ветер, холод и скачки мощности, затем пересчитывает результат при обновлении данных.
Практическая ценность — воспроизводимый путь от погоды до плана и объяснения ограничений. Снижение небалансов потребует проверки по фактической выработке. Подтверждённых расчётов экономии или действующего тарифа KEGOC в проекте нет.
3. Что реализовано — основные функции и возможности решения.
- Прогноз по дате, горизонту и турбине; основной сценарий — 24 или 48 часов.
- Open-Meteo Historical Forecast API, кэш и детерминированный демонстрационный режим с раскрытием источника данных.
- Плотность воздуха
ρ = P / (287,058 × T), куб скорости ветра, приближённая кривая мощности, перенос скорости с 10 на 100 м при отсутствии высотного ветра. - LightGBM с физическими и временными признаками, нормированной мощностью
[0, 1]и нулевым прогнозом при штормовом пороге 25 м/с. - Сравнение ML-прогноза с физической кривой. Persistence и Skill Score не вычисляются без подтверждённых наблюдений; сравнение двух моделей не является оценкой точности.
- Цикл агента с проверкой входов и результата, условным повторным получением данных, реакцией на изменение входов и журналом решений.
- Правила диспетчерского анализа и пояснения RU/KZ; веб-интерфейс, JSON API и CSV.
- Динамическая загрузка исторических SCADA-данных (
POST /api/upload/scadaи кнопка в веб-интерфейсе): транзакционная валидация схемы колонок и диапазонов[0, 1], тестовое обучение на кандидате перед изменением состояния/диска, потокобезопасное переобучение моделей турбин с честным присвоением статусаUSER_SUPPLIED_UNVERIFIED(илиSYNTHETIC_DEMOпри совпадении хэша). - Интерактивный плеер тестового периода (1–28 февраля 2026): пошаговое воспроизведение 28 последовательных суточных прогнозов с анимацией, ползунком дней (1..28), регулировкой скорости (1x, 2x, 4x) и оперативным отображением профиля мощности и предупреждений диспетчера.
- Последовательная выгрузка февраля для обеих турбин.
Включённый демонстрационный набор обучения не заменяет историю работы ВЭС, предоставленную организатором.
4. Как работает решение — кратко опиши основной пользовательский сценарий от входных данных до результата.
- Запустите сервер по разделу 7 и откройте
http://localhost:8000. - Выберите
2026-02-14,48часов и первую турбину. - Агент получает погоду, проверяет значения и часовую сетку, формирует физические признаки и вызывает модель.
- При некорректной погоде агент повторяет получение один раз; при ошибке модели использует физическую кривую. Ограничения мощности применяются до повторного аудита. SHA-256 входов, номер ревизии и решения сохраняются в журнале.
- Изучите выработку, КУИМ, предупреждения, источник входов и журнал решений. Скачайте CSV.
- Запрос с
refresh_weather=trueповторно получает входы и позволяет проверить решение о пересчёте.
Время — местное Asia/Almaty (UTC+05:00 в тестовом периоде). Один интервал равен часу: predicted_mwh = predicted_power × rated_capacity_mw × 1 час. Приложение не управляет турбинами и не отправляет заявки диспетчеру.
5. Технологии — языки, фреймворки, библиотеки, AI-модели, API и внешние сервисы.
- Python 3.11+, FastAPI, Uvicorn, Pydantic, python-multipart — сервер, загрузка файлов и проверка запросов.
- LightGBM, scikit-learn, NumPy, pandas, joblib — обучение, прогноз и расчёты.
- Requests, python-dotenv — погодный клиент и необязательные настройки.
- HTML, JavaScript, Tailwind CSS, Chart.js, Lucide — интерфейс. Стили и графическая библиотека загружаются с CDN; при их недоступности остаются базовое оформление и почасовая таблица.
- Pytest, HTTPX / FastAPI TestClient — автоматическая проверка.
- Open-Meteo Historical Forecast API — погодный источник.
uv, pyproject.toml, uv.lock — воспроизводимое окружение.
Агент — программная машина решений с инструментами. LLM-вызовов, LangGraph, CrewAI или нескольких независимых AI-агентов в приложении нет. AI-инструменты разработки не являются частью исполняемой модели. STARTER_RESOURCES.md — каталог справочных ссылок, а не список внедрённых компонентов.
6. Архитектура проекта — основные компоненты и как они взаимодействуют.
flowchart TD
UI["Интерфейс / API"] --> Agent["Оркестратор: состояние и журнал"]
Agent --> Weather["Погода: источник, кэш, demo"]
Weather --> Validate["Проверка данных"]
Validate --> Physics["Физические признаки"]
History["История до февраля + происхождение"] --> Model["LightGBM"]
Physics --> Model
Model --> Audit["Проверка прогноза и рисков"]
Audit --> Decision{"Нужен повтор?"}
Decision -->|"Да, в пределах лимита"| Weather
Decision -->|"Нет"| Result["Прогноз / CSV / журнал"]
- weather_tool.py — получение погоды, единицы и происхождение.
- data_loader.py — история обучения и проверка данных.
- physics.py — плотность, высотный ветер и кривая мощности.
- model.py — обучение, временная валидация и прогноз.
- pipeline.py — агентный цикл, проверка изменений, журнал и месячный расчёт.
- reasoner.py — правила рисков и двуязычные пояснения.
- main.py — API и интерфейс.
- run_february_test.py — последовательные выпуски и экспорт.
Физическая кривая — инженерное приближение; соответствие IEC 61400-12 не сертифицировано. LightGBM использует её как признак; отдельное обучение модели остатков не заявляется.
7. Установка и запуск — пошаговая инструкция с необходимыми командами.
Нужны Python 3.11+, uv, браузер и доступ на запись в рабочую папку. GPU и платные аккаунты не требуются. При первой установке нужен интернет для зависимостей; демонстрационные вычисления после установки не требуют погодного API.
Если репозиторий ещё не открыт:
git clone https://github.com/BAITC-Hacks/hack-98e048a9-anhalt-students.git
cd hack-98e048a9-anhalt-students
Из корня репозитория выполните одну команду:
uv run --locked wind-agent --port 8000
uv создаёт окружение и устанавливает зависимости по lock-файлу. --port 8000 явно задаёт порт, даже если он изменён в существующем .env. Интерфейс: http://localhost:8000; API: http://localhost:8000/docs; состояние: http://localhost:8000/api/health. Остановка — Ctrl+C.
Файл .env необязателен. Настройки перечислены в .env.example:
HOST=127.0.0.1— адрес сервера.PORT=8000— порт.DEMO_MOCK_MODE=true— синтетическая погода без запросов;falseвключает внешний источник / кэш с демонстрационным резервом при сбое.
Для изменения настроек скопируйте .env.example в .env. Если .env уже существует, его значения могут менять порт и режим; переменные оболочки имеют приоритет над .env. Ключи OpenAI и Gemini для основного сценария не нужны.
Альтернатива при установленном Python:
python -m pip install -r requirements.txt
python backend/main.py --port 8000
8. Как проверить решение — пример сценария, который может повторить жюри.
- После запуска сервера рассчитайте
2026-02-14,48часов, первую турбину. Ожидаются 48 почасовых значений и нормированная мощность от 0 до 1. - Откройте
http://localhost:8000/api/forecast?target_date=2026-02-14&horizon_hours=48&turbine_id=turbine_1. Проверьте источник, ограничения и журнал цикла. При отсутствии фактической выработки истинный Skill Score не рассчитывается. - Повторите запрос с
&refresh_weather=true. Проверьтеagent_trace,metadata.input_changedиmetadata.revision. В детерминированном demo данные могут совпасть — ревизия тогда не увеличивается. Расчёт выполняется при каждом запросе; изменение входов фиксируется отдельно. - Скачайте
http://localhost:8000/api/export/csv?target_date=2026-02-14&horizon_hours=48&turbine_id=turbine_1и сравните временные метки и прогноз с JSON. - Неверная дата или неизвестная турбина должны давать ошибку 422.
- Загрузка пользовательского SCADA-файла через кнопку «Загрузить SCADA» в веб-интерфейсе или через API:
Сервер проверяет столбцы и диапазоны [0, 1], проводит предварительное тестовое обучение (при сбое откатывает состояние и возвращает HTTP 422), сохраняет файл вcurl -X POST -F "file=@data/historical_wind.csv" http://localhost:8000/api/upload/scadadata/shelek_historical.csv, переобучает LightGBM модели турбин и возвращает обновлённые метрики валидации и статусUSER_SUPPLIED_UNVERIFIED(илиSYNTHETIC_DEMOпри совпадении с демо-файлом). - Проверка интерактивного плеера: в интерфейсе нажмите «Воспроизвести февраль» или используйте ползунок (дни 1–28) для последовательного бэктеста суточных прогнозов.
Автоматическая проверка (52 unit-теста):
uv run --locked pytest -q
Выгрузка февраля без перезаписи старого файла:
uv run --locked python scripts/run_february_test.py --mock --output data/submission_forecast_february_2026_v2.csv
Результат по умолчанию: 1 344 записи = 28 дней × 24 часа × 2 турбины, то есть 672 календарных часа на каждую турбину. Проверенный демонстрационный результат: CSV v2 и JSON-сводка. Это синтетический сценарий с раскрытым источником, а не оценка реальной точности. Ежедневный горизонт 48 часов:
uv run --locked python scripts/run_february_test.py --mock --horizon-hours 48 --output data/submission_forecast_february_2026_48h.csv
Получаются 2 688 записей с перекрывающимися окнами. Месячная энергия считается по первым 24 часам каждого выпуска без двойного счёта. Первый scenario_issue_time относится к 31 января и прогнозу на 1 февраля; generated_at — время фактического выполнения программы. forecast_target_date и совместимый старый столбец forecast_origin_date обозначают дату начала прогнозируемого окна, а не время публикации погоды. --mock явно фиксирует режим для воспроизводимости независимо от .env. GET /api/export/submission также рассчитывает актуальную выгрузку для обеих турбин, а не отдаёт старый файл. Конкурсная пригодность требует подтверждённого происхождения данных и доступности погоды на момент выпуска.
Старый submission_forecast_february_2026.csv сохранён как исторический артефакт. Прежние 785,19 МВт·ч, 11,7% и Skill Score 0,928 не являются подтверждёнными результатами кейса: окна перекрывались, а «точность» сравнивалась с физической кривой без фактической выработки.
9. Данные и интеграции — какие источники данных, API или внешние сервисы используются.
Постановка задачи требует историю с марта 2023 по 31 января 2026 и прогнозы на 1–28 февраля 2026. Погода должна быть доступна на момент выпуска прогноза.
- История.
data/historical_wind.csvсоздан генератором проекта; происхождение от организатора не подтверждено. Его 25 632 строки не являются доказательством реальных измерений. Метрики на нём характеризуют демонстрационный набор. - Open-Meteo. Для прошлых дат используется Historical Forecast, при сбое — явно помеченный Reanalysis; для текущих и будущих дат — Forecast API. Ветер приводится к м/с по единицам каждого столбца, температура — °C, давление — hPa. В прогнозном API скорость на 100 м интерполируется по 80 и 120 м. Исторический ряд сам по себе не доказывает доступность конкретного NWP-выпуска на расчётную дату; Reanalysis не отвечает условию кейса об архиве доступных прогнозов.
- Кэш / demo. Новый кэш
data/weather_cache_v3проверяет происхождение и часовую сетку; старый кэш v2 не используется. Синтетический резерв позволяет проверить сценарий без сети и не сохраняется под видом реальной погоды. - Интеграции. Есть чтение погодного API. Подключения к KEGOC, SCADA и управления оборудованием нет.
Для подключения разрешённой истории используйте data/shelek_historical.csv либо task_data/sheet1.csv: они имеют приоритет над demo. Обязательны time, normalized_power в [0,1], temperature_2m и хотя бы один из wind_speed_10m / wind_speed_100m; surface_pressure необязателен, по умолчанию 1013,25 hPa. Время должно быть уникальным; значения — конечными. Загрузчик сортирует данные; модель исключает время с 1 февраля 2026, проверяется на последних 15% истории, затем переобучается на всей разрешённой истории. Пользовательский файл получает статус USER_SUPPLIED_UNVERIFIED, пока происхождение не подтверждено отдельно.
Зависимости раскрыты в разделе 5 и файлах окружения. Реальные данные организатора можно использовать и передавать только в разрешённом им контуре. API-ключи и закрытые данные не должны публиковаться в репозитории.
10. Ограничения — что не реализовано или какие ограничения есть у текущей версии.
- Нет подтверждённых фактов ВЭС. Реальная точность, преимущество над persistence и экономический эффект пока не оценены.
- Не доказана доступность погодных выпусков. Historical Forecast API / старый кэш не заменяют проверку времени выпуска и публикации. Демонстрационный прогон не доказывает полное историческое воспроизведение.
- Упрощённая физика. Высота 100 м, пороги и мощность — параметры прототипа. Нет подтверждённой паспортной кривой, достоверной модели взаимного затенения, ремонтов и ограничений сети.
- Ограниченный агент. Явные правила и ограниченные повторы; нет фонового мониторинга SCADA, постоянного планировщика или LLM-рассуждений. Цикл запускается пользователем, API или скриптом.
- Эвристические риски. Низкая температура не доказывает обледенение; правила не заменяют инструкции производителя и решения диспетчера.
- Прототип. Нет производственных SLA, авторизации и внешней приёмки. Unit-тесты и demo не подтверждают готовность к управлению объектом.
- Ресурсы интерфейса. График и полное оформление используют внешние CDN. Без них доступна упрощённая таблица; для полностью автономного оформления потребуется локальная поставка ресурсов.
Порядок улучшений: реальные данные → архивы выпусков с временем доступности → последовательный бэктест без утечки → сравнение с baseline по фактам → оценка небалансов по реальной методике. Подробности: SUBMISSION_AUDIT.md.
11. Ссылка на deployed-версию, если она существует.
Публичная deployed-версия в репозитории не подтверждена. http://localhost:8000 — локальный адрес работающего приложения.
Репозиторий из git remote: BAITC-Hacks/hack-98e048a9-anhalt-students. Доступ экспертов к последнему коммиту и отправка через «Сдать решение» проверяются на платформе организатора отдельно.
Авторы коммитов
История коммитов
- 2026-09-23 17:33docs: add team structure and architecture responsibilitiesYel
- 2026-09-23 17:27fix(pipeline): invalidate stale forecast on UI error and support 29-day 48h walk-forward export (2,784 rows)Zzmm-gigiboy
- 2026-09-23 16:47fix(audit-3): integrate real pipeline storm demo, calibrate slide roadmap, safe test suite with 54 passing testsZzmm-gigiboy
- 2026-09-23 16:12feat(hour-4): add interactive presentation mode, safe csv download, storm test and sync 52 testsZzmm-gigiboy
- 2026-09-23 15:59feat(hour-4): transactional scada upload, unified js client, truthful audit docs, 52 passing testsZzmm-gigiboy
- 2026-09-23 15:34docs: add comprehensive Demo Day presentation script, pitch deck outline and Q&A defenseZzmm-gigiboy
- 2026-09-23 17:32feat(benchmark): add inference latency & throughput benchmark scriptexternalizat
- 2026-09-23 15:32feat(hour-3): dynamic SCADA upload & retraining, interactive 28-day simulation player, 47 passing testsZzmm-gigiboy
Все коммиты (17)
- 2026-09-23 14:59feat(hour-2-final): pass 44/44 tests, 11-section README, submission audit, and full February simulationZzmm-gigiboy
- 2026-09-23 14:29feat(test): complete 28-day February 2026 backtest simulation (1344 hours) with exportZzmm-gigiboy
- 2026-09-23 14:14feat(hour-2): multi-model benchmarking, Open-Meteo m/s fix, turbine capacity scaling and bilingual auditZzmm-gigiboy
- 2026-09-23 13:42fix(server): ensure root path in sys.path for direct executionZzmm-gigiboy
- 2026-09-23 13:41checkpoint(hour-1): implement Samruk-Kazyna Wind Farm Agentic AI with Open-Meteo, physics features, LightGBM, and interactive dashboardZzmm-gigiboy
- 2026-09-23 12:00chore: add Cursor integration and synchronization rulesZzmm-gigiboy
- 2026-09-22 23:49chore: setup project structure, AI agent rules, and hackathon READMEZzmm-gigiboy
- 2026-09-15 08:43Update README.mdZzmm-gigiboy
- 2026-09-14 10:23Update README with project links and clone commandsZzmm-gigiboy
Структура репозитория (141 файлов)
.cursor/rules/hackalem-agent.mdc .cursorrules .env.example .gitignore PROJECT_RULES.md README.md SPEC.md SPEC_TEMPLATE.md backend/agent/data_loader.py backend/agent/model.py backend/agent/physics.py backend/agent/pipeline.py backend/agent/reasoner.py backend/agent/weather_tool.py backend/main.py backend/static/index.html data/historical_wind.csv data/submission_forecast_february_2026.csv data/submission_forecast_february_2026_v2.csv data/submission_forecast_february_2026_v2.summary.json data/weather_cache_v2/43.6432_78.5388_2026-02-01_2026-02-01.json data/weather_cache_v2/43.6432_78.5388_2026-02-02_2026-02-02.json data/weather_cache_v2/43.6432_78.5388_2026-02-03_2026-02-03.json data/weather_cache_v2/43.6432_78.5388_2026-02-04_2026-02-04.json data/weather_cache_v2/43.6432_78.5388_2026-02-05_2026-02-05.json data/weather_cache_v2/43.6432_78.5388_2026-02-06_2026-02-06.json data/weather_cache_v2/43.6432_78.5388_2026-02-07_2026-02-07.json data/weather_cache_v2/43.6432_78.5388_2026-02-08_2026-02-08.json data/weather_cache_v2/43.6432_78.5388_2026-02-09_2026-02-09.json data/weather_cache_v2/43.6432_78.5388_2026-02-10_2026-02-10.json data/weather_cache_v2/43.6432_78.5388_2026-02-11_2026-02-11.json data/weather_cache_v2/43.6432_78.5388_2026-02-12_2026-02-12.json data/weather_cache_v2/43.6432_78.5388_2026-02-13_2026-02-13.json data/weather_cache_v2/43.6432_78.5388_2026-02-14_2026-02-14.json data/weather_cache_v2/43.6432_78.5388_2026-02-15_2026-02-15.json data/weather_cache_v2/43.6432_78.5388_2026-02-16_2026-02-16.json data/weather_cache_v2/43.6432_78.5388_2026-02-17_2026-02-17.json data/weather_cache_v2/43.6432_78.5388_2026-02-18_2026-02-18.json data/weather_cache_v2/43.6432_78.5388_2026-02-19_2026-02-19.json data/weather_cache_v2/43.6432_78.5388_2026-02-20_2026-02-20.json data/weather_cache_v2/43.6432_78.5388_2026-02-21_2026-02-21.json data/weather_cache_v2/43.6432_78.5388_2026-02-22_2026-02-22.json data/weather_cache_v2/43.6432_78.5388_2026-02-23_2026-02-23.json data/weather_cache_v2/43.6432_78.5388_2026-02-24_2026-02-24.json data/weather_cache_v2/43.6432_78.5388_2026-02-25_2026-02-25.json data/weather_cache_v2/43.6432_78.5388_2026-02-26_2026-02-26.json data/weather_cache_v2/43.6432_78.5388_2026-02-27_2026-02-27.json data/weather_cache_v2/43.6432_78.5388_2026-02-28_2026-02-28.json data/weather_cache_v2/43.6442_78.5372_2026-02-01_2026-02-02.json data/weather_cache_v2/43.6442_78.5372_2026-02-02_2026-02-03.json data/weather_cache_v2/43.6442_78.5372_2026-02-03_2026-02-04.json data/weather_cache_v2/43.6442_78.5372_2026-02-04_2026-02-05.json data/weather_cache_v2/43.6442_78.5372_2026-02-05_2026-02-06.json data/weather_cache_v2/43.6442_78.5372_2026-02-06_2026-02-07.json data/weather_cache_v2/43.6442_78.5372_2026-02-07_2026-02-08.json data/weather_cache_v2/43.6442_78.5372_2026-02-08_2026-02-09.json data/weather_cache_v2/43.6442_78.5372_2026-02-09_2026-02-10.json data/weather_cache_v2/43.6442_78.5372_2026-02-10_2026-02-11.json data/weather_cache_v2/43.6442_78.5372_2026-02-11_2026-02-12.json data/weather_cache_v2/43.6442_78.5372_2026-02-12_2026-02-13.json data/weather_cache_v2/43.6442_78.5372_2026-02-13_2026-02-14.json data/weather_cache_v2/43.6442_78.5372_2026-02-14_2026-02-14.json data/weather_cache_v2/43.6442_78.5372_2026-02-14_2026-02-15.json data/weather_cache_v2/43.6442_78.5372_2026-02-15_2026-02-16.json data/weather_cache_v2/43.6442_78.5372_2026-02-16_2026-02-17.json data/weather_cache_v2/43.6442_78.5372_2026-02-17_2026-02-18.json data/weather_cache_v2/43.6442_78.5372_2026-02-18_2026-02-19.json data/weather_cache_v2/43.6442_78.5372_2026-02-19_2026-02-20.json data/weather_cache_v2/43.6442_78.5372_2026-02-20_2026-02-21.json data/weather_cache_v2/43.6442_78.5372_2026-02-21_2026-02-22.json data/weather_cache_v2/43.6442_78.5372_2026-02-22_2026-02-23.json data/weather_cache_v2/43.6442_78.5372_2026-02-23_2026-02-24.json data/weather_cache_v2/43.6442_78.5372_2026-02-24_2026-02-25.json data/weather_cache_v2/43.6442_78.5372_2026-02-25_2026-02-26.json data/weather_cache_v2/43.6442_78.5372_2026-02-26_2026-02-27.json data/weather_cache_v2/43.6442_78.5372_2026-02-27_2026-02-28.json data/weather_cache_v2/43.6442_78.5372_2026-02-28_2026-03-01.json data/weather_cache_v2/43.6452_78.5356_2026-02-01_2026-02-01.json data/weather_cache_v2/43.6452_78.5356_2026-02-01_2026-02-02.json data/weather_cache_v2/43.6452_78.5356_2026-02-02_2026-02-02.json data/weather_cache_v2/43.6452_78.5356_2026-02-03_2026-02-03.json data/weather_cache_v2/43.6452_78.5356_2026-02-04_2026-02-04.json data/weather_cache_v2/43.6452_78.5356_2026-02-05_2026-02-05.json data/weather_cache_v2/43.6452_78.5356_2026-02-06_2026-02-06.json data/weather_cache_v2/43.6452_78.5356_2026-02-07_2026-02-07.json data/weather_cache_v2/43.6452_78.5356_2026-02-08_2026-02-08.json data/weather_cache_v2/43.6452_78.5356_2026-02-09_2026-02-09.json data/weather_cache_v2/43.6452_78.5356_2026-02-10_2026-02-10.json data/weather_cache_v2/43.6452_78.5356_2026-02-11_2026-02-11.json data/weather_cache_v2/43.6452_78.5356_2026-02-12_2026-02-12.json data/weather_cache_v2/43.6452_78.5356_2026-02-13_2026-02-13.json data/weather_cache_v2/43.6452_78.5356_2026-02-14_2026-02-14.json data/weather_cache_v2/43.6452_78.5356_2026-02-15_2026-02-15.json data/weather_cache_v2/43.6452_78.5356_2026-02-16_2026-02-16.json data/weather_cache_v2/43.6452_78.5356_2026-02-17_2026-02-17.json data/weather_cache_v2/43.6452_78.5356_2026-02-18_2026-02-18.json data/weather_cache_v2/43.6452_78.5356_2026-02-19_2026-02-19.json data/weather_cache_v2/43.6452_78.5356_2026-02-20_2026-02-20.json data/weather_cache_v2/43.6452_78.5356_2026-02-21_2026-02-21.json data/weather_cache_v2/43.6452_78.5356_2026-02-22_2026-02-22.json data/weather_cache_v2/43.6452_78.5356_2026-02-23_2026-02-23.json data/weather_cache_v2/43.6452_78.5356_2026-02-24_2026-02-24.json data/weather_cache_v2/43.6452_78.5356_2026-02-25_2026-02-25.json data/weather_cache_v2/43.6452_78.5356_2026-02-26_2026-02-26.json data/weather_cache_v2/43.6452_78.5356_2026-02-27_2026-02-27.json data/weather_cache_v2/43.6452_78.5356_2026-02-28_2026-02-28.json data/wind_model.joblib docs/DEMO_DAY_PITCH.md docs/STARTER_RESOURCES.md docs/SUBMISSION_AUDIT.md docs/TEAM.md pyproject.toml requirements.txt scripts/benchmark_latency.py scripts/hourly_commit.ps1 scripts/run_february_test.py scripts/test_js_syntax.js task_data/doc_tz.html task_data/doc_tz.txt task_data/extract_links.py task_data/file1 task_data/file1.txt task_data/file2 task_data/file2.txt task_data/file3 task_data/file3.txt task_data/file4 task_data/file4.txt task_data/file5 task_data/file5.txt task_data/file6 task_data/file6.txt task_data/hackathon_detail.json task_data/participants_instruction.txt task_data/search_hist.py task_data/search_sheets.py tests/test_agent.py tests/test_agent_loop.py tests/test_api_contract.py tests/test_forecast_integrity.py uv.lock
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.