Spaces:
Sleeping
Sleeping
| import os | |
| import streamlit as st | |
| import pandas as pd | |
| from src.data_sources import list_live_matches, scorecard, extract_simple_context, striker_form_last_overs | |
| from src.features import candidates_from_scorecard, PHASES | |
| from src.strategy_agent import StrategyContext, suggest_strategy | |
| st.set_page_config(page_title="Cricket Strategy Agent (MVP)", page_icon="🏏", layout="wide") | |
| st.title("🏏 Agentic Cricket Strategy (Real-Time MVP)") | |
| with st.sidebar: | |
| st.markdown("### Settings") | |
| st.markdown("**Requires**: `GROQ_API_KEY` (sidebar → Space secrets).") | |
| phase = st.selectbox("Phase", PHASES, index=1) | |
| st.subheader("Live Matches") | |
| # --- FIX: always convert to DataFrame --- | |
| matches = list_live_matches() | |
| df = pd.DataFrame(matches) | |
| if df.empty: | |
| st.info("No live/preview matches found right now, or API unreachable. Try later.") | |
| st.stop() | |
| # Select a match | |
| match_row = st.selectbox( | |
| "Select a match", | |
| df.to_dict("records"), | |
| format_func=lambda r: f"{r.get('title', 'Unknown')} ({r.get('state', 'N/A')})" | |
| ) | |
| mid = str(match_row.get("match_id")) | |
| with st.spinner("Fetching scorecard..."): | |
| sc = scorecard(mid) | |
| ctx = extract_simple_context(sc) | |
| if not ctx: | |
| st.error("Could not parse scorecard for this match.") | |
| st.stop() | |
| col1, col2, col3 = st.columns(3) | |
| with col1: | |
| batting_team = st.selectbox("Batting", [ctx.get("batting_team", "Unknown")]) | |
| with col2: | |
| bowling_team = st.selectbox("Bowling", [ctx.get("bowling_team", "Unknown")]) | |
| with col3: | |
| st.metric( | |
| "Score / Wkts (Overs)", | |
| f"{ctx.get('score', 0)}-{ctx.get('wickets', 0)} ({ctx.get('overs', 0)})", | |
| help=f"RR: {ctx.get('rr', 0)} | CRR: {ctx.get('crr', 0)}" | |
| ) | |
| batsmen = ctx.get("players", {}).get("batsmen", []) | |
| if not batsmen: | |
| st.warning("Batsmen list unavailable. Proceeding with defaults.") | |
| striker = st.selectbox("Striker", batsmen if batsmen else ["Unknown"]) | |
| bowlers = candidates_from_scorecard(ctx.get("players", {})) | |
| cand_bowlers = st.multiselect("Candidate Bowlers (next over)", options=bowlers, default=bowlers) | |
| # Simple ‘recent form’ snapshot for striker | |
| recent = striker_form_last_overs(sc, striker) | |
| # Assemble context and call agent | |
| run = st.button("🧠 Generate Strategy", type="primary") | |
| if run: | |
| sctx = StrategyContext( | |
| match_title=match_row.get("title", "Unknown Match"), | |
| phase=phase, | |
| striker=striker, | |
| non_striker=(batsmen[1] if len(batsmen) > 1 and batsmen[0] == striker else (batsmen[0] if batsmen else "")), | |
| batting_team=batting_team, | |
| bowling_team=bowling_team, | |
| candidate_bowlers=cand_bowlers, | |
| striker_recent=recent, | |
| innings_state={ | |
| "score": ctx.get("score"), | |
| "wickets": ctx.get("wickets"), | |
| "overs": ctx.get("overs"), | |
| "rr": ctx.get("rr"), | |
| "crr": ctx.get("crr") | |
| } | |
| ) | |
| with st.spinner("Thinking with LLaMA-3 (Groq)…"): | |
| plan = suggest_strategy(sctx) | |
| st.markdown("### 📋 Strategy") | |
| st.write(plan) | |
| st.caption("Model: Groq • LLaMA-3 (fast inference)") | |