BDO.env / models.py
Vaidhav's picture
Initial OpenEnv environment submission
49b6c79
Raw
History Blame Contribute Delete
2.86 kB
from __future__ import annotations
from typing import Any, Literal
from openenv.core.env_server.types import Action, Observation, State
from pydantic import BaseModel, Field
ActionName = Literal[
"allocate_funds",
"build_reserve",
"deploy_reserve",
"approve_batch",
"reject_transfer",
"trigger_field_audit",
"dispatch_repair",
"dispatch_repair_team",
"issue_early_warning",
"escalate_to_oversight",
]
class ActionCommand(BaseModel):
name: ActionName
params: dict[str, Any] = Field(default_factory=dict)
class BDOAction(Action):
predicted_fraud_level: float | None = Field(
default=None,
ge=0.0,
le=1.0,
description="District-level fraud estimate inferred from the noisy observation.",
)
thought_process: str | None = Field(
default=None,
description="Free-form reasoning trace explaining why the batch was chosen.",
)
actions: list[ActionCommand] = Field(
default_factory=list,
description="Ordered monthly action batch executed until the admin-hour budget runs out.",
)
class TransferAlertModel(BaseModel):
transfer_id: str
village: str
amount: int
metadata: dict[str, Any] = Field(default_factory=dict)
oversight_flag: str
reason: str
class VillageSnapshot(BaseModel):
village: str
reported_demand: int
report_lag_days: int
demand_confidence: float
biometric_signal: float
stability_index: float
stability_trend: str
class TreasurySnapshot(BaseModel):
district_budget: int
projected_demand: int
buffer_reserve: int
emergency_unlocked: bool
class MetaSnapshot(BaseModel):
month: int
fiscal_year_remaining: int
global_event: str
active_shocks: list[str] = Field(default_factory=list)
hours_remaining: int
action_costs: dict[str, int] = Field(default_factory=dict)
class RewardBreakdownModel(BaseModel):
coverage: float = 0.0
fraud_prevention: float = 0.0
solvency: float = 0.0
stability: float = 0.0
belief_accuracy: float = 0.0
total: float = 0.0
class VerifierScoresModel(BaseModel):
syntactic_verifier: float = 0.0
rationality_verifier: float = 0.0
outcome_verifier: float = 0.0
class BDOObservation(Observation):
meta: MetaSnapshot
treasury: TreasurySnapshot
nodes: list[VillageSnapshot]
high_risk_queue: list[TransferAlertModel] = Field(default_factory=list)
summary: str = ""
info: dict[str, Any] = Field(
default_factory=dict,
description="Step-level diagnostics, reward breakdowns, and execution details.",
)
class BDOState(State):
scenario_name: str = "randomized"
month: int = 1
shock_month: int | None = None
seed: int | None = None
terminated: bool = False
last_reward: float | None = None