Skip to main content
The hosted surface is a set of clients, one per noun. Each one reads EVOLVE_API_KEY from the environment, or takes { apiKey, baseUrl }. Create a key on the dashboard’s API keys page.

Start a job

datasets is a list of selectors. A bare name resolves to the active version; task_names, exclude_task_names and n_tasks narrow the task set. Every arm in agents names a model_name, and version, reasoning_effort, kwargs, preset and skills are optional. sandbox_provider picks "e2b", "daytona" or "modal". The fields are the same ones a -c config file takes on the CLI.

Wait for it

watch() returns a handle you either await, for the final job, or iterate, for each event. Pick one form per call.
The stream replays from the beginning, so attaching late loses nothing, and it resumes on its own after a disconnect. event.type narrows event.data, so the fields above are typed.

Read the result

Every list on this surface works the same way: await it for one page, iterate it to walk every page. passAtK(job) reads a finished job’s pass@k out of its stats as sorted numbers. A refused request throws EvolveApiError; see errors. A trial id is global, so trials() reaches one without the job.
artifact() takes the same names as evolve trial download --stream. Null means the trial never stored that artifact; it is a normal answer, not an error.

Download

The archive is the standard job directory, the same tree evolve job download unpacks.

Analyze

analyze() enqueues one analysis per trial and returns at once. watchAnalysis() follows the batch of analyses to its end.

The catalog

Everything else

analyses(), checks(), skills(), agents(), auth() and orgs() are built the same way. meta() fetches the platform’s capability document, the live list of harnesses, models and limits, and needs no key. hosted() builds every client from one configuration.