How to run this route from Python with the Ouro SDK.
API access requires an API key. Create one in Settings → API Keys, then set OURO_API_KEY in your environment. Install the SDK with pip install ouro-py.
POST /chemeleon/sampleParameters and request body schema for this route.
Range: 0 to
Random seed; the same seed and request give the same samples where the model allows.
unconditionalchemical_systemformulaWhat to sample: anything ('unconditional'), structures within a chemical system ('chemical_system'), or polymorphs of one formula ('formula').
A formula, e.g. 'LiCoO2'. Required for task 'formula'.
Range: 1 to 64
How many structures to return.
Elements joined by dashes, e.g. 'Li-Mn-O'. Required for task 'chemical_system'.
execute returns an action: the record of this run, with its status, response, and any assets it created.
This route is long-running. Start it without waiting, then collect the result when it's done.
By default a failed run comes back as an action with status error. Pass raise_on_error=True to raise an exception instead.
Every run is saved as an action. List yours, or read the logs of a single run. See the Python SDK reference for everything an action carries.
# Returns as soon as the run is accepted
action = route.execute(
body={
"task": "unconditional",
},
wait=False,
)
print(action.id, action.status)
# Later, even from another process
action = ouro.routes.poll_action(str(action.id), poll_interval=5, timeout=1800)
print(action.final_data)from ouro import ExternalServiceError, RouteExecutionError
try:
action = route.execute(
body={
"task": "unconditional",
},
raise_on_error=True,
)
except ExternalServiceError as exc:
# The API behind this route failed
print(exc.status_code, exc.retryable)
except RouteExecutionError as exc:
print(exc.action_id, exc.status, exc.response)
except TimeoutError as exc:
# Still running on Ouro; pick it up again later
action = ouro.routes.poll_action(exc.action_id, timeout=None)import os
from ouro import Ouro
ouro = Ouro(api_key=os.environ.get("OURO_API_KEY"))
# The ID also works, and stays the same if the route is renamed: "01fa4eea-80bd-4bcf-aa23-f11b44ce6a85"
route = ouro.routes.retrieve("mmoderwell/sample-crystal-structures-with-chemeleon-for-genbench")
action = route.execute(
body={
"task": "unconditional",
},
)
print(action.status) # "success" or "error"
print(action.final_data)route = ouro.routes.retrieve("mmoderwell/sample-crystal-structures-with-chemeleon-for-genbench")
# Your runs of this route
actions = route.read_actions()
for action in actions:
print(action.id, action.status, action.created_at)
# One run and its logs
action = ouro.routes.retrieve_action("your-action-id")
for entry in action.read_logs(chronological=True):
print(entry.level, entry.message)Part of service
Chemeleon
GenBench's sample contract with Chemeleon's composition model: formula prompts the formula in cells of 1-13 formula units (up to 40 atoms), chemical_system draws one formula per sample from the system's stoichiometries, and unconditional samples from the null text embedding. Async: 2-3.5 minutes for 32 samples on an A10G. Answers the webhook with raw, unrelaxed CIFs inline as JSON; creates no Ouro assets.
Is supplement to
Park, Hyunsoo et al. · Nature Communications · 2025
Execution
Usage
0 callsView history