Utility Nodes
Utility nodes handle cross-cutting concerns: logging, debugging, rate limiting, caching, secret resolution, retry policies, and placeholder steps during workflow design.
| Node | Type | Output |
|---|---|---|
| Logger | logger | json |
| Debug Inspector | debug_inspector | json |
| Secret Resolver | secret_resolver | json |
| Rate Limit | rate_limit | json |
| Cache Read | cache_read | json |
| Cache Write | cache_write | json |
| Retry | retry | json |
| No-Op | noop | any |
Logger
Type: logger · Category: Utility
Write a structured log entry for debugging and audit trails. Use as the final node of any important branch to capture the result.
Inputs
| Name | Type | Required |
|---|---|---|
input | any | No |
Outputs
| Name | Type | Description |
|---|---|---|
result | json | { logged: true, level: text } |
Required Config
| Field | Type | Description |
|---|---|---|
message | string | Log message template. Supports {{variable}} interpolation. |
Optional Config
| Field | Type | Default | Options |
|---|---|---|---|
level | select | info | debug · info · warn · error |
includeInput | boolean | false | When true, attaches the upstream payload to the log entry. |
Example
{
"level": "info",
"message": "Digest delivered: {{$.messageId}}",
"includeInput": true
}Scenario: Audit an email delivery at the end of the weekly digest workflow.
Expected output: { "logged": true, "level": "info" }
When to Use
- At the end of any branch to capture final state.
- After communication nodes to record delivery status.
- After write operations (KV, storage, leaderboard) to confirm success.
- As the downstream of
stop_returnorerror_catchfor terminal logging.
Common Mistakes
- Placing Logger before the final delivery node — Logger should be the last step, not before
email_send. - Using
includeInput: truein high-volume pipelines — this writes the full payload to the log; omit it for rate-limited or large-array workflows.
Related Nodes
Debug Inspector · Error Catch · Email Send
Debug Inspector
Type: debug_inspector · Category: Utility
Expose upstream payload shape in manual executions. Use during workflow design to inspect what data is available at each step.
Required Config
| Field | Type | Description |
|---|---|---|
capturePaths | json | Array of paths to capture (e.g. ["$", "$.documents[0].metadata"]). |
Optional Config
| Field | Type | Default |
|---|---|---|
redactSecrets | boolean | true |
Example
{
"capturePaths": ["$", "$.documents[0].metadata"],
"redactSecrets": true
}Expected output: { "inspection": { "keys": ["documents", "summary"] } }
When to Use
- During workflow design to verify path names before writing downstream config.
- Before an
embeddingorrag_retrievalnode to check thatdocumentshas the expected shape.
Execution Notes
- Debug Inspector is a no-op in production executions — it only emits detailed inspection data in manual/development mode.
- Always remove or replace Debug Inspector before publishing a production workflow.
Related Nodes
Secret Resolver
Type: secret_resolver · Category: Utility
Resolve a named secret reference for downstream server-side nodes. Use when a node's configuration cannot use {{secrets.keyName}} inline syntax and needs the resolved value as a payload field.
Required Config
| Field | Type | Description |
|---|---|---|
secretRef | string | Secret name registered in workspace secret storage. |
Optional Config
| Field | Type | Description |
|---|---|---|
exposeAs | string | Output key name (e.g. githubToken). Defaults to secretRef. |
Example
{
"secretRef": "github-api-token",
"exposeAs": "githubToken"
}Expected output: { "githubToken": "{{resolved-secret-ref}}" } (value is masked in logs)
Execution Notes
- Resolved values are never logged, even with
loggerandincludeInput: true. - Runs in
server/workerenvironments only — secrets are not available in browser-only executions.
Related Nodes
Rate Limit
Type: rate_limit · Category: Utility
Throttle workflow items by key and limit. Use before high-volume API calls to avoid hitting external rate limits.
Required Config
| Field | Type | Description |
|---|---|---|
limit | number | Maximum requests allowed within the window. |
Optional Config
| Field | Type | Default |
|---|---|---|
key | string | Rate limit key (e.g. github-api). Defaults to the workflow id. |
windowSeconds | number | 60 |
Example
{
"key": "github-api",
"limit": 30,
"windowSeconds": 60
}Expected output: { "allowed": true, "remaining": 29 }
When to Use
- Before
github_read,http_request, or any integration that has per-minute quotas. - In
loop_mapworkflows processing many items against an external API.
Common Mistakes
- Setting
windowSecondstoo low for bursty loops — items will be dropped or delayed. - Not using
key— without a key, the limit applies globally to all workflows.
Related Nodes
Retry · Loop / Map · HTTP Request
Cache Read
Type: cache_read · Category: Utility
Read cached data by key. Use to avoid redundant expensive operations (API calls, AI generations, DB queries) within a time window.
Required Config
| Field | Type | Description |
|---|---|---|
key | string | Cache key (e.g. rss:github-blog:last-summary). |
Outputs
| Name | Type | Description |
|---|---|---|
result | json | { hit: boolean, value: any } |
Example
{ "key": "rss:github-blog:last-summary" }Expected output: { "hit": true, "value": { "summary": "..." } }
When to Use
- Before an RSS fetch or API call to return cached results when fresh data is not needed.
- Pair with
if_conditionto skip expensive steps on cache hit:$.hit === true.
Related Nodes
Cache Write · If / Condition · KV Read
Cache Write
Type: cache_write · Category: Utility
Write data to cache by key with an optional TTL.
Required Config
| Field | Type | Description |
|---|---|---|
key | string | Cache key. |
Optional Config
| Field | Type | Default |
|---|---|---|
valuePath | string | $ |
ttlSeconds | number | 3600 |
Example
{
"key": "rss:github-blog:last-summary",
"valuePath": "$.summary",
"ttlSeconds": 3600
}Expected output: { "written": true }
Related Nodes
Retry
Type: retry · Category: Utility
Retry an upstream operation branch with a configured backoff policy.
Required Config
| Field | Type | Description |
|---|---|---|
attempts | number | Maximum retry attempts. |
Optional Config
| Field | Type | Default |
|---|---|---|
backoffMs | number | 2000 |
retryOn | json | ["timeout", "rate_limit"] |
Example
{
"attempts": 3,
"backoffMs": 2000,
"retryOn": ["timeout", "rate_limit"]
}Expected output: { "attempts": 2, "succeeded": true }
When to Use
- Around
http_request,rss_feed, or any integration node that may transiently fail. - Around AI generation nodes (
text_to_image,text_to_video) that have provider-side queuing.
Related Nodes
Error Catch · Rate Limit · Wait / Delay
No-Op
Type: noop · Category: Utility
Pass input through unchanged. Use as a placeholder node while designing a workflow graph.
Optional Config
| Field | Type | Description |
|---|---|---|
label | string | Human-readable label describing intent (e.g. "placeholder while designing PR review workflow"). |
Example
{ "label": "placeholder while designing PR review workflow" }Expected output: { "output": "unchanged" } (upstream payload passes through)
When to Use
- As a placeholder to complete a graph edge during design before the real node is decided.
- As a bypass node in A/B testing branches where one branch intentionally does nothing.
Related Nodes
Debug Inspector · Stop / Return
See also: Node Catalog Index · Logic Nodes · Storage Nodes · Workflow Studio