Rishav
Add SupplyMind V2 multi-agent environment
d5184f8
Raw
History Blame Contribute Delete
7.35 kB
from __future__ import annotations
from typing import Any, Literal
from pydantic import BaseModel, ConfigDict, Field
SKU = Literal["fresh_milk", "rice_bag_5kg", "insulin_pack", "usb_c_charger"]
Personality = Literal["cooperative", "risk_averse", "selfish", "opportunistic"]
OrderStatus = Literal["open", "fulfilled", "expired"]
ProposalStatus = Literal["accepted", "rejected", "countered", "invalid"]
class DifficultyProfile(BaseModel):
model_config = ConfigDict(frozen=True)
task_id: str
warehouse_count: int
total_rounds: int
transfer_cap: int
truck_capacity: int
depot_replenishment_cap: int = 0
depot_trucks: int = 1
depot_procurement_cap: int = 0
depot_procurement_lead_time: int = 2
starting_trust: float
stockout_penalty_multiplier: float
holding_cost_per_unit: float
waste_cost_per_unit: float
fairness_penalty_weight: float
coalition_bonus: float
class WarehouseSpec(BaseModel):
model_config = ConfigDict(frozen=True)
warehouse_id: str
label: str
region: str
personality: Personality
safety_stock: dict[SKU, int]
delivery_cost_by_region: dict[str, float]
delivery_time_by_region: dict[str, int]
class OrderTemplate(BaseModel):
model_config = ConfigDict(frozen=True)
order_id: str
created_round: int
region: str
sku: SKU
units: int
value_per_unit: float
deadline_round: int
priority: int = 1
class HiddenRecipe(BaseModel):
model_config = ConfigDict(frozen=True)
task_id: str
seed: int
profile: DifficultyProfile
warehouse_specs: tuple[WarehouseSpec, ...]
initial_inventory: dict[str, dict[SKU, int]]
central_depot_inventory: dict[SKU, int] = Field(default_factory=dict)
initial_drivers: dict[str, int]
private_forecasts: dict[str, dict[SKU, int]]
orders: tuple[OrderTemplate, ...]
class WarehouseSnapshot(BaseModel):
model_config = ConfigDict(frozen=True)
warehouse_id: str
label: str
region: str
inventory: dict[SKU, int]
drivers_available: int
drivers_returning: list[int] = Field(default_factory=list)
route_costs: dict[str, float] = Field(default_factory=dict)
public_message: str
class CentralDepotSnapshot(BaseModel):
model_config = ConfigDict(frozen=True)
inventory: dict[SKU, int]
trucks_available: int
trucks_returning: list[int] = Field(default_factory=list)
replenishment_cap: int
procurement_cap: int = 0
procurement_lead_time: int = 0
inbound_procurements: list[dict[str, int | str]] = Field(default_factory=list)
message: str = ""
class OrderSnapshot(BaseModel):
model_config = ConfigDict(frozen=True)
order_id: str
region: str
sku: SKU
units: int
value_per_unit: float
deadline_round: int
priority: int
status: OrderStatus = "open"
class DemandReport(BaseModel):
model_config = ConfigDict(frozen=True)
warehouse_id: str
region: str
sku: SKU
requested_units: int = 0
fulfilled_units_last_round: int = 0
missed_units_last_round: int = 0
at_risk_units: int = 0
forecast_units: int = 0
urgency: int = 1
message: str = ""
class FulfillmentDecision(BaseModel):
model_config = ConfigDict(frozen=True)
warehouse_id: str
order_id: str
class InventoryTransferProposal(BaseModel):
model_config = ConfigDict(frozen=True)
from_warehouse: str
to_warehouse: str
sku: SKU
units: int
compensation: float = 0.0
class DriverLoanProposal(BaseModel):
model_config = ConfigDict(frozen=True)
from_warehouse: str
to_warehouse: str
driver_count: int
compensation: float = 0.0
class CentralReplenishmentProposal(BaseModel):
model_config = ConfigDict(frozen=True)
to_warehouse: str
sku: SKU
units: int
class CentralProcurementProposal(BaseModel):
model_config = ConfigDict(frozen=True)
sku: SKU
units: int
class MarketSignal(BaseModel):
model_config = ConfigDict(frozen=True)
signal_id: str
warehouse_id: str
signal_type: Literal["inventory_offer", "inventory_request", "driver_offer", "driver_request", "demand_warning"]
sku: SKU | None = None
units: int = 0
driver_count: int = 0
ask_price: float = 0.0
urgency: int = 1
message: str = ""
class OfferMatch(BaseModel):
model_config = ConfigDict(frozen=True)
offer_signal_id: str
request_signal_id: str
units: int
compensation: float = 0.0
class PriorityRule(BaseModel):
model_config = ConfigDict(frozen=True)
sku: SKU | None = None
region: str | None = None
priority: int = 1
class CoalitionDeal(BaseModel):
model_config = ConfigDict(frozen=True)
deal_id: str
order_id: str
supporting_warehouses: list[str] = Field(default_factory=list)
compensation_pool: float = 0.0
class V3Action(BaseModel):
fulfillments: list[FulfillmentDecision] = Field(default_factory=list)
central_procurements: list[CentralProcurementProposal] = Field(default_factory=list)
central_replenishments: list[CentralReplenishmentProposal] = Field(default_factory=list)
inventory_transfers: list[InventoryTransferProposal] = Field(default_factory=list)
driver_loans: list[DriverLoanProposal] = Field(default_factory=list)
offer_matches: list[OfferMatch] = Field(default_factory=list)
priority_policy: list[PriorityRule] = Field(default_factory=list)
defer_orders: list[str] = Field(default_factory=list)
coalition_deals: list[CoalitionDeal] = Field(default_factory=list)
class NegotiationEvent(BaseModel):
model_config = ConfigDict(frozen=True)
actor: str
proposal_type: str
status: ProposalStatus
summary: str
local_utility_delta: float = 0.0
class V3Reward(BaseModel):
step_reward: float
cumulative_reward: float
components: dict[str, float] = Field(default_factory=dict)
class V3Feedback(BaseModel):
last_step_reward: float = 0.0
cumulative_reward: float = 0.0
recent_events: list[str] = Field(default_factory=list)
negotiation_trace: list[NegotiationEvent] = Field(default_factory=list)
reward_components: dict[str, float] = Field(default_factory=dict)
agent_rewards: dict[str, float] = Field(default_factory=dict)
current_pressure: str = ""
episode_summary: dict[str, Any] | None = None
class V3ScenarioInfo(BaseModel):
task_id: str
used_seed: int
total_rounds: int
transfer_cap: int
truck_capacity: int
objective_brief: str = ""
action_brief: str = ""
episode_brief: str = ""
class V3Observation(BaseModel):
round_index: int
remaining_rounds: int
task_id: str
central_depot: CentralDepotSnapshot
warehouses: list[WarehouseSnapshot]
market_signals: list[MarketSignal] = Field(default_factory=list)
demand_reports: list[DemandReport] = Field(default_factory=list)
open_orders: list[OrderSnapshot] = Field(default_factory=list)
feedback: V3Feedback
scenario_info: V3ScenarioInfo
class V3StepResult(BaseModel):
observation: V3Observation
reward: V3Reward
done: bool
info: dict[str, Any]
class V3TaskResult(BaseModel):
task_id: str
raw_reward: float
baseline_reward: float
target_reward: float
score: float
heuristic_reward: float | None = None