Skip to main content
This page will document the code-first API in the ziro package. ziro.create_agent(...) assembles an agent from pluggable objects (an LLMAdapter, guardrail backends, BaseTool instances, a BaseStore, a BaseCheckpointSaver, and policy configs) into the frozen AgentSpec tree defined in ziro/spec.py. A SpecProfile adapts that spec to the same AgentProfile duck-type the engine consumes, so a code-first agent runs through the identical graph as a YAML one. Chatting is agent.chat("hi", user="alice"), with the user bound at chat time. ziro.profiles.load(<agent-id-or-path>) goes the other way: it parses a YAML agent folder into an AgentSpec, and is tested for equivalence against the shipped agents. The defaults are deliberately hermetic, so the same script behaves the same on two machines. A spec-driven agent reads no project config layers (only spec fields and library defaults), runs outside flavours, and surfaces zero plugins. Opt into plugins explicitly with create_agent(plugins=True), an allowlist such as plugins=["cc/x"], or a full PluginConfig; a bare string raises TypeError.
This page is in progress. See architecture for the graph the SDK builds against and agent files for the YAML equivalents of each spec field.

Architecture

The agent loop an AgentSpec is compiled into.

Agent files

The YAML side of the same configuration surface.