Deploy optimized case study image loading
Browse files
assets/case_study/capabl_india_microgrid_hero.webp
CHANGED
|
Git LFS Details
|
|
Git LFS Details
|
assets/case_study/capabl_neighbourhood_dispatch.webp
CHANGED
|
Git LFS Details
|
|
Git LFS Details
|
assets/case_study/capabl_rooftop_infrastructure.webp
CHANGED
|
Git LFS Details
|
|
Git LFS Details
|
assets/case_study/capabl_society_operator.webp
CHANGED
|
|
gridops/server/app.py
CHANGED
|
@@ -35,6 +35,14 @@ app = create_app(
|
|
| 35 |
max_concurrent_envs=int(os.environ.get("MAX_CONCURRENT_ENVS", "10")),
|
| 36 |
)
|
| 37 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 38 |
# ── Shared stateful environment for HTTP dashboard ───────────────────────
|
| 39 |
# OpenEnv HTTP /reset and /step are stateless (new env per request).
|
| 40 |
# The dashboard needs persistent state between reset → step → step...
|
|
|
|
| 35 |
max_concurrent_envs=int(os.environ.get("MAX_CONCURRENT_ENVS", "10")),
|
| 36 |
)
|
| 37 |
|
| 38 |
+
|
| 39 |
+
@app.middleware("http")
|
| 40 |
+
async def add_static_cache_headers(request, call_next):
|
| 41 |
+
response = await call_next(request)
|
| 42 |
+
if request.url.path.startswith(("/assets/", "/evals/")):
|
| 43 |
+
response.headers.setdefault("Cache-Control", "public, max-age=31536000, immutable")
|
| 44 |
+
return response
|
| 45 |
+
|
| 46 |
# ── Shared stateful environment for HTTP dashboard ───────────────────────
|
| 47 |
# OpenEnv HTTP /reset and /step are stateless (new env per request).
|
| 48 |
# The dashboard needs persistent state between reset → step → step...
|
gridops/server/static/case-study.html
CHANGED
|
@@ -6,6 +6,7 @@
|
|
| 6 |
<title>GridOps India Case Study | Capabl Machines</title>
|
| 7 |
<meta name="description" content="GridOps is a Capabl Machines case study on AI-managed community microgrids for India's fast-growing rooftop solar future.">
|
| 8 |
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 64 64'%3E%3Crect width='64' height='64' rx='14' fill='%23111827'/%3E%3Cpath d='M34 8 14 34h17l-3 22 22-30H33z' fill='%238ef2c3'/%3E%3C/svg%3E">
|
|
|
|
| 9 |
<style>
|
| 10 |
:root {
|
| 11 |
--ink: #15202b;
|
|
@@ -538,12 +539,12 @@
|
|
| 538 |
<div class="stat"><strong>1 crore</strong><span>national rooftop household ambition</span></div>
|
| 539 |
</div>
|
| 540 |
<div class="wide-image">
|
| 541 |
-
<img src="/assets/case_study/capabl_rooftop_infrastructure.webp" alt="Indian apartment society rooftop solar, battery storage, EV charging, and transformer infrastructure">
|
| 542 |
</div>
|
| 543 |
<p class="source-line">Context sources: <a href="https://mnre.gov.in/en/physical-progress/">MNRE Physical Achievements</a> and <a href="https://static.pib.gov.in/WriteReadData/specificdocs/documents/2025/dec/doc2025126720001.pdf">PIB India Solar Momentum</a>.</p>
|
| 544 |
<div class="infographic" id="journey" aria-label="GridOps India solar intelligence journey infographic">
|
| 545 |
<div class="infographic-scroll">
|
| 546 |
-
<img src="/assets/case_study/capabl_energy_journey_infographic.svg" alt="Journey from India's rooftop solar scale to local microgrid complexity, Capabl Machine dispatch, and community outcomes">
|
| 547 |
</div>
|
| 548 |
</div>
|
| 549 |
</div>
|
|
@@ -566,7 +567,7 @@
|
|
| 566 |
</div>
|
| 567 |
</div>
|
| 568 |
<div class="image-frame">
|
| 569 |
-
<img src="/assets/case_study/capabl_society_operator.webp" alt="Indian society manager and solar installer reviewing microgrid intelligence">
|
| 570 |
</div>
|
| 571 |
</div>
|
| 572 |
</section>
|
|
@@ -574,7 +575,7 @@
|
|
| 574 |
<section class="section light" id="machine">
|
| 575 |
<div class="wrap split reverse">
|
| 576 |
<div class="image-frame">
|
| 577 |
-
<img src="/assets/case_study/capabl_neighbourhood_dispatch.webp" alt="Indian neighbourhood microgrid with solar, battery, EV charging, grid connection, and local dispatch">
|
| 578 |
</div>
|
| 579 |
<div>
|
| 580 |
<p class="eyebrow">What intelligence unlocks</p>
|
|
@@ -681,19 +682,19 @@
|
|
| 681 |
</div>
|
| 682 |
<div class="plots">
|
| 683 |
<figure class="plot">
|
| 684 |
-
<img src="/evals/plots/gridops_holdout_scores.png" alt="Holdout score comparison for do-nothing, SFT, and oracle policies">
|
| 685 |
<figcaption>Holdout score by task.</figcaption>
|
| 686 |
</figure>
|
| 687 |
<figure class="plot">
|
| 688 |
-
<img src="/evals/plots/gridops_battery_throughput.png" alt="Battery throughput by policy and task">
|
| 689 |
<figcaption>Battery throughput confirms active dispatch.</figcaption>
|
| 690 |
</figure>
|
| 691 |
<figure class="plot">
|
| 692 |
-
<img src="/evals/plots/gridops_blackout_kwh.png" alt="Blackout kilowatt hours by policy and task">
|
| 693 |
<figcaption>Blackout energy falls sharply versus baseline.</figcaption>
|
| 694 |
</figure>
|
| 695 |
<figure class="plot">
|
| 696 |
-
<img src="/evals/plots/gridops_sft_training_curve.png" alt="SFT training loss and token accuracy curve">
|
| 697 |
<figcaption>Real training loss and token accuracy from the run.</figcaption>
|
| 698 |
</figure>
|
| 699 |
</div>
|
|
|
|
| 6 |
<title>GridOps India Case Study | Capabl Machines</title>
|
| 7 |
<meta name="description" content="GridOps is a Capabl Machines case study on AI-managed community microgrids for India's fast-growing rooftop solar future.">
|
| 8 |
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 64 64'%3E%3Crect width='64' height='64' rx='14' fill='%23111827'/%3E%3Cpath d='M34 8 14 34h17l-3 22 22-30H33z' fill='%238ef2c3'/%3E%3C/svg%3E">
|
| 9 |
+
<link rel="preload" as="image" href="/assets/case_study/capabl_india_microgrid_hero.webp" type="image/webp" fetchpriority="high">
|
| 10 |
<style>
|
| 11 |
:root {
|
| 12 |
--ink: #15202b;
|
|
|
|
| 539 |
<div class="stat"><strong>1 crore</strong><span>national rooftop household ambition</span></div>
|
| 540 |
</div>
|
| 541 |
<div class="wide-image">
|
| 542 |
+
<img src="/assets/case_study/capabl_rooftop_infrastructure.webp" alt="Indian apartment society rooftop solar, battery storage, EV charging, and transformer infrastructure" width="1280" height="720" loading="lazy" decoding="async">
|
| 543 |
</div>
|
| 544 |
<p class="source-line">Context sources: <a href="https://mnre.gov.in/en/physical-progress/">MNRE Physical Achievements</a> and <a href="https://static.pib.gov.in/WriteReadData/specificdocs/documents/2025/dec/doc2025126720001.pdf">PIB India Solar Momentum</a>.</p>
|
| 545 |
<div class="infographic" id="journey" aria-label="GridOps India solar intelligence journey infographic">
|
| 546 |
<div class="infographic-scroll">
|
| 547 |
+
<img src="/assets/case_study/capabl_energy_journey_infographic.svg" alt="Journey from India's rooftop solar scale to local microgrid complexity, Capabl Machine dispatch, and community outcomes" width="2200" height="900" loading="lazy" decoding="async">
|
| 548 |
</div>
|
| 549 |
</div>
|
| 550 |
</div>
|
|
|
|
| 567 |
</div>
|
| 568 |
</div>
|
| 569 |
<div class="image-frame">
|
| 570 |
+
<img src="/assets/case_study/capabl_society_operator.webp" alt="Indian society manager and solar installer reviewing microgrid intelligence" width="1120" height="630" loading="lazy" decoding="async">
|
| 571 |
</div>
|
| 572 |
</div>
|
| 573 |
</section>
|
|
|
|
| 575 |
<section class="section light" id="machine">
|
| 576 |
<div class="wrap split reverse">
|
| 577 |
<div class="image-frame">
|
| 578 |
+
<img src="/assets/case_study/capabl_neighbourhood_dispatch.webp" alt="Indian neighbourhood microgrid with solar, battery, EV charging, grid connection, and local dispatch" width="1280" height="720" loading="lazy" decoding="async">
|
| 579 |
</div>
|
| 580 |
<div>
|
| 581 |
<p class="eyebrow">What intelligence unlocks</p>
|
|
|
|
| 682 |
</div>
|
| 683 |
<div class="plots">
|
| 684 |
<figure class="plot">
|
| 685 |
+
<img src="/evals/plots/gridops_holdout_scores.png" alt="Holdout score comparison for do-nothing, SFT, and oracle policies" width="1200" height="750" loading="lazy" decoding="async">
|
| 686 |
<figcaption>Holdout score by task.</figcaption>
|
| 687 |
</figure>
|
| 688 |
<figure class="plot">
|
| 689 |
+
<img src="/evals/plots/gridops_battery_throughput.png" alt="Battery throughput by policy and task" width="1200" height="750" loading="lazy" decoding="async">
|
| 690 |
<figcaption>Battery throughput confirms active dispatch.</figcaption>
|
| 691 |
</figure>
|
| 692 |
<figure class="plot">
|
| 693 |
+
<img src="/evals/plots/gridops_blackout_kwh.png" alt="Blackout kilowatt hours by policy and task" width="1200" height="750" loading="lazy" decoding="async">
|
| 694 |
<figcaption>Blackout energy falls sharply versus baseline.</figcaption>
|
| 695 |
</figure>
|
| 696 |
<figure class="plot">
|
| 697 |
+
<img src="/evals/plots/gridops_sft_training_curve.png" alt="SFT training loss and token accuracy curve" width="1200" height="750" loading="lazy" decoding="async">
|
| 698 |
<figcaption>Real training loss and token accuracy from the run.</figcaption>
|
| 699 |
</figure>
|
| 700 |
</div>
|