market-forge-admin / models.py
kenmandal's picture
Deploy MarketForge Admin — Scalable Oversight Dashboard
8ed96b4 verified
"""
models.py — Data models for the MarketForge Admin oversight system.
All data flowing through the monitor, analyzer, and dashboard passes through these classes.
"""
from dataclasses import dataclass, field
from typing import Dict, List, Any, Optional
from enum import Enum
import time
class AlertSeverity(str, Enum):
INFO = "info"
WARNING = "warning"
CRITICAL= "critical"
class BehaviorPattern(str, Enum):
NORMAL = "normal"
PASSIVE = "passive" # agent passes too often
AGGRESSIVE = "aggressive" # extreme price manipulation
COLLUSIVE = "collusive" # coordinated price-fixing
STRATEGIC = "strategic" # healthy ToM behaviour
ERRATIC = "erratic" # inconsistent, likely random
@dataclass
class AgentAction:
"""A single action taken by a monitored agent."""
timestamp: float
agent_id: str
role: str
action_type: str
commodity: str = ""
price: float = 0.0
quantity: int = 0
target_agent: str = ""
message: str = ""
reward: float = 0.0
round_number: int = 0
cash: float = 0.0
reputation: float = 1.0
raw_json: str = ""
@dataclass
class AgentBehaviorSummary:
"""Per-agent rolled-up statistics computed by the analyzer."""
agent_id: str
role: str
total_actions: int = 0
total_reward: float = 0.0
avg_reward: float = 0.0
action_counts: Dict[str, int] = field(default_factory=dict)
pass_rate: float = 0.0
trade_efficiency: float = 0.0 # profitable trades / total trades
negotiation_rate: float = 0.0
coalition_rate: float = 0.0
avg_cash: float = 0.0
avg_reputation: float = 1.0
pattern: BehaviorPattern = BehaviorPattern.NORMAL
tom_level: int = 0 # 0/1/2 theory-of-mind level inferred
anomaly_score: float = 0.0 # 0=normal, 1=highly anomalous
last_seen: float = 0.0
@dataclass
class OversightAlert:
"""A flag raised by the oversight agent or rule engine."""
alert_id: str
timestamp: float
severity: AlertSeverity
agent_id: str
pattern: BehaviorPattern
title: str
description: str
evidence: List[str] = field(default_factory=list)
recommended_action: str = ""
acknowledged: bool = False
@dataclass
class MonitoringStats:
"""Global system-wide metrics tracked by the monitor."""
total_actions_logged: int = 0
active_agents: int = 0
total_trades: int = 0
total_negotiations: int = 0
total_coalitions: int = 0
total_passes: int = 0
total_alerts: int = 0
critical_alerts: int = 0
avg_system_reward: float = 0.0
uptime_seconds: float = 0.0
env_url: str = ""
env_healthy: bool = False
last_updated: float = 0.0
@dataclass
class OversightObservation:
"""What the oversight agent sees — its observation in the OpenEnv sense."""
oversight_agent_id: str
monitored_agents: List[str]
recent_actions: List[AgentAction]
summaries: Dict[str, AgentBehaviorSummary]
active_alerts: List[OversightAlert]
stats: MonitoringStats
prompt: str = ""
reward: float = 0.0
done: bool = False
round_number: int = 0
max_rounds: int = 100
legal_actions: List[str] = field(default_factory=lambda: [
"flag_agent", "clear_alert", "request_explanation", "pause_monitoring", "pass"
])
@dataclass
class OversightAction:
"""Action issued by the oversight agent."""
oversight_agent_id: str = "overseer_1"
action_type: str = "pass" # flag_agent | clear_alert | request_explanation | pass
target_agent: str = ""
alert_severity: str = "warning"
reason: str = ""
explanation_request: str = ""