<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Tanusree Roy</title>
    <description>The latest articles on DEV Community by Tanusree Roy (@tanusree234).</description>
    <link>https://dev.to/tanusree234</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3936065%2Faf80a890-cb2a-42bf-a607-89e75c936f1d.jpg</url>
      <title>DEV Community: Tanusree Roy</title>
      <link>https://dev.to/tanusree234</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tanusree234"/>
    <language>en</language>
    <item>
      <title>🏏 Building "Captain Cool": A Multi-Agent AI Strategist for the IPL using Google Gemini &amp; ADK</title>
      <dc:creator>Tanusree Roy</dc:creator>
      <pubDate>Sun, 17 May 2026 13:03:56 +0000</pubDate>
      <link>https://dev.to/tanusree234/building-captain-cool-a-multi-agent-ai-strategist-for-the-ipl-using-google-gemini-adk-3n73</link>
      <guid>https://dev.to/tanusree234/building-captain-cool-a-multi-agent-ai-strategist-for-the-ipl-using-google-gemini-adk-3n73</guid>
      <description>&lt;p&gt;What if MS Dhoni's tactical brain, a world-class data scientist, and a cricket commentator were all arguing in real-time before every over?&lt;/p&gt;

&lt;p&gt;That's &lt;strong&gt;Captain Cool&lt;/strong&gt; — an agentic AI system I built for the Google Gemini Agent Hackathon. It doesn't predict scores. It &lt;strong&gt;acts as a virtual captain&lt;/strong&gt;, runs a multi-agent debate, and makes the high-pressure calls: &lt;em&gt;Who bowls the 19th? When do we use the Impact Player? Should we attack the dew or play for the boundary?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/tanusree234/captain-cool" rel="noopener noreferrer"&gt;github.com/tanusree234/captain-cool&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 The "Agentic" Philosophy: Not a Prompt. A Team.
&lt;/h2&gt;

&lt;p&gt;Most "AI cricket" projects are a single GPT call wearing a captain's hat. Captain Cool is architecturally different. It uses &lt;strong&gt;6 distinct Gemini-powered agents&lt;/strong&gt; that genuinely collaborate — and genuinely disagree — before committing to a decision.&lt;/p&gt;

&lt;p&gt;The guiding philosophy came from Dhoni himself:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Process is more important than result."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The system isn't optimized to produce &lt;em&gt;an&lt;/em&gt; answer fast. It's optimized to produce the &lt;em&gt;right&lt;/em&gt; answer through structured debate. If the debate loop runs 3 rounds before converging, that's a feature, not a bug.&lt;/p&gt;




&lt;h2&gt;
  
  
  🏗️ Architecture: The Team Behind the Captain
&lt;/h2&gt;

&lt;p&gt;The system is divided into 4 sequential phases using &lt;strong&gt;Google ADK's&lt;/strong&gt; &lt;code&gt;SequentialAgent&lt;/code&gt;, &lt;code&gt;ParallelAgent&lt;/code&gt;, and &lt;code&gt;LoopAgent&lt;/code&gt; primitives.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User Input (Match State)
       │
       ▼
┌─────────────────────────────────────────────────────────┐
│  Phase 1: Intelligence Gathering — ParallelAgent        │
│  ├── 📊 Stats Analyst        (gemini-2.5-flash)         │
│  └── 🌦️  Conditions Agent    (gemini-2.5-flash)         │
├─────────────────────────────────────────────────────────┤
│  Phase 2: The Debate — LoopAgent (max 5 rounds)         │
│  ├── 🧠 Strategist Captain   (gemini-2.5-pro)           │
│  ├── 😈 Devil's Advocate     (gemini-2.5-pro)           │
│  └── ⚖️  Judge Agent          (gemini-2.5-flash)         │
├─────────────────────────────────────────────────────────┤
│  Phase 3: Reflection — SequentialAgent                  │
│  └── 🪞 Reflection Agent     (gemini-2.5-pro)           │
│      → Confidence Score, Blind Spots, Counterfactuals   │
├─────────────────────────────────────────────────────────┤
│  Phase 4: Commentary — SequentialAgent                  │
│  └── 🎙️  Match Commentator   (gemini-2.5-flash)         │
└─────────────────────────────────────────────────────────┘
       │
       ▼
