File size: 1,899 Bytes
b7e6f83
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from __future__ import annotations

from dataclasses import dataclass
from typing import Any

from persistentpoker_bench.adapters.litellm_adapter import (
    LiteLLMConfig,
    extract_usage_summary,
    request_decision_via_litellm,
)
from persistentpoker_bench.hand_runner import DecisionAgent, DecisionEnvelope
from persistentpoker_bench.prompting import PromptBundle
from persistentpoker_bench.retries import RetryPolicy


@dataclass(frozen=True, slots=True)
class RuntimeDecisionEnvelope(DecisionEnvelope):
    provider: str
    model_id: str
    latency_seconds: float
    usage: dict[str, Any]


@dataclass(slots=True)
class LiteLLMRuntimeAgent(DecisionAgent):
    provider: str
    config: LiteLLMConfig
    retry_policy: RetryPolicy | None = None

    def decide(
        self,
        *,
        prompt_bundle: PromptBundle,
        game_snapshot: dict[str, Any],
        legal_actions_snapshot: dict[str, Any],
        player_index: int,
        hand_state: Any,
        persistent_pool: Any,
    ) -> RuntimeDecisionEnvelope:
        result = request_decision_via_litellm(
            prompt_bundle=prompt_bundle,
            config=self.config,
            retry_policy=self.retry_policy,
        )
        usage = extract_usage_summary(result.raw_response)
        return RuntimeDecisionEnvelope(
            decision=result.decision,
            raw_text=result.raw_text,
            parse_mode=result.parse_mode,
            attempts=result.attempts,
            provider=self.provider,
            model_id=self.config.model,
            latency_seconds=result.latency_seconds,
            usage=usage,
        )


def runtime_envelope_to_dict(envelope: RuntimeDecisionEnvelope) -> dict[str, Any]:
    return {
        "provider": envelope.provider,
        "model_id": envelope.model_id,
        "latency_seconds": envelope.latency_seconds,
        "usage": envelope.usage,
    }