<tool>_<extension> variant appears alongside it. You load the extension’s module, then attach it to a tool — from the manifest or at runtime.
Load the extension module
Name each extension module underextensions_modules. Importing the module runs its registration, adding the extension to the global catalog.
manifest.yml
Attach it to a tool
Attach an extension in the manifest with theextensions map on a tools entry. The map is keyed by tool name; a value is one combo ([cache]) or a list of combos. A stacked combo [[a, b]] layers both onto one branch.
manifest.yml
extensions map only attaches — it never selects a tool. A mapped tool that is absent from the selected set raises loudly.
Or attach at runtime
Apply a tool’s full combo list at runtime. Each--combo is one combo, written as a JSON array of extension elements; repeat it to author several combos at once. An element is a bare extension name or a {"name", "config"} object binding author config. Passing no --combo clears the tool’s extensions.
A wrapper presents the wrapped tool’s input schema unchanged apart from its own control kwargs; a transformer presents its own composed schema. Stacked extensions apply left to right, so
[cache, batch] produces batch(cache(tool)).See also
- Tools and extensions — the wrapper / transformer kinds and their schema rules.
- The standard toolbox — the shipped default extensions.
- Author an extension — build your own wrapper or transformer.
- CLI reference — the full
tai extensionsandtai tools applysurface.

