Documentation Index
Fetch the complete documentation index at: https://docs.plato.so/llms.txt
Use this file to discover all available pages before exploring further.
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.
from plato.v2 import Env, Plato
plato = Plato()
session = plato.sessions.create(envs=[Env.simulator("espocrm")])
try:
session.reset()
print("Public URLs:", session.get_public_url())
finally:
session.close()
plato.close()
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(...).
session = plato.sessions.create(envs=[Env.artifact("artifact-abc123")])
3. Multi-env
Two sims in one session. Both join a private WireGuard mesh and can reach each other at {alias}.plato.internal.
session = plato.sessions.create(envs=[
Env.simulator("espocrm", alias="crm"),
Env.simulator("gitea", alias="git"),
])
try:
session.reset()
crm = session.get_env("crm")
git = session.get_env("git")
print("Git reachable from CRM at:", git.internal_hostname)
finally:
session.close()
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.
Start sessions from a testcase whenever you can. plato.sessions.create(testcase=...) provisions the right envs, links the scoring config, and auto-resets — session.evaluate() then just works. Sessions created from envs= need manual reset() and link_testcase(...) before evaluate() will score.
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.
from playwright.sync_api import sync_playwright
from plato.v2 import Plato
plato = Plato()
# From the testcase's page in the Plato dashboard:
testcase_id = "tc_abc123"
prompt = "..." # the task instructions you'll give to the agent
session = plato.sessions.create(testcase=testcase_id)
desktop = session.desktop_env
try:
session.reset() # 1. start mutation logging
if desktop:
desktop.sdk.login(session) # 2a. desktop session
else:
with sync_playwright() as p: # 2b. app-sim session
browser = p.chromium.launch()
session.login(browser)
# 3. ... run your agent against `prompt` here ...
result = session.evaluate() # 4. score
# For OUTPUT scoring: result = session.evaluate(value={"answer": "..."})
print(f"success={result.success} score={result.score}")
finally:
session.close()
plato.close()
For the agent-loop side of step 3 on desktop sessions, see Computer Use → Agent Loop Example.