File size: 1,689 Bytes
5add236
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""Pydantic v2 models for OpenEnv interface."""
from __future__ import annotations
from typing import Any, Dict, List, Literal, Optional, Union
from pydantic import BaseModel, Field

# ── Alert model ──
class Alert(BaseModel):
    alert_id: str
    timestamp: str
    service: str
    metric: str
    metric_value: float
    threshold: float
    message: str
    context: Optional[str] = None
    triaged: bool = False
    agent_decision: Optional[Dict[str, Any]] = None

# ── Observation ──
class Observation(BaseModel):
    alerts: List[Alert]
    service_map: Dict[str, List[str]]
    pending_count: int
    step_number: int
    max_steps: int
    feedback: str = ""

# ── Actions ──
class TriageAction(BaseModel):
    action_type: Literal["triage"] = "triage"
    alert_id: str
    root_cause: str
    severity: str
    remediation: str

class LinkAlertsAction(BaseModel):
    action_type: Literal["link_alerts"] = "link_alerts"
    alert_ids: List[str]
    incident_label: str

class SkipAction(BaseModel):
    action_type: Literal["skip"] = "skip"
    alert_id: str

Action = Union[TriageAction, LinkAlertsAction, SkipAction]

# ── Step response ──
class StepResponse(BaseModel):
    observation: Observation
    reward: float
    done: bool
    info: Dict[str, Any] = {}

# ── Request models ──
class ResetRequest(BaseModel):
    task_id: str
    seed: int = 42

class StepRequest(BaseModel):
    action_type: str
    alert_id: Optional[str] = None
    alert_ids: Optional[List[str]] = None
    incident_label: Optional[str] = None
    root_cause: Optional[str] = None
    severity: Optional[str] = None
    remediation: Optional[str] = None