POST /v1/condition/session hands you the prompt. It composes the subject’s identity, their current mode of thinking and a digest of recent organization activity into one system prompt you paste into Claude, GPT, or a local model. One identity, any LLM.
Before you start
A key with read
Conditioning is a read. Every key can do it.
Enough history
A pack composed over an empty graph is thin. Ingest first.
An LLM you control
You inject the prompt yourself. Exo does not call your model.
The shortest call that works
200 OK
cwd, userId and orgId are required by the schema because this route began as a coding-agent session hook. They do not select the subject. The effective subject comes from your API key, or from the X-Exo-Subject header when you send one. Send the body fields, and send the header when you mean a different person.Reading the pack
userVoiceHint is null until there is enough of the subject’s own writing to measure. Exo withholds the voice profile rather than guessing at it, so treat null as “no voice guidance yet”, not as an error. See ConditioningPack and VoiceProfile.
usage.llmInputTokens and llmOutputTokens are null because composing the pack is a set of database reads with no model call. They exist so that a future builder version that does spend tokens can report them in the same place.
Injecting the pack
The pack is designed to be dropped in as the system message, ahead of your own instructions.Caching
RespectexpiresAt. Composing on every message wastes read units and gains nothing, because the underlying identity moves on the scale of sessions, not turns.
basin.shifted event, which is Exo telling you the subject’s mode of thinking moved. See Reacting to change.
Agents that build their own prompts
If your agent assembles context itself and does not want a whole system prompt, usePOST /v1/condition/scaffold. It wraps one prompt in the subject’s cognitive scaffold and tells you which knowledge-graph nodes shaped it.
200 OK
prompt accepts up to 100,000 characters.
Conditioning on behalf of a subject
AddX-Exo-Subject, exactly as on every other route.
When it goes wrong
Next
ConditioningPack and VoiceProfile
Every field, and why the voice profile is withheld rather than guessed.
Reacting to change
Invalidate a cached pack the moment the subject’s thinking shifts.