${kind.ref_name}, then run the pipeline.
Everything lives in one file, math.yaml, with resources separated by ---.
1. Declare the tool
Atool is a callable function an agent can invoke. The only schema-required field is permission; to actually run, a tool also needs a binding and a source_path pointing at its implementation.
math.yaml
binding.python.function uses module:function format — here, main() in calculator.py. source_path is a directory holding the Python file(s), a schema.yaml, and an optional requirements.txt. Paths are resolved relative to the config file’s directory.2. Declare the agent
Theagent references the tool by ref with ${tool.calculator}. wxctl turns that reference into a dependency edge, so the tool is created before the agent and the agent receives the tool’s real ID at execution time. An agent requires name, description, style, and llm.
math.yaml
llm field accepts a plain model name (no dependency) or a ${model.<ref>} reference to a model resource you also declare. style controls reasoning: default is standard conversational, react enables step-by-step Reasoning + Acting, planner enables multi-step task decomposition.
3. Declare a test
Akind: test resource exercises a deployed agent. Each entry in turns sends a chat message; expect_tools asserts which tools the agent should call, and expect_answer describes the answer to look for. Tests run only under wxctl test — they are ignored by plan, apply, and destroy.
math.yaml
4. Validate, plan, apply, test
Preview the plan
A dry run — see what would be created, in dependency order, without making changes:
wxctl destroy -f math.yaml tears the resources down in reverse-dependency order.
Next steps
Resource kinds
Every kind wxctl supports, with fields and endpoints.
Troubleshooting
Logging, concurrency, and color environment variables.

