context. It is the whole per-request
input, and llm.run(context=context) reads everything it needs from it.
Fields
Messages
context.messages reads as plain text, which is what most code wants.
context.messages.raw keeps everything: component parts, tool steps and
attachment references. Reach for it when you need to inspect what actually
happened rather than what was said.
The user
context.user is None when no auth provider is configured. See
Authentication for how the claims are populated.
The workspace
context.workspace is this user’s scope on the /workspace volume, and it is
what cycls.DB writes to.
context.workspace.root.
Gating on environment
context.prod separates a local run from a deployment, which is the clean way to
keep billing and quota checks out of your development loop.
Respecting user switches
context.disabled_tools holds the tools this person turned off. llm.run()
already honors it. You only need to read it if you are running your own loop or
want to explain the difference to the user.
allowed_tools did not grant.
Logging with attribution
cycls.log writes one structured line that the log backend captures, with user
and chat attribution attached.
cycls logs -q or cycls sql. See
Observability.
Next
Knowledge
Workspace instructions and skills the model loads on demand.