Skip to content
This repository was archived by the owner on Jun 25, 2026. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 3 additions & 8 deletions commissioners/common/adapters.py
Original file line number Diff line number Diff line change
Expand Up @@ -93,10 +93,7 @@ def _round_start_config(round_start: CommissionerRoundStart) -> dict[str, Any]:
config = round_start.league.commissioner_config or {}
state = round_start.state if isinstance(round_start.state, dict) else {}
round_config = state.get("round_config") if isinstance(state.get("round_config"), dict) else {}
merged = {**config, **round_config}
if "minimum_champions" not in merged and round_start.variants:
merged["minimum_champions"] = round_start.variants[0].num_agents
return merged
return {**config, **round_config}


def _current_division(round_start: CommissionerRoundStart) -> DivisionSnapshot:
Expand Down Expand Up @@ -228,11 +225,9 @@ def _round_start_variant(round_start: CommissionerRoundStart) -> tuple[str, int]
variant_id = variant.id
if variant is None:
return variant_id, len(_round_start_entries(round_start))
tokens = variant.game_config.get("tokens")
token_count = len(tokens) if isinstance(tokens, list) else None
num_agents = variant.num_agents or variant.game_config.get("num_agents") or token_count
num_agents = variant.game_config.get("num_agents")
if not isinstance(num_agents, int):
raise ValueError("round_start variant must include num_agents")
return variant_id, len(_round_start_entries(round_start))
return variant_id, num_agents


Expand Down
6 changes: 0 additions & 6 deletions commissioners/common/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -278,12 +278,6 @@ class AmongThemSchedulingConfig(RoundSchedulingConfig):
dirt_division_name: str = "Dirt"
wood_division_name: str = "Wood"

@model_validator(mode="after")
def require_inferred_minimum_champions(self) -> AmongThemSchedulingConfig:
if "minimum_champions" not in self.model_fields_set:
raise ValueError("AmongThem scheduling requires minimum_champions inferred from the Coworld token count")
return self


# ---------------------------------------------------------------------------
# Snapshot models — lightweight copies of ORM objects for commissioner methods.
Expand Down
1 change: 0 additions & 1 deletion commissioners/common/protocol.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,6 @@ class VariantInfo(BaseModel):
id: str
name: str
game_config: dict[str, Any]
num_agents: int = Field(gt=0)


class EpisodeRequest(BaseModel):
Expand Down
5 changes: 4 additions & 1 deletion commissioners/common/ruleset_strategy/round_start.py
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,10 @@ def variant(self) -> tuple[str, int]:
variant_id = variant.id
if variant is None:
return variant_id, 1
return variant_id, variant.num_agents
num_agents = variant.game_config.get("num_agents")
if isinstance(num_agents, int):
return variant_id, num_agents
return variant_id, len(self.entries(None)) or 1

def entries(self, rule: DivisionRule | None) -> list[PolicyPoolEntry]:
entries = division_entries(self.current_division, self.memberships, rule)
Expand Down
1 change: 0 additions & 1 deletion tests/test_commissioner_strategies.py
Original file line number Diff line number Diff line change
Expand Up @@ -242,7 +242,6 @@ def _round_start(
id="default",
name="Default",
game_config={"num_agents": num_agents},
num_agents=num_agents,
)
],
state=state,
Expand Down
7 changes: 2 additions & 5 deletions tests/test_commissioner_websocket.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ def _round_start_json() -> tuple[dict, list[str]]:
for policy_version_id in policy_version_ids
],
recent_results=[],
variants=[VariantInfo(id="default", name="Default", game_config={"num_agents": 2}, num_agents=2)],
variants=[VariantInfo(id="default", name="Default", game_config={"num_agents": 2})],
)
return round_start.to_json(), [str(policy_version_id) for policy_version_id in policy_version_ids]

Expand Down Expand Up @@ -153,7 +153,7 @@ def test_round_websocket_deactivates_all_failed_qualifier_memberships() -> None:
for membership_id, policy_version_id in zip(membership_ids, policy_version_ids, strict=True)
],
recent_results=[],
variants=[VariantInfo(id="default", name="Default", game_config={"num_agents": 2}, num_agents=2)],
variants=[VariantInfo(id="default", name="Default", game_config={"num_agents": 2})],
).to_json()

with client.websocket_connect("/round") as websocket:
Expand Down Expand Up @@ -328,7 +328,6 @@ def test_episode_duration_limit_has_five_minute_floor() -> None:
id="default",
name="Default",
game_config={"timeout_seconds": 60},
num_agents=2,
)
}

Expand All @@ -342,7 +341,6 @@ def test_episode_duration_limit_doubles_timeout() -> None:
id="default",
name="Default",
game_config={"timeout_seconds": 240},
num_agents=2,
)
}

Expand All @@ -356,7 +354,6 @@ def test_episode_duration_limit_doubles_ten_minute_round_timeout() -> None:
id="default",
name="Default",
game_config={"round_timeout_seconds": 600},
num_agents=2,
)
}

Expand Down
1 change: 0 additions & 1 deletion tests/test_docker_smoke.py
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,6 @@ def _round_start_json(*, policy_count: int, num_agents: int) -> str:
id="default",
name="Default",
game_config={"num_agents": num_agents},
num_agents=num_agents,
)
],
).to_json()
Expand Down
Loading