
No names to invent, no paths to remember.
>>> from machinable import get
>>> get("train", {"lr": 0.1}).launch()
Train [9eBFve] · finished in 12s
▋A typed pydantic model with named variants and computed values.
>>> class Train(Interface):
... class Config(BaseModel):
... optimizer: str = "sgd"
... batch_size: int = 256
... lr: float = "scaled(0.1)"
...
... def config_scaled(self, base):
... return base * self.config.batch_size / 256
...
... def version_adam(self):
... return {"optimizer": "adam", "lr": 1e-3}
▋Python, terminal, or notebook: the same expression, the same records. Integrations bring your stack.
>>> get("train").all()
Interfaces <7>
>>> get("train").all().map(lambda t: t.loss())
[0.087, 0.081, 0.079, 0.091, 0.084, 0.088, 0.082]
▋Results live in a durable home; remote backends mirror them and fetch on demand.
Learn more →ProvenanceEvery run captures the code state that produced it: commit, diff, and environment.
Learn more →Relations & lineageRuns declare what they use; lineage stays queryable in both directions.
Learn more →Scopes & groupingSeeds, trials, and folds share a config yet stay distinct and findable via predicates.
Learn more →API server & live viewServe projects over HTTP and watch runs live from a terminal UI.
Learn more →Agents & MCPAgents drive via MCP; contracts tell them what to write next; you can stay in the loop easily.
Learn more →pip install machinable