- OPERATORS
- CONTROLLERS
Any
v1.0.0newany is a dynamic host operator: point it at a Python module and it rebuilds its custom parameters, DATs, lifecycle callbacks, and optional agent tools around that module. Use it when you want a reusable LOP surface for a small custom behavior without creating a dedicated packaged operator.
What It Does
Section titled “What It Does”The operator copies a module from a file or DAT into its internal module DAT, validates it, then loads the module into the COMP. The loaded module can add custom parameter pages, create table/text/input DATs, promote callbacks, preserve matching parameter values across module swaps, and optionally publish tools for an agent workflow.
The Module Library section can scan included modules plus user, project, or custom folders. Included starter modules currently cover text editing, state inspection, and preset morphing.
Typical Workflow
Section titled “Typical Workflow”- On the Any page, set Source to File or DAT.
- For a file module, choose Module File and optionally enable Hot Reload while editing. For a DAT module, choose Module DAT.
- Pulse Reload after changing a cached file or DAT source, or use Scan Modules, Module, and Load Module to load from the module library.
- Inspect Moduleinfo and the operator’s custom pages/DATs after the module loads.
- If the module exposes tools, choose Tool Preset to turn them off, expose all of them, or use custom tool toggles.
Inputs And Outputs
Section titled “Inputs And Outputs”- Inputs: No fixed connectors. A loaded module can create its own input DATs.
- Outputs: No fixed connectors. A loaded module can create table or text DATs inside the COMP for downstream use.
Agent Tool Use
Section titled “Agent Tool Use”any exposes GetTool() when the loaded module declares tools. The user-facing capability depends on the module. With the included text editor module, agents can read DAT/file content, list TD COMP children, replace exact strings, insert text, create DATs/files, and undo the last edit, subject to the Tool Preset and any enable toggles.
Works Well With
Section titled “Works Well With”agent: Lets an agent call the tools supplied by the loaded module.tool_dat: Useful when the module’s tool surface reads or writes DAT content.tool_op_context: Pairs well with modules that inspect or edit parts of the TouchDesigner network.
Gotchas
Section titled “Gotchas”- Parameters, pages, tools, and DATs are dynamic. Swapping modules can change the operator surface immediately.
- Tools are available only after a module that declares tools is loaded.
- Hot Reload applies to file modules only. DAT sources are copied into the internal module DAT when loaded.
- Module Library scanning depends on the selected Library Source. User library discovery falls back to the project
.lops/modulesfolder when the shared Python venv path is not available. - Module validation errors and syntax errors are reported in Moduleinfo and the operator log; the module must at least declare a valid name.
Parameters
Section titled “Parameters”op('any').par.Status Str - Default:
"" (Empty String)
op('any').par.Modulefile File - Default:
"" (Empty String)
op('any').par.Moduledat DAT - Default:
./starter_module_text_editor__py
op('any').par.Hotreload Toggle - Default:
False
op('any').par.Reload Pulse - Default:
False
op('any').par.Moduleinfo Str - Default:
"" (Empty String)
op('any').par.Customlibrary Folder - Default:
"" (Empty String)
op('any').par.Scanmodules Pulse - Default:
False
op('any').par.Loadfromlibrary Pulse - Default:
False
op('any').par.Modulescount Str - Default:
"" (Empty String)
op('any').par.Openlibrary Pulse - Default:
False
Editor
Section titled “Editor”op('any').par.Target Str - Default:
"" (Empty String)
op('any').par.Rootdir Folder - Default:
"" (Empty String)
op('any').par.Rootcomp COMP - Default:
"" (Empty String)
op('any').par.Reloadtarget Pulse - Default:
False
op('any').par.Autoread Toggle - Default:
True
op('any').par.Enableread Toggle - Default:
True
op('any').par.Enablels Toggle - Default:
True
op('any').par.Enablestrreplace Toggle - Default:
True
op('any').par.Enableinsert Toggle - Default:
True
op('any').par.Enablecreate Toggle - Default:
True
op('any').par.Enableundo Toggle - Default:
True
Changelog
Section titled “Changelog”v1.0.02026-05-02
- added three-tier module library (user/project/custom) with scan, menu, and load - added bundled starter module discovery via tagged DATs - added parameter ordering for Any page layout - added extensionParExec callback target self-repair - added module DAT tag-based cleanup on module swap - updated category to Controllers
- Host operator that loads a Python module and becomes whatever that module defines - Function pattern and class pattern (Logic) module support - Diff-based parameter sync from module declarations - DAT creation from module dats declaration (table, text, input) - Tool discovery with GetTool, per-tool toggles, preset menu (off/custom/full) - Module-declared tool gating vs host-generated toggles - Promoted method binding from module to TD extension system - Hot reload (file sync) and manual reload for module source - Module swap with parameter state preservation across reloads - Ergonomic surface for module authors (ext.log, ext.par, ext.table, ext.run_async, ext.api_call) - Teaching errors: syntax errors, validation, and load failures show the fix not the stack - Dynamic __getattr__ routing for onPar callbacks and promoted methods - Category: core, release level: prod
- Initial any structure
- Initial commit