Skip to main content
The single argument to an agent body is 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.
Files the user sees in the files panel live under 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.
A switch can never enable a tool that 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.
Query it later with cycls logs -q or cycls sql. See Observability.

Next

Knowledge

Workspace instructions and skills the model loads on demand.