Skip to main content
An agent is a standalone object with its own id. It can answer on several senders, and it can exist with none while you build it.
kind reflects what the agent actually is — an agent named for voice whose voice block is missing reads as text, which is usually the thing you wanted to know.

Test an agent

The command you will use most. It runs the real prompt, model and knowledge base and prints what the agent would reply. Nothing is delivered, nothing is charged, no execution is logged — so it is safe on every edit.
Multi-turn:
Read the warnings. A dry run cannot prove everything, and it tells you what it could not: an agent that is still disabled, tools its channels will never call, flows it did not evaluate, contact metadata that exists live but not here. Treat them as part of the result — a good answer here is not proof the agent works on a real channel.

Start from a factory agent

pull writes a real TypeScript project: index.ts with the agent and its skills, a tsconfig.json, and @zavudev/functions as a dependency so your editor and tsc resolve it. Edit it freely — the code is the source of truth and zavu deploy reconciles whatever it declares.

Booking agents

Kepler, Hopper and Fermi book meetings. By default they scaffold against a generic webhook — an HTTPS endpoint you build and host that returns open slots and books them. Until it exists the agent cannot book, and says so rather than inventing a time. Point it at Cal.com instead and it works with an API key:
pull then lists every secret the agent needs, with a hint for each:
The Cal.com client only reports a booking when Cal.com accepted it. An event type that requires confirmation comes back pending, and telling a caller they are booked at that point is the worst outcome on that line. zavu agents init walks the same path interactively: pick or create a sender, pick an agent, get ready to deploy.

Create one from scratch

Use --prompt-file for anything longer than a line — terminal paste mangles newlines. --data / --file take a full JSON body for advanced fields.
An agent is created disabled and answers nobody until you turn it on. Pass --enabled true on create, or zavu agents update --sender <id> --enabled true later. The CLI says so when it happens.

Connect senders

A sender is the identity a conversation happens on. An agent can answer on several; a sender answers with at most one agent.
Connecting a sender that is already in use is rejected, naming the agent that holds it — otherwise you would have an agent that looks connected and never receives a message.

Tools

Tools are offered to the model on voice, and inside a flow’s tool step. The plain text path does not call tools — a text agent asked to look something up answers “let me check that, one moment” and then does nothing. See how agents work.
Tools declared in code with defineTool are managed by their function: they appear here read-only and are changed by redeploying. To run a handler in isolation, without deploying:

Knowledge bases

Processing takes a few seconds. Verify retrieval actually fires with agents test — it reports how many chunks the answer used.
A prompt that says “only state what the documentation returns” with no documents attached does not refuse. It invents. Attach the documents before relying on that instruction.

Flows

A flow is a deterministic sequence with a trigger. Steps take a config object; a tool step resolves its tool through config.toolId, which holds the tool’s name. A flow naming a tool the agent does not have is rejected at creation, listing the ones it does have. Flows are not evaluated by agents test — they run on a real message, and agents test says so when the agent has any.

Inspect what happened

executions get carries errorMessage and responseText — the place to look when a live reply went wrong. reset-thread closes the conversation and any flow session for one contact so the next inbound starts fresh. Dry runs do not appear in stats or executions; they are not executions.

Calls

calls get prints the conversation including tool calls. It is the only record of what the agent actually said, and the first place to look after a call went wrong.
calls create places a real outbound call, billed per connected minute plus telephony. --greeting, --language and --max-minutes override the agent’s configuration for that call only.