File size: 2,870 Bytes
ed4bdac
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""Pydantic data models for the metagame arena system."""
from __future__ import annotations

from typing import Any, Optional

from pydantic import BaseModel, Field

from constant_definitions.arena.arena_constants import (
    PROPOSAL_BAN,
)
from constant_definitions.arena.reputation_weights import (
    DEFAULT_ARENA_SCORE_NUMERATOR,
    DEFAULT_ARENA_SCORE_DENOMINATOR,
)
from constant_definitions.arena.messaging_constants import (
    MSG_TYPE_DIRECT,
)

_ZERO = int()
_ONE = int(bool(True))
_ZERO_F = float()
_DEFAULT_SCORE = (
    DEFAULT_ARENA_SCORE_NUMERATOR / DEFAULT_ARENA_SCORE_DENOMINATOR
)


class ArenaMessage(BaseModel):
    """A message sent between models during the communication phase."""

    sender: str
    recipients: list[str] = Field(default_factory=list)
    msg_type: str = MSG_TYPE_DIRECT
    content: str = ""
    gossip_target: Optional[str] = None
    gossip_rating: Optional[str] = None


class ArenaModelProfile(BaseModel):
    """Tracks per-model metadata, reputation signals, and game history."""

    model_id: str
    model_type: str = ""
    reputation: float = _DEFAULT_SCORE
    cooperation_history: list[float] = Field(default_factory=list)
    honesty: float = _DEFAULT_SCORE
    fairness: float = _DEFAULT_SCORE
    peer_ratings: list[dict[str, str]] = Field(default_factory=list)
    games_played: int = _ZERO
    is_active: bool = True
    banned_round: Optional[int] = None


class ArenaProposal(BaseModel):
    """A governance proposal submitted by a model."""

    proposer: str
    proposal_type: str = PROPOSAL_BAN
    target_model: Optional[str] = None
    rule_description: Optional[str] = None
    game_definition: Optional[dict[str, Any]] = None


class ArenaVote(BaseModel):
    """A model's vote on a governance proposal."""

    voter: str
    proposal_index: int = _ZERO
    approve: bool = True
    weight: float = _DEFAULT_SCORE


class ArenaRoundResult(BaseModel):
    """Complete record of one arena round across all phases."""

    round_number: int = _ZERO
    messages: list[ArenaMessage] = Field(default_factory=list)
    proposals: list[ArenaProposal] = Field(default_factory=list)
    votes: list[ArenaVote] = Field(default_factory=list)
    adopted: list[int] = Field(default_factory=list)
    game_results: list[dict[str, Any]] = Field(default_factory=list)
    reputation_updates: dict[str, float] = Field(default_factory=dict)


class ArenaState(BaseModel):
    """Mutable state of the metagame arena across rounds."""

    round_number: int = _ZERO
    total_rounds: int = _ZERO
    roster: dict[str, ArenaModelProfile] = Field(default_factory=dict)
    game_pool: list[str] = Field(default_factory=list)
    custom_games: list[str] = Field(default_factory=list)
    round_history: list[ArenaRoundResult] = Field(default_factory=list)
    active_rules: list[str] = Field(default_factory=list)