File size: 6,220 Bytes
927e21b
 
6c96042
 
 
 
 
927e21b
 
 
 
 
 
 
6c96042
 
 
 
 
2560080
6c96042
 
 
927e21b
6c96042
 
 
 
 
 
1948c14
6c96042
 
927e21b
6c96042
 
 
927e21b
6c96042
927e21b
 
 
6c96042
927e21b
12fc392
 
86a4911
12fc392
 
 
cb4ffbd
12fc392
927e21b
 
 
 
 
6c96042
927e21b
86a4911
 
 
 
6c96042
 
 
 
 
1948c14
6c96042
 
 
 
 
 
927e21b
 
 
 
 
 
 
 
f439b49
 
 
927e21b
 
6c96042
12fc392
 
 
6c96042
 
12fc392
 
6c96042
 
 
12fc392
 
 
 
927e21b
 
 
 
12fc392
 
 
cb4ffbd
12fc392
86a4911
12fc392
1b84cbd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
86a4911
 
 
 
 
 
 
 
 
 
6c96042
927e21b
6c96042
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
from enum import Enum
from typing import Any, Optional

from openenv.core.env_server.types import Action, Observation, State
from pydantic import Field


class GameState(str, Enum):
    TOSS = "toss"
    BATTING = "batting"
    BOWLING = "bowling"
    FINISHED = "finished"


class CricketAction(Action):
    """Agent sends a structured JSON tool call per step."""

    tool: str = Field(
        ...,
        description="Tool to invoke: 'call_toss' | 'choose_bowler' | 'select_batter' | 'set_strategy' | 'plan_shot' | 'play_delivery' | 'set_bowling_strategy' | 'plan_delivery' | 'set_field_setting' | 'bowl_delivery' | 'reflect_after_ball' | 'analyze_situation' | 'set_match_plan' | 'update_match_plan'",
    )
    arguments: dict[str, Any] = Field(
        default_factory=dict,
        description="Tool-specific arguments",
    )


class CricketObservation(Observation):
    """Environment returns game state + rendered prompt for LLM consumption."""

    game_state: str = Field(default="batting")
    game_context: dict[str, Any] = Field(
        default_factory=dict,
        description="Current match state: over, ball, score, wickets, phase, run_rate, etc.",
    )
    declared_strategy: dict[str, Any] = Field(
        default_factory=dict,
        description="Active batting strategy",
    )
    bowling_strategy: dict[str, Any] = Field(
        default_factory=dict,
        description="Active bowling strategy",
    )
    field_setting: str = Field(default="Balanced")
    strategic_phase: str = Field(default="pre_ball")
    current_batter: dict[str, Any] = Field(default_factory=dict)
    non_striker: dict[str, Any] = Field(default_factory=dict)
    current_bowler: dict[str, Any] = Field(default_factory=dict)
    opponent_context: dict[str, Any] = Field(default_factory=dict)
    opponent_plan: dict[str, Any] = Field(default_factory=dict)
    last_outcome: dict[str, Any] = Field(default_factory=dict)
    eval_pack_id: str = Field(default="default")
    available_tools: list[str] = Field(default_factory=list)
    tool_history: list[dict[str, Any]] = Field(default_factory=list)
    last_ball_result: str = Field(default="")
    prompt_text: str = Field(default="")
    target: Optional[int] = Field(default=None)
    innings_type: str = Field(default="first")
    curriculum_stage: int = Field(default=2)
    match_plan: dict[str, Any] = Field(default_factory=dict)
    plan_review_due: bool = Field(default=False)
    plan_version: int = Field(default=0)
    plan_age_overs: int = Field(default=0)


class CricketState(State):
    """Episode state exposed via the /state endpoint."""

    game_state: str = Field(default="batting")
    phase: str = Field(default="powerplay")
    total_score: int = Field(default=0)
    wickets_lost: int = Field(default=0)
    over: int = Field(default=0)
    ball: int = Field(default=0)
    innings_type: str = Field(default="first")
    
    # Toss info
    toss_winner: Optional[str] = None
    toss_decision: Optional[str] = None
    
    # First innings stats (to set target for second)
    first_innings_score: int = 0
    target: Optional[int] = None
    match_result: str = Field(default="")
    reward_breakdown: dict[str, Any] = Field(default_factory=dict)
    innings_rewards: list[dict[str, Any]] = Field(default_factory=list)
    
    # Strategy and tool tracking
    coherence_scores: list[float] = Field(default_factory=list)
    adaptation_scores: list[float] = Field(default_factory=list)
    opponent_awareness_scores: list[float] = Field(default_factory=list)
    regret_scores: list[float] = Field(default_factory=list)
    tool_calls_made: int = Field(default=0)
    analyze_calls: list[dict[str, Any]] = Field(default_factory=list)
    tool_history: list[dict[str, Any]] = Field(default_factory=list)
    transcript: list[dict[str, Any]] = Field(default_factory=list)
    dls_par: float = Field(default=250.0)
    strategy_changes: int = Field(default=0)
    last_strategy_set_over: int = Field(default=-1)
    last_reflection: str = Field(default="")
    eval_pack_id: str = Field(default="default")
    opponent_mode: str = Field(default="heuristic")
    strategic_phase: str = Field(default="pre_ball")
    
    # Bowling specific
    bowling_strategy: dict[str, Any] = Field(default_factory=dict)
    field_setting: str = Field(default="Balanced")
    shot_plan: dict[str, Any] = Field(default_factory=dict)
    delivery_plan: dict[str, Any] = Field(default_factory=dict)
    opponent_plan: dict[str, Any] = Field(default_factory=dict)
    last_outcome: dict[str, Any] = Field(default_factory=dict)
    current_batter: dict[str, Any] = Field(default_factory=dict)
    non_striker: dict[str, Any] = Field(default_factory=dict)
    current_bowler: dict[str, Any] = Field(default_factory=dict)

    # Per-innings Dream11 batting stats (reset on innings change)
    batting_runs: int = Field(default=0)
    batting_balls_faced: int = Field(default=0)
    batting_fours: int = Field(default=0)
    batting_sixes: int = Field(default=0)
    batting_duck: bool = Field(default=False)

    # Per-innings Dream11 bowling stats (reset on innings change)
    bowling_wickets: int = Field(default=0)
    bowling_runs_conceded: int = Field(default=0)
    bowling_dot_balls: int = Field(default=0)
    bowling_lbw_bowled_wickets: int = Field(default=0)
    bowling_maiden_overs: int = Field(default=0)
    bowling_balls_in_over: int = Field(default=0)
    bowling_runs_in_over: int = Field(default=0)

    # Accumulated per-innings Dream11 scores (set at innings/match end)
    dream11_scores: list[float] = Field(default_factory=list)

    # Match plan state
    match_plan: dict[str, Any] = Field(default_factory=dict)
    plan_version: int = Field(default=0)
    plan_created_over: int = Field(default=-1)
    last_plan_update_over: int = Field(default=-1)
    plan_review_due: bool = Field(default=False)
    plan_staleness_penalties: list[float] = Field(default_factory=list)
    plan_commitment_scores: list[float] = Field(default_factory=list)
    plan_freshness_scores: list[float] = Field(default_factory=list)

    is_done: bool = Field(default=False)
    curriculum_stage: int = Field(default=2)
    max_overs: int = Field(default=50)