File size: 2,868 Bytes
bcf9268
 
 
 
 
 
467a609
 
bcf9268
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
467a609
 
 
bcf9268
 
 
467a609
 
 
 
 
bcf9268
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from __future__ import annotations

import argparse
import json

from glass_bridge.client import OpenEnvGlassBridgeClient
from glass_bridge.models import AgentAction, ResetRequest, StepRequest
from glass_bridge.policies import build_tournament_glass_bridge_population


def main() -> None:
    parser = argparse.ArgumentParser()
    parser.add_argument("--base-url", default="http://127.0.0.1:8000")
    parser.add_argument("--seed", type=int, default=7)
    parser.add_argument("--initial-players", type=int, default=16)
    parser.add_argument("--first-round-steps", type=int, default=18)
    parser.add_argument("--max-rounds", type=int, default=25)
    parser.add_argument("--max-turns", type=int, default=9600)
    parser.add_argument(
        "--adaptation-kind",
        choices=["none", "truth_scaled_by_reputation"],
        default="truth_scaled_by_reputation",
    )
    args = parser.parse_args()

    client = OpenEnvGlassBridgeClient(base_url=args.base_url)
    try:
        reset_response = client.reset(
            ResetRequest(
                seed=args.seed,
                initial_players=args.initial_players,
                first_round_num_steps=args.first_round_steps,
                max_rounds=args.max_rounds,
                share_rates=[0.0, 0.25, 0.5, 0.75, 1.0],
                truth_rates=[0.0, 0.25, 0.5, 0.75, 1.0],
                llm_model_pool=["qwen3.5"],
            )
        )
        result = reset_response.result
        policies = build_tournament_glass_bridge_population(
            result.info.strategy_profiles,
            seed=args.seed,
            adaptation_config={"kind": args.adaptation_kind},
        )
        turn_idx = 0

        while not result.done and turn_idx < args.max_turns:
            actions = {}
            for agent_name, observation in result.observations.items():
                policy_action = policies[agent_name].select_action(observation.model_dump(mode="python"))
                actions[agent_name] = AgentAction.from_policy_output(policy_action)

            step_response = client.step(StepRequest(session_id=reset_response.session_id, actions=actions))
            result = step_response.result
            turn_idx += 1

        if not result.done:
            raise RuntimeError(f"Environment did not terminate within {args.max_turns} turns")

        payload = {
            "session_id": reset_response.session_id,
            "turns": turn_idx,
            "winner": result.info.winner,
            "winner_strategy": result.info.winner_strategy,
            "rounds_played": result.info.round_idx,
            "events": result.info.events,
            "final_phase": result.info.phase,
            "active_agents": result.info.active_agents,
        }
        print(json.dumps(payload, indent=2))
    finally:
        client.close()


if __name__ == "__main__":
    main()