Spaces:
Sleeping
Sleeping
Contributing to Logistics Shipment RL Environment
Thank you for your interest in contributing! This environment is designed to be extendable by the research community β you can add new scenarios, disruption types, reward dimensions, or entire carrier networks without touching the core grading logic.
πΊοΈ Architecture Overview
logistics_shipment_env/
βββ server/
β βββ environment.py β Core RL engine (Pydantic models, reward logic)
β βββ app.py β FastAPI server (do not modify entry points)
β βββ grader.py β Reward calculator helpers
βββ inference.py β Baseline agent (hackathon grader runs this)
βββ dashboard.html β Live visual dashboard (standalone)
βββ examples/ β Demo clients and training scripts
βββ openenv.yaml β Environment manifest
β Adding a New Scenario
Scenarios live in server/environment.py in the TASKS dictionary.
Add a new key β existing tasks are completely unaffected.
# In server/environment.py β TASKS dict
"TASK-KOLKATA": {
"name": "Kolkata Port Flood Response",
"description": "Monsoon floods shut KOPT. Reroute 5 fresh cargo shipments within 4 turns.",
"max_turns": 4,
"baseline_delay": 16.0,
"disruptions": [
"KOPT closed: 12h backlog due to flooding",
"NH-12 (KolkataβDhanbad): impassable",
],
"shipments": [
{
"id": "SHIP-001",
"cargo": "Fresh Fish (perishable)",
"origin": "Kolkata",
"destination": "Dhanbad",
"carrier": "CoastCargo",
"route": "R3",
"sla_buffer_h": -3.0,
"delay_h": 6.0,
"value": 18000,
"priority": True,
"status": "DELAYED",
"notes": "Spoils in 8h",
},
# ... add more shipments
],
}
Then add it to openenv.yaml:
tasks:
- id: TASK-KOLKATA
name: "Kolkata Port Flood Response"
description: "Monsoon floods at KOPT. 5 shipments, 4 turns."
difficulty: medium
β Adding a New Route
Routes live in the ROUTES dictionary in server/environment.py.
"R7": {
"name": "KolkataβDhanbad NH-12",
"origin": "Kolkata",
"destination": "Dhanbad",
"hours": 6.0,
"cost": 210,
"congestion": "heavy",
"available": True,
}
β Adding a New Action Type
- Add the new literal to
LogisticsAction.action_typeinserver/environment.py - Add a handler method
_handle_youractionname()inLogisticsShipmentEnvironment - Wire it up in the
step()method's if/elif chain - Add it to the
SYSTEM_PROMPTininference.pyso the baseline agent knows about it
β Extending the Reward Function
The reward function in _handle_end_turn() uses 4 weighted dimensions.
You can add new dimensions without breaking existing ones:
# Example: add a 5th "speed_bonus" dimension
speed_bonus = 0.1 if all(s["delay_h"] == 0 for s in self._state.shipments) else 0.0
# Then re-weight:
turn_rew = min(1.0, (
0.35 * delay_score +
0.25 * sla_score +
0.20 * comm_score +
0.10 * esc_score +
0.10 * speed_bonus +
act_bonus
))
π§ͺ Running Tests
cd logistics_shipment_env
pip install pytest
pytest tests/ -v
π€ Submitting a Pull Request
- Fork this repository
- Create a branch:
git checkout -b feature/new-scenario-kolkata - Add your scenario / route / feature
- Run the test suite to confirm nothing broke
- Open a Pull Request with a clear description of what you added
π Code Style
- All data models must use Pydantic v2 (
BaseModel) - All reward values must be floats strictly in (0, 1) range
- Use type hints everywhere
- Keep action handlers pure (no external API calls)