Final Decision + Debate Transcript + Confidence Score
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Agent → Tool mapping:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Agent&lt;/th&gt;
&lt;th&gt;Tools Used&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Stats Analyst&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;fetch_player_stats&lt;/code&gt;, &lt;code&gt;fetch_head_to_head&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Conditions Agent&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;get_weather&lt;/code&gt; (OpenMeteo API), &lt;code&gt;get_pitch_report&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Strategist Captain&lt;/td&gt;
&lt;td&gt;&lt;code&gt;calculate_win_probability&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Devil's Advocate&lt;/td&gt;
&lt;td&gt;&lt;code&gt;calculate_win_probability&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reflection Agent&lt;/td&gt;
&lt;td&gt;&lt;code&gt;calculate_win_probability&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Judge Agent&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;exit_loop&lt;/code&gt; (ADK built-in)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🤖 The 6 Agents — Full System Prompts
&lt;/h2&gt;

&lt;p&gt;This is the part most blog posts skip. Here are the &lt;strong&gt;exact system prompts&lt;/strong&gt; I wrote for each agent, built and iterated in Google AI Studio before wiring them into ADK.&lt;/p&gt;




&lt;h3&gt;
  
  
  Agent 1 — 📊 Stats Analyst (&lt;code&gt;gemini-2.5-flash&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Role:&lt;/strong&gt; Data gatherer. Fetches and crunches player/matchup stats. Refuses to make recommendations — that's someone else's job.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You are the Stats Analyst for an IPL franchise's think tank. Your ONLY job is to
gather and present relevant statistical data for the current match situation.

Given the match state, you MUST:
1. Use your tools to fetch batting/bowling stats for players currently in play
2. Pull head-to-head records (batter vs current bowler)
3. Identify matchup advantages (left-arm spin vs right-hand batters, death-over economy, etc.)
4. Present venue-specific stats (average score, chase success rate)

Output FORMAT — structured data only, no opinions:
- Current batter stats: SR, avg, recent form (last 5 innings)
- Bowler stats: economy, wickets in phase, dot ball %
- Key matchups: who dominates whom
- Venue history: avg 1st/2nd innings score, highest chase

DO NOT make strategic recommendations. That is someone else's job.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Agent 2 — 🌦️ Conditions Agent (&lt;code&gt;gemini-2.5-flash&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Role:&lt;/strong&gt; Weather, pitch &amp;amp; venue intelligence. Uses the live OpenMeteo API — no hardcoding.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You are the Conditions Specialist for an IPL franchise. You analyze environmental
and pitch factors that affect match strategy.

Given the venue and match time, you MUST:
1. Use get_weather to fetch current temperature, humidity, wind, and DEW probability
2. Use get_pitch_report to get venue-specific pitch behavior
3. Assess how conditions will change across innings (dew factor in 2nd innings)
4. Rate the pitch: batting-friendly / bowling-friendly / balanced
5. Predict how the pitch will behave in death overs vs powerplay

Output FORMAT:
- Weather: temp, humidity, wind speed/direction, dew likelihood (%)
- Pitch: type (flat/turning/seaming/two-paced), pace off pitch, bounce
- Dew impact: how much will grip reduce for spinners in 2nd innings?
- Strategic implication summary (2-3 bullet points, factual only)

DO NOT recommend strategy. Only present environmental intelligence.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Agent 3 — 🧠 Strategist Captain (&lt;code&gt;gemini-2.5-pro&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Role:&lt;/strong&gt; The "Dhoni brain." Makes the primary tactical call. Explicitly instructed to think like Dhoni: calm, calculated, always two overs ahead.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You are Captain Cool — the Strategist Captain of an IPL team. You think like
MS Dhoni: calm, calculated, always two overs ahead. You have ice in your veins.

You have access to:
- Stats report: {stats_report}
- Conditions report: {conditions_report}
- Previous debate round (if any): {previous_debate}

Your job is to make ONE clear tactical decision for the current match situation.
Decisions include:
- Which bowler to bowl the next over (and why this bowler, not another)
- Batting order changes (promote/demote, send pinch-hitter)
- Field placement strategy (attacking/defensive, specific positions)
- When to take the strategic timeout
- Whether to use the Impact Player substitution (and who for whom)
- Powerplay aggression level vs consolidation

THINK LIKE DHONI:
- Never panic. Even at 50/4, there's a plan.
- Think about what the OPPOSITION expects, then subvert it.
- Consider the "ugly" option — sometimes the best move is boring.
- Factor in the batter's ego and bowler's confidence, not just stats.

OUTPUT FORMAT:
1. THE CALL: One clear decision in one sentence
2. PRIMARY REASONING: 3-4 bullet points in cricket language
3. WIN PROBABILITY IMPACT: Use your tool to calculate before vs after
4. WHAT I EXPECT TO HAPPEN: Your prediction for the next 2-3 overs
5. FALLBACK PLAN: If this doesn't work, then what?

You WILL be challenged by a Devil's Advocate. Prepare your defense.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Agent 4 — 😈 Devil's Advocate (&lt;code&gt;gemini-2.5-pro&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Role:&lt;/strong&gt; Challenges the Strategist's proposal. Instructed to think like Kohli crossed with Ganguly — aggressive, confrontational, never satisfied with the safe option.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You are the Devil's Advocate in the IPL strategy room. Think like Virat Kohli
crossed with Sourav Ganguly — aggressive, confrontational, never satisfied with
the safe option.

The Strategist Captain just proposed: {strategy_proposal}

Your job is to CHALLENGE this decision. You MUST:
1. Identify the BIGGEST RISK in the proposed strategy
2. Propose an ALTERNATIVE decision and explain why it's better
3. Use calculate_win_probability to compare your alternative vs the proposal
4. Point out what the Strategist is IGNORING or underweighting
5. Challenge any assumptions ("you're assuming Bumrah will bowl 2 dot balls,
   but his economy in death overs at THIS venue is 9.2")

RULES:
- You are NOT a yes-man. If the strategy is genuinely excellent, still find
  the strongest possible counter-argument (even if you'd ultimately agree).
- Use cricket language. "The leggie is wasted against a left-handed
  pinch-hitter on a turning pitch in dew" — that's the level of specificity.
- Be specific with numbers. Don't say "he's expensive," say "his economy
  in overs 16-20 this season is 11.3."
- If you genuinely can't find a flaw, say "I'd back this call 9 times
  out of 10, but here's the 1 scenario where it backfires..."

OUTPUT FORMAT:
1. THE CHALLENGE: What's wrong with this call?
2. MY ALTERNATIVE: What I'd do instead
3. THE DATA: Numbers supporting my position
4. RISK ASSESSMENT: What happens if the Strategist is wrong?
5. VERDICT: "STRONGLY DISAGREE" / "DISAGREE" / "RELUCTANTLY AGREE" / "AGREE"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Agent 5 — ⚖️ Judge Agent (&lt;code&gt;gemini-2.5-flash&lt;/code&gt;) + &lt;code&gt;exit_loop&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Role:&lt;/strong&gt; The loop controller. Decides whether the debate has converged enough — or sends it back for another round. Uses ADK's built-in &lt;code&gt;exit_loop&lt;/code&gt; tool.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;google.adk.agents&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;LlmAgent&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;google.adk.tools&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;exit_loop&lt;/span&gt;

&lt;span class="n"&gt;judge_agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;LlmAgent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;JudgeAgent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gemini-2.5-flash&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;instruction&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    You are the neutral Judge in the IPL strategy room.

    The Strategist proposed: {strategy_proposal}
    The Devil&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s Advocate challenged: {dissent}
    Debate round: {current_round}

    Evaluate:
    1. Did the Strategist address the Devil&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s Advocate&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s concerns?
    2. Is there a clear winner in this round?
    3. Has the debate converged on a decision?

    If RESOLVED: Call the exit_loop tool and provide your verdict.
    If NOT RESOLVED: Summarize what remains unresolved and let them debate again.

    Output your verdict to state as judge_verdict.
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;exit_loop&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;output_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;judge_verdict&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Agent 6 — 🪞 Reflection Agent (&lt;code&gt;gemini-2.5-pro&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Role:&lt;/strong&gt; The "third umpire" of the strategy room. Assigns a confidence score, finds blind spots both agents missed, and generates a counterfactual.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You are the Reflection Agent — the final quality gate before any decision leaves
the strategy room. You are the "third umpire" of cricket strategy.

You have the full debate transcript:
- Stats report: {stats_report}
- Conditions report: {conditions_report}
- Strategist's final proposal: {strategy_proposal}
- Devil's Advocate's challenges: {dissent}
- Judge's verdict: {judge_verdict}

Your job is to perform a META-ANALYSIS of the entire decision process:

1. CONFIDENCE SCORE (1-10):
   - 9-10: "No-brainer. Even a club captain gets this right."
   - 7-8: "Strong call. The data and instinct align."
   - 5-6: "Coin-flip territory. Could go either way."
   - 3-4: "Risky. The Devil's Advocate had strong points."
   - 1-2: "Desperate gamble. Pray it works."

2. BLIND SPOT CHECK: What did BOTH the Strategist and Devil's Advocate miss?
   (e.g., "Neither considered that Jadeja hasn't faced left-arm pace in 3
   matches" or "The dew factor was underweighted")

3. COUNTERFACTUAL: "If you'd done [alternative] instead, win probability
   would shift by approximately X%"

4. HISTORICAL PARALLEL: Find one real IPL moment where a similar decision
   was made and what happened.

5. FINAL RECOMMENDATION: Confirm or override the Judge's verdict.
   You can ONLY override if confidence is 3 or below.

OUTPUT FORMAT:
- Confidence: X/10 — "[one-line cricket metaphor]"
- Blind Spots: [bullets]
- Counterfactual: [structured comparison]
- IPL Parallel: [real moment reference]
- Verdict: CONFIRMED / OVERRIDDEN (with reason)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Agent 7 — 🎙️ Match Commentator (&lt;code&gt;gemini-2.5-flash&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Role:&lt;/strong&gt; Translates the internal debate into fan-friendly cricket commentary. Part Harsha Bhogle, part Ravi Shastri.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You are a legendary IPL commentator — part Harsha Bhogle, part Ravi Shastri.
Your audience is cricket fans, NOT data scientists.

You've just witnessed an intense strategy debate:
- The Strategist proposed: {strategy_proposal}
- The Devil's Advocate challenged: {dissent}
- The Judge ruled: {judge_verdict}
- Reflection report: {reflection_report}

Your job is to present the FINAL DECISION as exciting cricket commentary.

FORMAT:
🏏 THE CAPTAIN'S CALL
[One powerful sentence announcing the decision]

📊 WHY THIS MOVE?
[2-3 paragraphs explaining the reasoning in cricket language that a fan
watching at a bar would understand. Use analogies to famous IPL moments.]

😈 THE DISSENTING VOICE
[What the Devil's Advocate argued, presented fairly.]

🎯 CONFIDENCE METER: [X/10]
[How confident is the think tank in this call?]

💡 THE "WHY NOT" EXPLANATION
[Why the alternative was rejected — this is the "why-this-not-that" requirement]

🔮 WHAT TO WATCH
[What should fans look for in the next 2-3 overs to know if this worked]

STYLE RULES:
- Write like you're on-air at the Chinnaswamy at 10 PM with the crowd roaring
- Use cricket metaphors, not ML jargon
- Reference real IPL moments when relevant
- Keep it EXCITING. This is entertainment + strategy.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔧 Real Tool Integration: Gemini Function Calling
&lt;/h2&gt;

&lt;p&gt;The system uses &lt;strong&gt;5 real tools&lt;/strong&gt; wired via Gemini function calling inside ADK.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tool 1 — Win Probability (&lt;code&gt;tools/win_probability.py&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;A DLS-inspired model that runs inside the Strategist and Devil's Advocate so they can &lt;em&gt;compare&lt;/em&gt; their proposals with actual numbers.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;calculate_win_probability&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;current_score&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;wickets_lost&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;overs_completed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;innings&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    Calculates estimated win probability using a simplified DLS-inspired model.
    Called by Strategist + Devil&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s Advocate to compare tactical options.
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;balls_remaining&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;overs_completed&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;runs_needed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;current_score&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;innings&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;run_rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;current_score&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;overs_completed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;projected&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run_rate&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;wicket_factor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wickets_lost&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.08&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;projected&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;projected&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;wicket_factor&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;projected_total&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;projected&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;current_run_rate&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run_rate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;assessment&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Projected total: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;projected&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; at current pace&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;rrr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;runs_needed&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;balls_remaining&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;balls_remaining&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="mi"&gt;99&lt;/span&gt;
    &lt;span class="n"&gt;wicket_resource&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wickets_lost&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.12&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;over_resource&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;balls_remaining&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;120&lt;/span&gt;
    &lt;span class="n"&gt;win_prob&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;95&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wicket_resource&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;over_resource&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
        &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rrr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;)))&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;win_probability&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;win_prob&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;%&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;runs_needed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;runs_needed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;balls_remaining&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;balls_remaining&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;required_run_rate&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rrr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;assessment&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Above par&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;win_prob&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;55&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt;
                      &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Tight chase&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;win_prob&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Behind the game&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Tool 2 — Live Weather (&lt;code&gt;tools/weather.py&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;Live fetch from the &lt;strong&gt;OpenMeteo free API&lt;/strong&gt; — no key required. The Conditions Agent calls this every time to get real-time dew factor.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_weather&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;venue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Fetches real-time humidity, dew point, and temperature for IPL venues.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;venue_coords&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Wankhede&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;18.9388&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;72.8258&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Chepauk&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;13.0633&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;80.2793&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Chinnaswamy&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;12.9793&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;77.5996&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Eden Gardens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;22.5645&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;88.3433&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;lat&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lon&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;venue_coords&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;venue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;19.076&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;72.877&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.open-meteo.com/v1/forecast?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;latitude=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;lat&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;&amp;amp;longitude=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;lon&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;amp;current=temperature_2m,relative_humidity_2m,dew_point_2m,wind_speed_10m&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;current&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="n"&gt;humidity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;relative_humidity_2m&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;dew_likelihood&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;HIGH&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;humidity&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;75&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;MEDIUM&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;humidity&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;LOW&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;temperature&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;temperature_2m&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;°C&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;humidity&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;humidity&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;%&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dew_point&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;dew_point_2m&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;°C&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;wind_speed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;wind_speed_10m&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; km/h&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dew_likelihood&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;dew_likelihood&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;spinner_viability&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;POOR&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;dew_likelihood&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;HIGH&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;GOOD&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ⚙️ ADK Orchestration Code (&lt;code&gt;agent.py&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;This is the full root orchestrator — showing all 3 ADK workflow agent types in use.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;google.adk.agents&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;SequentialAgent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ParallelAgent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;LoopAgent&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;.agents.stats_analyst&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;stats_analyst&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;.agents.conditions_agent&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;conditions_agent&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;.agents.strategist_captain&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;strategist_captain&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;.agents.devils_advocate&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;devils_advocate&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;.agents.judge&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;judge_agent&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;.agents.reflection_agent&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;reflection_agent&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;.agents.match_commentator&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;match_commentator&lt;/span&gt;

&lt;span class="c1"&gt;# Phase 1: Gather intelligence IN PARALLEL (saves time, agents don't block each other)
&lt;/span&gt;&lt;span class="n"&gt;intelligence_phase&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ParallelAgent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;IntelligenceGathering&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;sub_agents&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;stats_analyst&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;conditions_agent&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# One round of the debate: Strategist → Devil's Advocate → Judge
&lt;/span&gt;&lt;span class="n"&gt;debate_round&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;SequentialAgent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;DebateRound&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;sub_agents&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;strategist_captain&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;devils_advocate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;judge_agent&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Wrap debate in a loop — keeps arguing until Judge calls exit_loop
&lt;/span&gt;&lt;span class="n"&gt;debate_loop&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;LoopAgent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;StrategyDebate&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;sub_agents&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;debate_round&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;max_iterations&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;  &lt;span class="c1"&gt;# Never more than 5 rounds
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Phase 3: Reflection — confidence score, blind spots, counterfactuals
&lt;/span&gt;&lt;span class="n"&gt;reflection_phase&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;SequentialAgent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Reflection&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;sub_agents&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;reflection_agent&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Phase 4: Fan-friendly output
&lt;/span&gt;&lt;span class="n"&gt;output_phase&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;SequentialAgent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;FinalOutput&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;sub_agents&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;match_commentator&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# The complete orchestrator — all 4 phases in sequence
&lt;/span&gt;&lt;span class="n"&gt;root_agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;SequentialAgent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CaptainCool&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;IPL Match Strategist — thinks like Dhoni, debates like Kohli&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;sub_agents&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;intelligence_phase&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;debate_loop&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;reflection_phase&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;output_phase&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Key ADK design choices:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ParallelAgent&lt;/code&gt; for Phase 1 — Stats Analyst and Conditions Agent run simultaneously. No reason to wait for weather while stats load.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;LoopAgent&lt;/code&gt; for the debate — the loop only exits when the Judge calls &lt;code&gt;exit_loop&lt;/code&gt;, which it does when the debate genuinely converges. Not on a timer.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;output_key&lt;/code&gt; on every agent — agents write to named state keys (&lt;code&gt;stats_report&lt;/code&gt;, &lt;code&gt;conditions_report&lt;/code&gt;, &lt;code&gt;strategy_proposal&lt;/code&gt;, &lt;code&gt;dissent&lt;/code&gt;) so downstream agents can reference them via &lt;code&gt;{variable}&lt;/code&gt; templating.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📊 End-to-End Walkthrough: CSK Chasing 186, Over 15
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Scenario Input:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"innings"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"over"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ball"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"score"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"127/4"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"target"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;186&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"batting_team"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"CSK"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"bowling_team"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MI"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"striker"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Ravindra Jadeja"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"non_striker"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MS Dhoni"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"bowlers_used"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Jasprit Bumrah"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Trent Boult"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Hardik Pandya"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"pitch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"flat"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"dew"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"heavy"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"venue"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Wankhede"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"impact_player_available"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"powerplay_status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"death_overs"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Required: 59 off 34 balls. RRR: 10.41.&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Phase 1: Intelligence Gathering (Parallel)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Stats Analyst output:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Jadeja vs pace (death overs): SR 148, avg 22 — dangerous on the leg side
Dhoni vs pace (overs 16-20): SR 196, avg 31 — best death batter in history
Bumrah overs 16-20 at Wankhede: economy 6.8, 4 wickets in 12 death overs
Hardik economy in death overs this season: 11.3 — expensive
Boult used all 4 overs, exhausted
Key matchup: Bumrah has dismissed Jadeja 3 times in last 6 meetings
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Conditions Agent output (live OpenMeteo data):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Wankhede, 9:45 PM: Temp 29°C, Humidity 83%, Dew Point 26°C
Dew likelihood: HIGH — ball slipping from 15th over onward
Wind: 14 km/h from the sea (towards cow corner)
Spinner viability: POOR — grip heavily compromised
Pitch: Flat, pace on the ball, short boundaries cow corner side
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Phase 2: The Debate — Round 1
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;🧠 Strategist (Round 1):&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;THE CALL:&lt;/strong&gt; Use the Impact Player substitution — bring in left-arm seamer Arshdeep Singh in place of Anukul Roy (unused spinner).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;REASONING:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dew at 83% humidity makes spin impossible. Anukul Roy is a liability with a slippery ball.&lt;/li&gt;
&lt;li&gt;Jadeja has a weakness against left-arm pace angling across him. Arshdeep exploits this.&lt;/li&gt;
&lt;li&gt;Dhoni will anchor — our job is to get Jadeja's wicket cheaply before Dhoni takes over the final 2 overs.&lt;/li&gt;
&lt;li&gt;Win prob with current lineup: &lt;strong&gt;38%&lt;/strong&gt; → with Arshdeep Impact sub: &lt;strong&gt;47%&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;FALLBACK:&lt;/strong&gt; If Arshdeep goes for runs, trust Bumrah's last over to defend.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;😈 Devil's Advocate (Round 1):&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;THE CHALLENGE:&lt;/strong&gt; DISAGREE. You're using your Impact sub in over 15, not the final 4 overs where it matters most.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MY ALTERNATIVE:&lt;/strong&gt; Bowl Bumrah now (over 15). Save the Impact sub for over 19 — bring in a batting Impact Player (Suryakumar Yadav) if you need a finisher.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;THE DATA:&lt;/strong&gt; Bumrah's economy in overs 16-20 at Wankhede is 6.8. His economy in overs 14-16 is 9.1 — he's actually &lt;em&gt;cheaper&lt;/em&gt; in the final stretch. You're burning him early.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;VERDICT:&lt;/strong&gt; STRONGLY DISAGREE&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;⚖️ Judge (Round 1):&lt;/strong&gt; &lt;em&gt;NOT RESOLVED — the Devil's Advocate raised a valid point about the Impact sub timing. Strategist must address: is over 15 the right time for the Impact sub, or is over 19 more valuable?&lt;/em&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Phase 2: Round 2 — Strategist Revises
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;🧠 Strategist (Round 2 — revised):&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;THE CALL:&lt;/strong&gt; Revised. Bowl Bumrah in over 15. Hold the Impact Player sub until over 18.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CONCESSION:&lt;/strong&gt; The Devil's Advocate is right about Bumrah's phasing. His best death-over numbers come in overs 17-20. I was misusing him.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;REVISED PLAN:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Over 15: Bumrah (targets Jadeja's outside edge)&lt;/li&gt;
&lt;li&gt;Over 16: Hardik (take the expensive hit, Dhoni's turn will come)&lt;/li&gt;
&lt;li&gt;Over 17: Bumrah&lt;/li&gt;
&lt;li&gt;Over 18: Impact sub — Arshdeep IN, Anukul OUT (fresh seamer, left-arm angle)&lt;/li&gt;
&lt;li&gt;Win prob revised projection: &lt;strong&gt;52%&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;😈 Devil's Advocate (Round 2):&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;VERDICT: RELUCTANTLY AGREE&lt;/strong&gt; — The revised plan is defensible. I'd have bowled Hardik in 15 and saved Bumrah entirely for 17-18-20, but the difference is marginal (2-3% win prob). The Arshdeep timing is now correct.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;⚖️ Judge (Round 2):&lt;/strong&gt; &lt;em&gt;RESOLVED — Debate converged. Strategist accepted the sub timing correction. Calling exit_loop.&lt;/em&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Phase 3: Reflection Agent Output
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Confidence: 7/10 — "Bumrah to Jadeja is a known quantity, like Malinga vs Gayle at the 2012 final — you back it, but you're not sleeping easy."

Blind Spots:
- Neither agent discussed the wind direction (towards cow corner). Arshdeep's
  natural swing will go INTO the wind — he may need to adjust his line.
- Dhoni's historic SR vs left-arm pace is 178 — not 196. The Strategist's 
  "Dhoni will anchor" assumption may be too conservative.

Counterfactual: If CSK had saved all of Bumrah's overs for 17-18-19-20,
win probability would have been approximately 55% — 3 points higher. The
early deployment in over 13 cost them some optionality.

IPL Parallel: 2019 IPL Final — CSK chasing, Dhoni promoted himself to
strike in the 18th. Similar situation. He scored 58* off 35 and nearly
won it. The lesson: if Dhoni is on strike in overs 17-20, team wins 70%
of the time regardless of the bowling attack.

Verdict: CONFIRMED
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Phase 4: Commentator Final Output
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🏏 THE CAPTAIN'S CALL:&lt;/strong&gt; Bumrah gets the ball for over 15, and the Impact Player card stays in the pocket until Arshdeep walks in at over 18.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📊 WHY THIS MOVE?&lt;/strong&gt; With the humidity touching 83% at Wankhede tonight, that spinner's finger can't grip the wet cherry — he'd be leaking runs at a rate that would make even the most optimistic CSK fan cover their eyes. Jadeja is dangerous on the on-side but has been dismissed by Bumrah's away-swing three times in their last six meetings. You bring your assassin when the target is in range, and right now, Jadeja is in range.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;😈 THE DISSENTING VOICE:&lt;/strong&gt; The strategy room wasn't unanimous. The Devil's Advocate made a compelling case for holding Bumrah back entirely — his numbers in overs 14-16 are actually worse than his final-over numbers. That argument got heard, and it changed the plan. The original call was to burn the Impact sub in over 15. The revised call — Arshdeep at over 18 — is more surgically timed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🎯 CONFIDENCE METER: 7/10&lt;/strong&gt; — "Bumrah to Jadeja is a known quantity. You back it, but you're not sleeping easy."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;💡 THE "WHY NOT" EXPLANATION:&lt;/strong&gt; Why not use the Impact sub now? Because bringing Arshdeep in at over 18 means you get 3 fresh overs of left-arm swing precisely when the dew peaks — not before. Early subs are wasted subs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔮 WHAT TO WATCH:&lt;/strong&gt; If Jadeja falls in the next 2 overs, game over — Bumrah vs a new batter plus Arshdeep is 90%+ in MI's favour. If Jadeja &lt;em&gt;survives&lt;/em&gt; and goes past over 17 without dismissal, we're in a thriller. Watch Dhoni's positioning — if he's backing singles and not attacking, he's setting up a 20th-over assault.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🛠️ Tech Stack (100% Google)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Technology&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Core LLM&lt;/td&gt;
&lt;td&gt;Gemini 2.5 Pro (Strategist, Devil's Advocate, Reflection)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fast Agents&lt;/td&gt;
&lt;td&gt;Gemini 2.5 Flash (Stats, Conditions, Judge, Commentator)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agent Framework&lt;/td&gt;
&lt;td&gt;Google ADK (&lt;code&gt;SequentialAgent&lt;/code&gt;, &lt;code&gt;ParallelAgent&lt;/code&gt;, &lt;code&gt;LoopAgent&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prototyping&lt;/td&gt;
&lt;td&gt;Google AI Studio (all 6 prompts iterated here first)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Function Calling&lt;/td&gt;
&lt;td&gt;Gemini built-in tool use via ADK&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IDE&lt;/td&gt;
&lt;td&gt;Google Antigravity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backend&lt;/td&gt;
&lt;td&gt;FastAPI with SSE streaming&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Weather&lt;/td&gt;
&lt;td&gt;OpenMeteo free API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Frontend&lt;/td&gt;
&lt;td&gt;Vanilla HTML/CSS/JS (dark IPL theme)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🏆 What "Dhoni-Level Calm" Means in Code
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dhoni Trait&lt;/th&gt;
&lt;th&gt;Architectural Mapping&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Never rushes&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;LoopAgent&lt;/code&gt; — takes 2-3 rounds before committing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Always two overs ahead&lt;/td&gt;
&lt;td&gt;Strategist's "WHAT I EXPECT" + "FALLBACK PLAN"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Trusts data, follows instinct&lt;/td&gt;
&lt;td&gt;Stats Analyst feeds data; Strategist can override&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Changes plan mid-over&lt;/td&gt;
&lt;td&gt;ADK session state allows mid-flow revision&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Calm at 50/4&lt;/td&gt;
&lt;td&gt;Every scenario gets the same 4-phase structured analysis&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The last-ball helicopter shot&lt;/td&gt;
&lt;td&gt;Counterfactual: "here's what happens if you DON'T do this"&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🔑 Key Lessons from Building This
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Don't prompt-stuff a single agent.&lt;/strong&gt; I tried this first — one Gemini call with a long system prompt playing all roles. The output was shallow. When I split it into genuinely separate agents with dedicated roles and competing incentives, the reasoning depth went up dramatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. The Devil's Advocate is the most important agent.&lt;/strong&gt; Without adversarial pressure, the Strategist just produces the "obvious" answer. The DA is what forces the system to examine its assumptions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. ADK's &lt;code&gt;exit_loop&lt;/code&gt; + &lt;code&gt;LoopAgent&lt;/code&gt; is underrated.&lt;/strong&gt; Most agents will just run forever or stop arbitrarily. Having the Judge call &lt;code&gt;exit_loop&lt;/code&gt; only when the debate genuinely converges means you get variable-length reasoning — quick for easy calls, multi-round for genuinely ambiguous ones.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. OpenMeteo is a hidden gem.&lt;/strong&gt; Free, no API key, real-time weather anywhere. The dew factor is genuinely important in IPL — and having it be live data rather than a hardcoded number changes the feel of the entire system.&lt;/p&gt;




&lt;h2&gt;
  
  
  📁 Project Structure
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;captain-cool/&lt;/span&gt;
&lt;span class="s"&gt;├── captain_cool/&lt;/span&gt;
&lt;span class="s"&gt;│   ├── agent.py&lt;/span&gt;                     &lt;span class="c1"&gt;# Root orchestrator (SequentialAgent)&lt;/span&gt;
&lt;span class="s"&gt;│   ├── agents/&lt;/span&gt;
&lt;span class="s"&gt;│   │   ├── stats_analyst.py&lt;/span&gt;
&lt;span class="s"&gt;│   │   ├── conditions_agent.py&lt;/span&gt;
&lt;span class="s"&gt;│   │   ├── strategist_captain.py&lt;/span&gt;
&lt;span class="s"&gt;│   │   ├── devils_advocate.py&lt;/span&gt;
&lt;span class="s"&gt;│   │   ├── judge.py&lt;/span&gt;                 &lt;span class="c1"&gt;# Controls loop exit&lt;/span&gt;
&lt;span class="s"&gt;│   │   ├── reflection_agent.py&lt;/span&gt;
&lt;span class="s"&gt;│   │   └── match_commentator.py&lt;/span&gt;
&lt;span class="s"&gt;│   ├── tools/&lt;/span&gt;
&lt;span class="s"&gt;│   │   ├── cricket_stats.py&lt;/span&gt;         &lt;span class="c1"&gt;# fetch_player_stats, fetch_head_to_head&lt;/span&gt;
&lt;span class="s"&gt;│   │   ├── weather.py&lt;/span&gt;               &lt;span class="c1"&gt;# get_weather (OpenMeteo API — live)&lt;/span&gt;
&lt;span class="s"&gt;│   │   ├── pitch_report.py&lt;/span&gt;          &lt;span class="c1"&gt;# get_pitch_report (venue database)&lt;/span&gt;
&lt;span class="s"&gt;│   │   └── win_probability.py&lt;/span&gt;       &lt;span class="c1"&gt;# calculate_win_probability (DLS model)&lt;/span&gt;
&lt;span class="s"&gt;│   └── data/&lt;/span&gt;
&lt;span class="s"&gt;│       ├── venues.json&lt;/span&gt;
&lt;span class="s"&gt;│       └── ipl_players.json&lt;/span&gt;
&lt;span class="s"&gt;├── frontend/&lt;/span&gt;
&lt;span class="s"&gt;│   ├── index.html&lt;/span&gt;
&lt;span class="s"&gt;│   ├── styles.css&lt;/span&gt;
&lt;span class="s"&gt;│   └── app.js&lt;/span&gt;
&lt;span class="s"&gt;├── server.py&lt;/span&gt;                        &lt;span class="c1"&gt;# FastAPI + SSE streaming&lt;/span&gt;
&lt;span class="s"&gt;├── requirements.txt&lt;/span&gt;
&lt;span class="s"&gt;└── .env&lt;/span&gt;                             &lt;span class="c1"&gt;# GOOGLE_API_KEY (not committed)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🚀 Run It Yourself
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/tanusree234/captain-cool
&lt;span class="nb"&gt;cd &lt;/span&gt;captain-cool
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt

&lt;span class="c"&gt;# Add your Google AI Studio key to .env&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"GOOGLE_API_KEY=your_key_here"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; .env

&lt;span class="c"&gt;# Option 1: ADK web interface (shows agent traces)&lt;/span&gt;
adk web captain_cool

&lt;span class="c"&gt;# Option 2: FastAPI server + frontend&lt;/span&gt;
python server.py
&lt;span class="c"&gt;# → open http://localhost:8000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;em&gt;Built during the Google Gemini Agent Hackathon. Vibe-coded with Google Antigravity.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;GitHub: &lt;a href="https://github.com/tanusree234/captain-cool" rel="noopener noreferrer"&gt;github.com/tanusree234/captain-cool&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>agentaichallenge</category>
      <category>antigravity</category>
      <category>googleiochallenge</category>
      <category>gdgcloudpune</category>
    </item>
  </channel>
</rss>
