Agent commands. Your AI agent uses this node in workflows. You don’t configure it directly.
Parameters
Output
stdout and stderr hold what your code prints, kept separate per batch item. Output from threads your code starts itself (threading.Thread, ThreadPoolExecutor, loop.run_in_executor) is not captured — it goes to pflow’s own streams — so return data from threads through result. Don’t wrap calls in contextlib.redirect_stdout to silence them: prints are already captured, and the redirect swaps the process-wide stream, which misroutes output when batch items run in parallel.
Type annotations
Every input variable and theresult variable must have a type annotation. pflow uses these to validate inputs before your code runs — so a wrong type gets caught immediately with a fix suggestion, not as a cryptic Python error mid-workflow.
Supported types
Supported types
Only the outer type is checked —
list[dict] validates that the value is a list, but doesn’t check whether the elements are dicts.Template placement
inputs dict get resolved before your code runs. By the time Python sees data, it’s already a native object — no parsing needed.
Bridge to workflow inputs
Workflow## Inputs / ## Outputs use canonical names. Code blocks use Python annotations.
Inputs are native objects
Upstream JSON object and array text is parsed before your code runs. If the source node produced a JSON string, declaredict or list to get real Python objects — or str to get the text exactly as produced.
A workflow input declared with a type other than
any is never parsed: it arrives as its declared type. Binding a - type: string input to a dict or list annotation is a validation error — declare the input object or array instead.
Examples
Simple transformation
Multiple inputs
${merge-sources.result.items}, ${merge-sources.result.count}.
No inputs
Using subprocess
Imports
Standard library imports work without restrictions —json, re, subprocess, pathlib, datetime.
Third-party packages work too, but they need to be installed in pflow’s environment.
Installing third-party packages
Installing third-party packages
pflow runs in an isolated environment, so uv tool (replaces the full environment — list existing extras first):A simpler way to manage code node dependencies is coming in a future release.
pip install pandas won’t work. How you add packages depends on how you installed pflow:pipx (simpler — additive, doesn’t touch existing packages):Security
External code file
For larger scripts, reference an external Python file. The file is read and used as the code block. Path is relative to the workflow file. Inside the file,__file__ is its absolute path, so Path(__file__).parent finds files next to it from any working directory. Relative paths in the code itself (open("data.json")) still resolve against the working directory. An if __name__ == "__main__": block in the file does not run — the file is a step body, not the program’s entry point.
Error handling
Errors include line numbers, the actual source line, and a suggestion for how to fix it. For example, a type mismatch looks like:
By default the node doesn’t retry — code execution is deterministic, so retrying the same code produces the same result. A step’s
retry: re-runs a body that raises or calls sys.exit.
