Quickstart
agent.py
Why use unmute for this
The results are small and frozen, andunmute_core.tasks names them. Your code can build the same JSON the adapters send, so a test or a custom host reads what the model reads.
What the model reads when a task runs
All of them are frozen. An unknown field raises a
ValidationError.
What a step hears of the call
TaskSpec.history sets what a step opens on: messages (default), full,
last_n, summary or reset. A handoff takes the same values. Handoffs
explains each one.
include_tool_calls: falseleaves tool calls and results out offullandlast_n.last_nneedsmax_messages, from 1 to 200, and any other history refuses it.- A
summarystep asks for its summary as it opens. A summary that fails gives the stepmessages. - In an
isolatedgroup, every step starts fresh, whatever itshistory.
Placeholder names
A plan or a spec that does not fit raisesValueError when it is built.
A native model call has no limit on a placeholder name. A model call that fills the prompt on its own side can name a limit in variable_key_max. The SLNG Context Router names 64. The check runs at build, against the call’s model.
- A placeholder name becomes a template-variable key.
a.bisa__b. - When the model call names a limit, a key over it is refused, with a message that names the placeholder.
- The check covers a task’s instructions, and the agent’s main prompt when the adapter builds the agent.
- A model call with no
variable_key_max, like a framework’s own LLM plugin, checks nothing.
Troubleshooting
A placeholder name is refused when the agent is built
The model call names avariable_key_max, and the key of a placeholder is longer.
Fix: shorten the State value name that the placeholder reads. a.b counts as a__b.
In the salon tutorial: Book step by step.
Every argument: Tasks reference.
Where to go next
Handoffs
What the next agent hears when a step hands off.
Your first task
Define a task and check it with TaskPlan.
Router model call
The model call that names a placeholder limit.