Self-contained snippets for the patterns clients actually run. All sync — for async, swap Plato → AsyncPlato and await everything.
1. Single sim
The minimum viable Plato program.
2. Pin to a specific artifact
Env.simulator(name) boots whatever artifact is configured as the sim’s example version. Not every sim has one set, and the example can change underneath you. For reproducible runs, grab an artifact ID from the sim’s Versions list in the Plato dashboard and use Env.artifact(...).
3. Multi-env
Two sims in one session. Both join a private WireGuard mesh and can reach each other at {alias}.plato.internal.
4. Full evaluation: testcase + login + evaluate
The canonical end-to-end pattern. Spin a session from a testcase, reset to start mutation logging, log into the apps, run your agent, score.
Always start scored sessions from the testcase. plato.sessions.create(testcase=...) provisions the right envs (desktop envs included), links the scoring config, and auto-resets — session.evaluate() then just works. Sessions created from envs= or artifacts= cannot be evaluated.
You need to know the testcase’s public ID (e.g. "tc_abc123") and the prompt the agent should run against — both come from the testcase’s page in the Plato dashboard.
The login call depends on whether the testcase includes a desktop env — branch on session.desktop_env.
For the agent-loop side of step 3 on desktop sessions, see Computer Use → Agent Loop Example.