Compute
How a Compute request is built
A Compute request has seven objects and no more. This page builds one up from the smallest useful form, and explains why a saved profile narrows your defaults but never widens what you may do.
The seven objects
A request carries seven objects. There is no eighth.
| Object | What it carries |
|---|---|
workflow | id and version — which work, at which version. |
input | Where the data is, and the frozen snapshot that identifies it. |
parameters | The typed knobs the workflow declares. |
quality | One preset. |
policy | A profile_id reference. |
output | Format, destination, and result partitioning. |
limits | deadline and maximum_price. |
They sit on top of the four ideas in workflow, profile, job, and result.
The minimum request
Two objects are enough to describe work: workflow and input.
{
"workflow": { "id": "eval.semantic_grade.v1", "version": "current-compatible" },
"input": {
"kind": "<the input kind the workflow declares>",
"adapter": "<your registered adapter>",
"location": "<your registered source reference>",
"credential_ref": "<a secret reference, never a secret>",
"snapshot": { "version_id": "<version id>", "content_sha256": "<digest>" },
"format": "<the input format>",
"item_id_field": "<the field that identifies one item>"
}
}
credential_ref is a reference. A request never carries the credential itself.
A normal request
Add the four objects that shape the outcome and its cost.
parameters are validated against the workflow's generated parameters_schema, so an unknown key is refused rather than quietly ignored. quality.preset selects how much verification runs. output says what you want back and where it goes.
limits bounds the run. Write deadline as an ISO 8601 duration, and maximum_price as a currency with a decimal amount. Set it even for a small job — it is your stated ceiling, and your quote is read against it.
Advanced invocation
policy carries a profile_id. That one reference pulls in your team's agreed defaults for quality, output, and limits, so the request you write stays short and consistent across callers.
Some clients also accept a profile= convenience string. It resolves locally into policy, quality, output, and limits before anything is sent.
It never travels as an eighth object, and nothing on the receiving side reads it. If you are reading a request off the wire, expect the seven.
Compiling is local; a job is not
lithi workflow compile runs on your own machine, as do the lithi.plan() and lithi.recommend() helpers. They validate a spec and suggest a shape. They do not quote, do not admit, and do not run paid work.
Nothing durable exists until you approve a quote and admission returns a job. A compiled spec on your disk is an input to that step, never a record of it.
What a saved profile can and cannot do
A profile narrows. It cannot widen.
It can pin a stricter quality preset, a shorter deadline, a lower maximum price, or a fixed destination. It cannot grant a scope your key does not hold, raise a spend ceiling, or add a destination nobody registered.
Where a profile and your key disagree, the narrower of the two applies. So a profile is a good place to encode team policy, and never a way around an approval.
Get it priced
A finished spec is ready to price, and pricing commits you to nothing: what a quote states and what it does not.