File size: 1,833 Bytes
dc42cb3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""CloudOps Optimizer Environment Client.

Provides the async EnvClient for connecting to the server.
"""

from typing import Any, Dict, Optional

try:
    from openenv.core.env_client import EnvClient
    from openenv.core.client_types import StepResult
except ImportError:
    from openenv.core.env_client import EnvClient
    from openenv.core.client_types import StepResult

from models import Observation as ObsModel, Action as ActModel


class CloudOpsClient(EnvClient[ActModel, ObsModel, Dict[str, Any]]):
    """Async client for the CloudOps Optimizer Environment."""

    def _step_payload(self, action: ActModel) -> Dict[str, Any]:
        return action.model_dump()

    def _parse_result(self, payload: Dict[str, Any]) -> "StepResult[ObsModel]":
        obs_data = payload.get("observation", payload)
        reward = payload.get("reward", 0.0)
        done = payload.get("done", False)
        info = payload.get("info", {})

        try:
            observation = ObsModel.model_validate(obs_data)
        except Exception:
            observation = ObsModel(
                inventory=[],
                metrics=payload.get("metrics", {"avg_latency_ms": 0, "error_rate": 0, "throughput_rps": 0}),
                sla=payload.get("sla", {"max_latency_ms": 0, "max_budget": 0, "min_uptime_pct": 0}),
                echoed_message="Error parsing observation",
            )

        return StepResult(
            observation=observation,
            reward=reward,
            done=done,
            info=info,
        )

    def _parse_state(self, payload: Dict[str, Any]) -> Dict[str, Any]:
        return payload


def get_client(base_url: str = "http://localhost:7860") -> CloudOpsClient:
    """Create a CloudOps client."""
    return CloudOpsClient(base_url=base_url)


__all__ = ["CloudOpsClient", "get_client"]