Built-in node catalog
Use built-in nodes to connect data sources, transform records, call model providers, deliver notifications, and control workflow execution. Each node exposes named input/output ports and a configuration contract. This catalog documents all 54 node types registered in the current SDK, including preview and currently affected capabilities.
On this page
Choose and configure an integrationRun a node locallyCommon execution considerationsSources and data exchangeAzure Blob IngestBigQuery ReaderDocument ParserGCS IngestHTTP FetchKafka ConsumerMongoDB ReaderMySQL ReaderMySQL WriterPostgres ReaderRedshift ReaderS3 IngestSFTP IngestSnowflake ReaderTransformation and data qualityAggregatorColumn MapperData FilterData JoinData NormalizerData QualityDeduplicatorPandas TransformSchema ValidatorSQL TransformText ChunkerLanguage models and promptsClaude SummaryGPT-4 ClassifyLLM CompletionLLM RouterOpenAI EmbeddingsPrompt TemplateStructured OutputVector storage and searchChroma StoreOpenSearch Writepgvector WritePinecone WriteQdrant WriteVector SearchWeaviate InsertNotifications and destinationsEmail SendS3 WriteSlack AlertWebhook POSTWorkflow controlBatch ProcessorConditional BranchError HandlerHuman ApprovalLoopMergeSubflowWait / DelayPython, shell, and containersDocker ContainerPython FunctionShell CommandTroubleshoot a node integrationChoose and configure an integration
- Find the node below and check its availability and known limitations.
- Provision your destination/source and grant the credentials only the access the operation needs. Network access from the execution environment is required.
- Store credentials with secrets. A configuration value such as
secret:postgres_connectionis a reference, not the credential itself. - Install required client packages in the execution environment.
dagy[nodes]includes the newer connector clients but does not install every dependency listed here. Use dependency packages for deployed workflows. - Supply configuration, connect the exact port IDs, and run against a small representative input. Inspect output counts, error details, and provider responses before using production data.
Saved connector records and cloud-account setup are separate from node configuration. A saved cloud connection does not automatically supply credentials to every built-in node. Read saved connectors and cloud account setup for their supported boundaries.
The API exposes the installed catalog through GET /nodes/registry; dagy nodes list --format json also retrieves it after authentication. Model names and client configuration defaults below reflect the product code, not a guarantee that an external provider still offers that model or accepts every client version.
Run a node locally
This example uses the working text parser and performs no network calls:
import asyncio
from dagy.nodes import ExecutionContext, node_registry
node_registry.discover_builtin()
node_registry.sync_from_subclasses()
node = node_registry.create_instance("document_parser", config={"format": "text"})
result = asyncio.run(node.run(ExecutionContext(upstream_results={"file_in": "Hello, Dagy"})))
assert result.success, result.error
print(result.outputs["text_out"])Expected output is Hello, Dagy. For another node, replace its type, config, and input mapping using the entry below. Config examples contain illustrative source names and secret references; replace them with resources you control. They do not create provider accounts, resources, or secret values.
Required fields must be supplied when constructing a node directly, even where the configuration metadata also declares a default. Ports describe compatibility; validate the actual payload shape. Successful results use success=true and an outputs map keyed by port ID. Failed results expose success=false, error, and error_type.
Common execution considerations
- The base node timeout defaults to 300 seconds.
_timeout_secondscan be configured from 1 to 3,600 seconds, subject to the chosen hosted runtime's limits. Set provider-specific network timeouts too. - Node graphs pass values only from successful nodes and skip required inputs that receive no value. An
error_outport on a failed node is not automatically routed to a downstream handler. Use deliberate successful routing for validation paths. - A production label is catalog metadata, not a compatibility or service-availability guarantee. The schema validator, Pandas transform, SQL transform, deduplicator, and PDF/DOCX/HTML parser paths have confirmed execution issues in this version; use the alternatives described below.
- Missing dependencies produce import errors. Missing secret references, invalid config, source permission failures, rate limits, and provider response errors require different remedies; inspect
error_typeand the provider message. Retried writes and notifications may duplicate side effects. - Unless stated otherwise, built-in ingestion operates on a bounded in-memory batch. It does not supply automatic pagination, change-data capture, or a persisted ingestion checkpoint.
Sources and data exchange
| Node | Type | Catalog availability |
|---|---|---|
| Azure Blob Ingest | azure_blob_ingest | production |
| BigQuery Reader | bigquery_reader | production |
| Document Parser | document_parser | production |
| GCS Ingest | gcs_ingest | production |
| HTTP Fetch | http_fetch | production |
| Kafka Consumer | kafka_consumer | production |
| MongoDB Reader | mongodb_reader | production |
| MySQL Reader | mysql_reader | production |
| MySQL Writer | mysql_writer | production |
| Postgres Reader | postgres_reader | production |
| Redshift Reader | redshift_reader | production |
| S3 Ingest | s3_ingest | production |
| SFTP Ingest | sftp_ingest | production |
| Snowflake Reader | snowflake_reader | production |
Azure Blob Ingest
Type: azure_blob_ingest. Catalog availability: production.
Read blobs from Azure Blob Storage containers.
Prerequisites and behavior: Supply a secret containing an Azure connection string, or account_url and an optional credential secret. Grant list/read permissions for the container. Returns a list of parsed blob values plus metadata; default maximum is 100 files. It does not automatically use a saved cloud-account connection.
Python dependency: azure-storage-blob
Ports
| Port | Direction | Data types | Required input | Description |
|---|---|---|---|---|
trigger_in | inbound | any, trigger | No | Optional trigger signal to start ingestion |
data_out | outbound | binary, dataframe, json | Not applicable | Ingested data from Azure Blob Storage |
metadata_out | outbound | json | Not applicable | Azure blob metadata (name, size, last_modified) |
error_out | outbound | error, json | Not applicable | Error details if operation fails |
Configuration
| Field | Type | Required | Default | Options and constraints |
|---|---|---|---|---|
container | string | Yes | Not set | None |
prefix | string | No | Not set | None |
account_url | string | No | Not set | Required when using a credential/account key instead of a full connection string |
connection_ref | secret_ref | No | Not set | Azure Storage connection string secret; or set account_url + credential_ref |
credential_ref | secret_ref | No | Not set | None |
file_format | select | Yes | "json" | Choices: json, jsonl, csv, text, binary |
max_files | number | No | 100 | Minimum 1 |
Example configuration
{
"container": "incoming",
"prefix": "orders/",
"connection_ref": "secret:azure_connection",
"file_format": "json"
}BigQuery Reader
Type: bigquery_reader. Catalog availability: production.
Query Google BigQuery.
Prerequisites and behavior: Uses application-default Google credentials in the execution environment. Grant query execution and dataset read access in the selected project. This node exposes no service-account secret field. Results are materialized as a list of records; constrain query size explicitly. Cloud account setup does not by itself configure these runtime credentials.
Python dependency: google-cloud-bigquery
Ports
| Port | Direction | Data types | Required input | Description |
|---|---|---|---|---|
trigger_in | inbound | any, trigger | No | Optional trigger to start query |
data_out | outbound | dataframe, json | Not applicable | Rows from BigQuery query |
error_out | outbound | error, json | Not applicable | Error details if operation fails |
Configuration
| Field | Type | Required | Default | Options and constraints |
|---|---|---|---|---|
project | string | Yes | Not set | None |
query | code | Yes | Not set | None |
Example configuration
{
"project": "your-project",
"query": "SELECT order_id, amount FROM `your-project.commerce.orders` LIMIT 100"
}Document Parser
Type: document_parser. Catalog availability: production.
Parse PDF, DOCX, HTML, Markdown, and plain text files to extract structured text content.
Prerequisites and behavior: Plain text and Markdown parsing work without optional document clients. PDF, DOCX, and HTML paths currently fail with TypeError before parsing; installing their dependencies does not fix that execution issue. The extract_images option does not currently produce extracted images. file_in expects content bytes or text, not a remote URL to download.
Python dependency: Text/Markdown need no extra client; PDF: pypdf, DOCX: python-docx, HTML: beautifulsoup4; see execution issue below
Ports
| Port | Direction | Data types | Required input | Description |
|---|---|---|---|---|
file_in | inbound | binary, document | Yes | Binary file content (PDF, DOCX, HTML, Markdown, or text) |
text_out | outbound | document, string | Not applicable | Extracted text content from the document |
metadata_out | outbound | json | Not applicable | Document metadata (format, pages, encoding, etc.) |
error_out | outbound | error, json | Not applicable | Error details if parsing fails |
Configuration
| Field | Type | Required | Default | Options and constraints |
|---|---|---|---|---|
format | select | Yes | "auto" | Choices: auto, pdf, docx, html, markdown, text; Document format. Use 'auto' to detect from content or magic bytes. |
extract_images | boolean | No | false | If true, extract embedded images as base64-encoded data in metadata |
page_range | string | No | Not set | For PDF: extract specific pages (e.g., '1-10' or '1,3,5'). Leave empty for all pages. |
Example configuration
{
"format": "text"
}GCS Ingest
Type: gcs_ingest. Catalog availability: production.
Read objects from Google Cloud Storage buckets.
Prerequisites and behavior: Use credentials_ref for a JSON service-account credential secret or rely on application-default credentials. Requires list/read access to the bucket. Returns a list of file values plus object metadata; it does not flatten multiple row files or maintain a checkpoint. Default maximum is 100 successfully parsed files.
Python dependency: google-cloud-storage; google-auth for a service-account secret
Ports
| Port | Direction | Data types | Required input | Description |
|---|---|---|---|---|
trigger_in | inbound | any, trigger | No | Optional trigger signal to start ingestion |
data_out | outbound | binary, dataframe, json | Not applicable | Ingested data from GCS |
metadata_out | outbound | json | Not applicable | GCS object metadata (name, size, updated) |
error_out | outbound | error, json | Not applicable | Error details if operation fails |
Configuration
| Field | Type | Required | Default | Options and constraints |
|---|---|---|---|---|
bucket | string | Yes | Not set | None |
prefix | string | No | Not set | None |
file_format | select | Yes | "json" | Choices: json, jsonl, csv, text, binary |
project | string | No | Not set | None |
credentials_ref | secret_ref | No | Not set | Optional service-account JSON secret; falls back to ambient GCP credentials when unset |
max_files | number | No | 100 | Minimum 1 |
Example configuration
{
"bucket": "your-source-bucket",
"prefix": "orders/",
"file_format": "json",
"credentials_ref": "secret:gcs_service_account"
}HTTP Fetch
Type: http_fetch. Catalog availability: production.
Fetch data from HTTP endpoints.
Prerequisites and behavior: Returns response_out as parsed JSON, text, or bytes, plus response headers. HTTP status 400 or greater returns a failed result with an HTTP-specific error type. Network requests have a configurable timeout, default 30 seconds. Headers are literal configuration values; this node has no dedicated authentication-secret field. Avoid storing tokens directly in saved graph configuration.
Python dependency: aiohttp
Ports
| Port | Direction | Data types | Required input | Description |
|---|---|---|---|---|
trigger_in | inbound | any | No | Optional trigger or request body |
response_out | outbound | binary, json, string | Not applicable | HTTP response body |
headers_out | outbound | json | Not applicable | HTTP response headers |
error_out | outbound | error, json | Not applicable | Error details if operation fails |
Configuration
| Field | Type | Required | Default | Options and constraints |
|---|---|---|---|---|
url | string | Yes | Not set | None |
method | select | Yes | "GET" | Choices: GET, POST, PUT, DELETE |
headers | json | No | Not set | None |
body | textarea | No | Not set | None |
timeout | number | No | 30 | Minimum 1; Maximum 300 |
Example configuration
{
"url": "https://your-service.example.com/orders",
"method": "GET",
"timeout": 30
}Kafka Consumer
Type: kafka_consumer. Catalog availability: production.
Consume from Kafka topics.
Prerequisites and behavior: Consumes JSON message values with earliest offset reset and automatic offset commits. Returns records containing key, value, partition, offset, and timestamp. Default maximum is 100 messages. The node can wait for more messages until the node timeout; there is no implemented ten-second idle deadline. SASL/TLS options are not exposed. It is a bounded consumer step, not a managed streaming service.
Python dependency: aiokafka
Ports
| Port | Direction | Data types | Required input | Description |
|---|---|---|---|---|
trigger_in | inbound | trigger | No | Optional trigger to start consuming |
messages_out | outbound | json, list | Not applicable | Consumed Kafka messages |
error_out | outbound | error, json | Not applicable | Error details if operation fails |
Configuration
| Field | Type | Required | Default | Options and constraints |
|---|---|---|---|---|
brokers | string | Yes | Not set | None |
topic | string | Yes | Not set | None |
group_id | string | Yes | Not set | None |
max_messages | number | No | 100 | Minimum 1 |
Example configuration
{
"brokers": "broker.example.com:9092",
"topic": "orders",
"group_id": "dagy-orders",
"max_messages": 100
}MongoDB Reader
Type: mongodb_reader. Catalog availability: production.
Query MongoDB collections.
Prerequisites and behavior: The connection secret is a MongoDB URI. Use a user with read access to the database and collection. filter and projection accept JSON objects. Default limit is 1,000; this is a bounded query, not a change-stream subscription.
Python dependency: pymongo
Ports
| Port | Direction | Data types | Required input | Description |
|---|---|---|---|---|
trigger_in | inbound | any, trigger | No | Optional trigger signal to start ingestion |
filter_in | inbound | json | No | Optional MongoDB query filter (dict) overriding config filter |
data_out | outbound | json, list | Not applicable | Documents returned from the collection |
error_out | outbound | error, json | Not applicable | Error details if operation fails |
Configuration
| Field | Type | Required | Default | Options and constraints |
|---|---|---|---|---|
connection_ref | secret_ref | Yes | Not set | mongodb:// or mongodb+srv:// URI |
database | string | Yes | Not set | None |
collection | string | Yes | Not set | None |
filter | json | No | Not set | None |
projection | json | No | Not set | None |
limit | number | No | 1000 | Minimum 1 |
Example configuration
{
"connection_ref": "secret:mongodb_connection",
"database": "commerce",
"collection": "orders",
"filter": {
"status": "paid"
},
"limit": 1000
}MySQL Reader
Type: mysql_reader. Catalog availability: production.
Query MySQL / MariaDB databases.
Prerequisites and behavior: Use a database user allowed to execute the query and a password secret. The params_in port supplies query parameters. fetch_size limits returned rows, not an automatically paginated dataset. Configure source networking and TLS requirements; ssl defaults to false.
Python dependency: pymysql
Ports
| Port | Direction | Data types | Required input | Description |
|---|---|---|---|---|
trigger_in | inbound | any, trigger | No | Optional trigger signal to start ingestion |
params_in | inbound | json, list | No | Optional parameters for parameterized queries (list or dict) |
data_out | outbound | dataframe, json | Not applicable | Rows returned from the SQL query |
error_out | outbound | error, json | Not applicable | Error details if operation fails |
Configuration
| Field | Type | Required | Default | Options and constraints |
|---|---|---|---|---|
host | string | Yes | Not set | None |
port | number | No | 3306 | Minimum 1; Maximum 65535 |
database | string | Yes | Not set | None |
user | string | Yes | Not set | None |
password_ref | secret_ref | Yes | Not set | None |
query | code | Yes | Not set | None |
fetch_size | number | No | 1000 | Minimum 1 |
charset | string | No | "utf8mb4" | None |
ssl | boolean | No | false | None |
Example configuration
{
"host": "mysql.example.com",
"port": 3306,
"database": "commerce",
"user": "reader",
"password_ref": "secret:mysql_password",
"query": "SELECT order_id, amount FROM orders LIMIT 100",
"fetch_size": 100
}MySQL Writer
Type: mysql_writer. Catalog availability: production.
Insert / upsert rows into a MySQL table.
Prerequisites and behavior: Provision the destination table first and grant only the required write privileges. rows_in accepts records; mode supports insert/upsert behavior. The result reports rows written, table, and mode. Choose a stable unique key for idempotent upserts; an insert retry can duplicate records.
Python dependency: pymysql
Ports
| Port | Direction | Data types | Required input | Description |
|---|---|---|---|---|
rows_in | inbound | dataframe, json, list | Yes | Rows to write (list of dicts) |
result_out | outbound | json | Not applicable | Write result with affected row count |
error_out | outbound | error, json | Not applicable | Error details if operation fails |
Configuration
| Field | Type | Required | Default | Options and constraints |
|---|---|---|---|---|
host | string | Yes | Not set | None |
port | number | No | 3306 | Minimum 1; Maximum 65535 |
database | string | Yes | Not set | None |
user | string | Yes | Not set | None |
password_ref | secret_ref | Yes | Not set | None |
table | string | Yes | Not set | None |
mode | select | No | "insert" | Choices: insert, upsert, insert_ignore |
batch_size | number | No | 500 | Minimum 1 |
charset | string | No | "utf8mb4" | None |
Example configuration
{
"host": "mysql.example.com",
"port": 3306,
"database": "commerce",
"user": "writer",
"password_ref": "secret:mysql_password",
"table": "orders_export",
"mode": "insert",
"batch_size": 500
}Postgres Reader
Type: postgres_reader. Catalog availability: production.
Query PostgreSQL databases.
Prerequisites and behavior: The secret value is a PostgreSQL connection string. Optional params_in is a dictionary; its values are bound in insertion order to positional query parameters. fetch_size caps returned rows after the query is fetched; it is not a paging cursor. Use SQL limits and predicates for large sources. No automatic change-data capture or incremental checkpoint is provided.
Python dependency: asyncpg
Ports
| Port | Direction | Data types | Required input | Description |
|---|---|---|---|---|
trigger_in | inbound | any, trigger | No | Optional trigger to start query |
params_in | inbound | json | No | Optional parameters for parameterized queries |
data_out | outbound | dataframe, json | Not applicable | Rows returned from the SQL query |
error_out | outbound | error, json | Not applicable | Error details if operation fails |
Configuration
| Field | Type | Required | Default | Options and constraints |
|---|---|---|---|---|
connection_ref | secret_ref | Yes | Not set | None |
query | code | Yes | Not set | None |
fetch_size | number | No | 1000 | Minimum 1 |
Example configuration
{
"connection_ref": "secret:postgres_connection",
"query": "SELECT order_id, amount FROM orders LIMIT 100",
"fetch_size": 100
}Redshift Reader
Type: redshift_reader. Catalog availability: production.
Query Amazon Redshift data warehouse.
Prerequisites and behavior: Requires database access to the cluster host and a password secret. params_in supplies query parameters and fetch_size limits rows. Network reachability and source permissions are prerequisites; provisioning a warehouse is outside this node.
Python dependency: redshift_connector
Ports
| Port | Direction | Data types | Required input | Description |
|---|---|---|---|---|
trigger_in | inbound | any, trigger | No | Optional trigger signal to start ingestion |
data_out | outbound | dataframe, json | Not applicable | Rows returned from the Redshift query |
error_out | outbound | error, json | Not applicable | Error details if operation fails |
Configuration
| Field | Type | Required | Default | Options and constraints |
|---|---|---|---|---|
host | string | Yes | Not set | None |
port | number | No | 5439 | Minimum 1; Maximum 65535 |
database | string | Yes | Not set | None |
user | string | Yes | Not set | None |
password_ref | secret_ref | Yes | Not set | None |
query | code | Yes | Not set | None |
fetch_size | number | No | 1000 | Minimum 1 |
Example configuration
{
"host": "warehouse.example.com",
"port": 5439,
"database": "analytics",
"user": "reader",
"password_ref": "secret:redshift_password",
"query": "SELECT order_id, amount FROM orders LIMIT 100",
"fetch_size": 100
}S3 Ingest
Type: s3_ingest. Catalog availability: production.
Read files from Amazon S3 buckets.
Prerequisites and behavior: Uses the execution environment’s standard AWS credential chain, with permission to list the bucket and read objects. data_out is a list of parsed file values, so CSV files produce a list of row lists. Default maximum is 100 successfully parsed files. Invalid JSON/text may be skipped with a warning. If Parquet support is missing, this reader can return raw bytes instead of parsed rows. It does not track an ingestion checkpoint.
Python dependency: boto3; pyarrow for Parquet
Ports
| Port | Direction | Data types | Required input | Description |
|---|---|---|---|---|
trigger_in | inbound | any, trigger | No | Optional trigger signal to start ingestion |
data_out | outbound | binary, dataframe, json | Not applicable | Ingested data from S3 |
metadata_out | outbound | json | Not applicable | S3 object metadata (key, size, last_modified) |
error_out | outbound | error, json | Not applicable | Error details if operation fails |
Configuration
| Field | Type | Required | Default | Options and constraints |
|---|---|---|---|---|
bucket | string | Yes | Not set | None |
prefix | string | No | Not set | None |
file_format | select | Yes | "json" | Choices: json, csv, parquet, text, binary |
aws_region | string | No | Not set | None |
max_files | number | No | 100 | Minimum 1 |
Example configuration
{
"bucket": "your-source-bucket",
"prefix": "orders/",
"file_format": "json",
"aws_region": "us-east-1",
"max_files": 100
}SFTP Ingest
Type: sftp_ingest. Catalog availability: production.
Download files from an SFTP server.
Prerequisites and behavior: Requires password authentication or an RSA PEM private-key secret and source read access. Reads a file or files in a directory; default maximum is 50. The current connector does not expose or perform host-key verification against known hosts. Use a separately verified SFTP client in a Python task if host identity verification is required. It does not maintain a download checkpoint.
Python dependency: paramiko
Ports
| Port | Direction | Data types | Required input | Description |
|---|---|---|---|---|
trigger_in | inbound | any, trigger | No | Optional trigger signal to start ingestion |
data_out | outbound | binary, dataframe, json | Not applicable | Downloaded file contents |
metadata_out | outbound | json | Not applicable | SFTP file metadata (path, size, mtime) |
error_out | outbound | error, json | Not applicable | Error details if operation fails |
Configuration
| Field | Type | Required | Default | Options and constraints |
|---|---|---|---|---|
host | string | Yes | Not set | None |
port | number | No | 22 | Minimum 1; Maximum 65535 |
user | string | Yes | Not set | None |
password_ref | secret_ref | No | Not set | None |
private_key_ref | secret_ref | No | Not set | PEM private key; alternative to password auth |
remote_path | string | Yes | Not set | None |
file_format | select | Yes | "binary" | Choices: binary, text, json, jsonl, csv |
max_files | number | No | 50 | Minimum 1 |
Example configuration
{
"host": "sftp.example.com",
"port": 22,
"user": "reader",
"password_ref": "secret:sftp_password",
"remote_path": "/incoming/",
"file_format": "json",
"max_files": 50
}Snowflake Reader
Type: snowflake_reader. Catalog availability: production.
Query Snowflake data warehouse.
Prerequisites and behavior: Requires a Snowflake account identifier, user, password secret, and permissions on the selected warehouse/database/schema. Optional role selects the source role. fetch_size limits rows; use query predicates for incremental processing. Authentication exposed here is password-based, not a general Snowflake authentication adapter.
Python dependency: snowflake-connector-python
Ports
| Port | Direction | Data types | Required input | Description |
|---|---|---|---|---|
trigger_in | inbound | any, trigger | No | Optional trigger signal to start ingestion |
data_out | outbound | dataframe, json | Not applicable | Rows returned from the Snowflake query |
error_out | outbound | error, json | Not applicable | Error details if operation fails |
Configuration
| Field | Type | Required | Default | Options and constraints |
|---|---|---|---|---|
account | string | Yes | Not set | None |
user | string | Yes | Not set | None |
password_ref | secret_ref | Yes | Not set | None |
warehouse | string | No | Not set | None |
database | string | No | Not set | None |
schema | string | No | "PUBLIC" | None |
role | string | No | Not set | None |
query | code | Yes | Not set | None |
fetch_size | number | No | 1000 | Minimum 1 |
Example configuration
{
"account": "your-account",
"user": "reader",
"password_ref": "secret:snowflake_password",
"warehouse": "COMPUTE_WH",
"database": "ANALYTICS",
"schema": "PUBLIC",
"query": "SELECT order_id, amount FROM orders LIMIT 100",
"fetch_size": 100
}Transformation and data quality
| Node | Type | Catalog availability |
|---|---|---|
| Aggregator | aggregator | production |
| Column Mapper | column_mapper | production |
| Data Filter | data_filter | production |
| Data Join | data_join | production |
| Data Normalizer | data_normalizer | production |
| Data Quality | data_quality | production |
| Deduplicator | deduplicator | production |
| Pandas Transform | pandas_transform | production |
| Schema Validator | schema_validator | production |
| SQL Transform | sql_transform | production |
| Text Chunker | text_chunker | production |
Aggregator
Type: aggregator. Catalog availability: production.
Group records by key fields and compute aggregate functions (sum, avg, count, min, max, first, last, collect).
Prerequisites and behavior: Groups records by comma-separated fields and applies the declared aggregations. Each aggregation identifies a field, function, and optional alias. Returns aggregated records. Review behavior for missing or nonnumeric values before using financial totals.
Python dependency: No additional provider client beyond the base SDK.
Ports
| Port | Direction | Data types | Required input | Description |
|---|---|---|---|---|
data_in | inbound | dataframe, json, list | Yes | Records to aggregate |
aggregated_out | outbound | dataframe, json | Not applicable | One record per group with computed aggregates |
error_out | outbound | error, json | Not applicable | Error details if aggregation fails |
Configuration
| Field | Type | Required | Default | Options and constraints |
|---|---|---|---|---|
group_by | string | Yes | Not set | Comma-separated field names to group by |
aggregations | json | Yes | Not set | List of {field, function, alias}. Functions: sum, avg, count, min, max, first, last, collect |
Example configuration
{
"group_by": "status",
"aggregations": [
{
"field": "amount",
"function": "sum",
"alias": "total"
}
]
}Column Mapper
Type: column_mapper. Catalog availability: production.
Rename, select, reorder, and add computed columns to tabular data.
Prerequisites and behavior: Renames and optionally transforms fields according to a list of mappings. drop_unmapped controls whether other columns are retained. Verify target-name collisions and default values with sample records before writing the result to another system.
Python dependency: No additional provider client beyond the base SDK.
Ports
| Port | Direction | Data types | Required input | Description |
|---|---|---|---|---|
data_in | inbound | dataframe, json, list | Yes | Records with columns to map |
data_out | outbound | dataframe, json, list | Not applicable | Records with mapped columns |
error_out | outbound | error, json | Not applicable | Error details if mapping fails |
Configuration
| Field | Type | Required | Default | Options and constraints |
|---|---|---|---|---|
mappings | json | Yes | Not set | List of mappings. Simple rename: {source, target}. Computed column: {expression, target}. Use 'record' variable in expressions. |
drop_unmapped | boolean | No | false | If true, only keep mapped columns in output |
Example configuration
{
"mappings": [
{
"source": "id",
"target": "order_id"
}
],
"drop_unmapped": false
}Data Filter
Type: data_filter. Catalog availability: production.
Filter records from a dataset based on configurable conditions.
Prerequisites and behavior: Expression mode evaluates a predicate for each record and splits matched/unmatched rows. Field-match mode is exposed, but the base validator still requires a nonempty condition; supply one even when using field matching. Expressions are not a sandbox for hostile code.
Python dependency: No additional provider client beyond the base SDK.
Ports
| Port | Direction | Data types | Required input | Description |
|---|---|---|---|---|
data_in | inbound | dataframe, json, list | Yes | Records to filter |
matched_out | outbound | dataframe, json, list | Not applicable | Records that matched the filter condition |
unmatched_out | outbound | dataframe, json, list | Not applicable | Records that did not match the filter condition |
error_out | outbound | error, json | Not applicable | Error details if filtering fails |
Configuration
| Field | Type | Required | Default | Options and constraints |
|---|---|---|---|---|
mode | select | Yes | "expression" | Choices: expression, field_match; Filter mode: expression (Python) or simple field matching |
condition | code | Yes | Not set | Python expression evaluated per record. Use 'record' variable. Example: record['age'] > 18 |
field | string | No | Not set | Field name (for field_match mode) |
operator | select | No | "equals" | Choices: equals, not_equals, contains, gt, lt, gte, lte, in, not_in, regex; Comparison operator (for field_match mode) |
value | string | No | Not set | Value to compare against (for field_match mode) |
Example configuration
{
"mode": "expression",
"condition": "record[\"amount\"] > 0"
}Data Join
Type: data_join. Catalog availability: production.
Join two datasets on matching keys, similar to SQL JOIN.
Prerequisites and behavior: Joins two record lists using the configured keys. Select inner/left/right/outer and a conflict-resolution policy as exposed in the schema. Inputs are materialized in memory; use bounded datasets and check duplicate-key behavior for your data.
Python dependency: No additional provider client beyond the base SDK.
Ports
| Port | Direction | Data types | Required input | Description |
|---|---|---|---|---|
left_in | inbound | dataframe, json, list | Yes | Left dataset for join |
right_in | inbound | dataframe, json, list | Yes | Right dataset for join |
joined_out | outbound | dataframe, json, list | Not applicable | Result of the join operation |
unmatched_out | outbound | json, list | Not applicable | Records that had no match in the join |
error_out | outbound | error, json | Not applicable | Error details if join fails |
Configuration
| Field | Type | Required | Default | Options and constraints |
|---|---|---|---|---|
left_key | string | Yes | Not set | Field name in left dataset to join on |
right_key | string | Yes | Not set | Field name in right dataset to join on |
join_type | select | Yes | "inner" | Choices: inner, left, right, full; Type of join to perform |
conflict_resolution | select | No | "prefer_left" | Choices: prefer_left, prefer_right, suffix; How to handle duplicate field names |
Example configuration
{
"left_key": "customer_id",
"right_key": "id",
"join_type": "left",
"conflict_resolution": "prefer_left"
}Data Normalizer
Type: data_normalizer. Catalog availability: production.
Clean and normalize data fields.
Prerequisites and behavior: Applies an ordered list of normalization rules to records. Validate the result on representative values; normalization can change types or leave values unchanged when a rule cannot be applied. Rules and input rows are in-memory JSON-compatible data.
Python dependency: No additional provider client beyond the base SDK.
Ports
| Port | Direction | Data types | Required input | Description |
|---|---|---|---|---|
data_in | inbound | dataframe, json | Yes | Data to normalize |
data_out | outbound | dataframe, json | Not applicable | Cleaned and normalized data |
error_out | outbound | error, json | Not applicable | Error details if operation fails |
Configuration
| Field | Type | Required | Default | Options and constraints |
|---|---|---|---|---|
rules | json | Yes | Not set | None |
Example configuration
{
"rules": [
{
"field": "email",
"action": "lowercase"
}
]
}Data Quality
Type: data_quality. Catalog availability: production.
Run declarative data-quality expectations (row counts, null rates, uniqueness, allowed values, regex, freshness, distribution) against input rows.
Prerequisites and behavior: Evaluates SDK expectation specs. With on_failure="route", the node succeeds and emits the entire payload on fail_out for blocking failures, or pass_out on success; report_out contains detailed checks. This does not isolate individual invalid rows or store quarantine data. With on_failure="error", the node fails and failed outputs are not forwarded by the current node runtime.
Python dependency: No additional provider client beyond the base SDK.
Ports
| Port | Direction | Data types | Required input | Description |
|---|---|---|---|---|
data_in | inbound | dataframe, json, list | Yes | Rows (list of dicts / dataframe / json) to validate |
pass_out | outbound | dataframe, json, list | Not applicable | Input payload forwarded when no blocking check failed |
fail_out | outbound | dataframe, json, list | Not applicable | Input payload forwarded when a blocking check failed |
report_out | outbound | json | Not applicable | Structured report of every check result |
Configuration
| Field | Type | Required | Default | Options and constraints |
|---|---|---|---|---|
checks | json | Yes | Not set | JSON list of check specs. Supported kinds: row_count, not_null, unique, values_in, matches, freshness, distribution. Each may set a severity of warn/fail/quarantine (default fail). |
on_failure | select | No | "route" | Choices: route, error; What to do when a fail/quarantine-severity check fails. |
Example configuration
{
"checks": [
{
"kind": "row_count",
"min": 1
},
{
"kind": "not_null",
"columns": [
"order_id"
]
}
],
"on_failure": "route"
}Deduplicator
Type: deduplicator. Catalog availability: production.
Remove duplicate records.
Prerequisites and behavior: Current execution issue: the node fails with AttributeError before producing its result. Use a Python task that deduplicates by stable keys until corrected. Its exposed contract splits unique and duplicate records using comma-separated key columns. Choose keep_first, keep_last, or merge as available in the schema. This deduplicates the current input batch only; it is not a persistent cross-run idempotency store.
Python dependency: No additional provider client beyond the base SDK.
Ports
| Port | Direction | Data types | Required input | Description |
|---|---|---|---|---|
data_in | inbound | dataframe, json, list | Yes | Data with possible duplicates |
unique_out | outbound | dataframe, json, list | Not applicable | Data with duplicates removed |
duplicates_out | outbound | dataframe, json, list | Not applicable | Records that were identified as duplicates |
error_out | outbound | error, json | Not applicable | Error details if operation fails |
Configuration
| Field | Type | Required | Default | Options and constraints |
|---|---|---|---|---|
key_columns | string | Yes | Not set | None |
strategy | select | Yes | "keep_first" | Choices: keep_first, keep_last, remove_all |
Example configuration
{
"key_columns": "order_id",
"strategy": "keep_first"
}Pandas Transform
Type: pandas_transform. Catalog availability: production.
Apply pandas transformations.
Prerequisites and behavior: Current execution issue: this node returns TypeError before evaluating the expression. Installing pandas alone does not resolve it. Use a Python task with an explicitly installed pandas dependency. Do not accept untrusted expressions as a security boundary.
Python dependency: pandas; currently affected by the execution issue below
Ports
| Port | Direction | Data types | Required input | Description |
|---|---|---|---|---|
data_in | inbound | dataframe, json | Yes | Tabular data to transform |
data_out | outbound | dataframe, json | Not applicable | Result of pandas transformation |
error_out | outbound | error, json | Not applicable | Error details if operation fails |
Configuration
| Field | Type | Required | Default | Options and constraints |
|---|---|---|---|---|
expression | code | Yes | Not set | None |
Example configuration
{
"expression": "df.groupby(\"status\", as_index=False)[\"amount\"].sum()"
}Schema Validator
Type: schema_validator. Catalog availability: production.
Validate data against JSON Schema.
Prerequisites and behavior: Current execution issue: this node fails with TypeError before validation because its optional-dependency call is incompatible with the helper. Installing jsonschema does not resolve that issue. Use the SDK data-quality/contract functions or a Python task for validation until the runtime is corrected. The configuration and ports below describe its exposed contract.
Python dependency: jsonschema; currently affected by the execution issue below
Ports
| Port | Direction | Data types | Required input | Description |
|---|---|---|---|---|
data_in | inbound | dataframe, json | Yes | Data to validate |
valid_out | outbound | dataframe, json | Not applicable | Data that passed validation |
invalid_out | outbound | json | Not applicable | Data that failed validation with error details |
error_out | outbound | error, json | Not applicable | Error details if operation fails |
Configuration
| Field | Type | Required | Default | Options and constraints |
|---|---|---|---|---|
schema | json | Yes | Not set | None |
strict | boolean | No | true | None |
Example configuration
{
"schema": {
"type": "object",
"required": [
"order_id"
],
"properties": {
"order_id": {
"type": "string"
}
}
},
"strict": true
}SQL Transform
Type: sql_transform. Catalog availability: production.
Transform with SQL queries.
Prerequisites and behavior: Current execution issue: this node returns TypeError before executing the SQL transformation. Installing duckdb alone does not resolve it. Use a Python task that queries your input through a controlled client until corrected.
Python dependency: duckdb; currently affected by the execution issue below
Ports
| Port | Direction | Data types | Required input | Description |
|---|---|---|---|---|
data_in | inbound | dataframe, json | Yes | Data to query (available as 'input' table) |
data_out | outbound | dataframe, json | Not applicable | Rows from the SQL query |
error_out | outbound | error, json | Not applicable | Error details if operation fails |
Configuration
| Field | Type | Required | Default | Options and constraints |
|---|---|---|---|---|
query | code | Yes | Not set | None |
Example configuration
{
"query": "SELECT * FROM input"
}Text Chunker
Type: text_chunker. Catalog availability: production.
Split text into overlapping chunks optimized for embedding and retrieval.
Prerequisites and behavior: Splits text with fixed-size, sentence, paragraph, or recursive strategies. Sizes are character-oriented rather than provider token counts. Returns chunks plus metadata; ensure overlap is smaller than the chunk size and measure resulting prompt lengths for your model.
Python dependency: No additional provider client beyond the base SDK.
Ports
| Port | Direction | Data types | Required input | Description |
|---|---|---|---|---|
text_in | inbound | document, list, string | Yes | Text content to chunk |
chunks_out | outbound | json, list | Not applicable | List of text chunks with metadata (index, start_offset, end_offset) |
metadata_out | outbound | json | Not applicable | Chunking statistics (total_chunks, average_chunk_size, etc.) |
error_out | outbound | error, json | Not applicable | Error details if chunking fails |
Configuration
| Field | Type | Required | Default | Options and constraints |
|---|---|---|---|---|
strategy | select | Yes | "fixed_size" | Choices: fixed_size, sentence, paragraph, recursive; Strategy for splitting text into chunks |
chunk_size | number | No | 512 | Minimum 50; Maximum 8192; Target number of characters per chunk |
chunk_overlap | number | No | 50 | Minimum 0; Number of overlapping characters between consecutive chunks |
separator | string | No | Not set | Custom separator for splitting (for fixed_size strategy). Use \n for newline. |
Example configuration
{
"strategy": "fixed_size",
"chunk_size": 512,
"chunk_overlap": 50
}Language models and prompts
| Node | Type | Catalog availability |
|---|---|---|
| Claude Summary | claude_summary | production |
| GPT-4 Classify | gpt4_classify | production |
| LLM Completion | llm_completion | production |
| LLM Router | llm_router | production |
| OpenAI Embeddings | openai_embeddings | production |
| Prompt Template | prompt_template | production |
| Structured Output | structured_output | production |
Claude Summary
Type: claude_summary. Catalog availability: production.
Summarize with Claude.
Prerequisites and behavior: Requires an Anthropic API-key secret and access to the configured model. The output is summary text. Keep input within provider context limits and review outputs before customer-facing use. A model listed in the form can be unavailable to a particular provider account.
Python dependency: anthropic
Ports
| Port | Direction | Data types | Required input | Description |
|---|---|---|---|---|
text_in | inbound | document, json, string | Yes | Text to summarize |
summary_out | outbound | json, string | Not applicable | Generated summary text |
error_out | outbound | json | Not applicable | Error output on failure |
Configuration
| Field | Type | Required | Default | Options and constraints |
|---|---|---|---|---|
model | select | Yes | "claude-sonnet-4-5-20250929" | Choices: claude-sonnet-4-5-20250929, claude-haiku-4-5-20251001, claude-opus-4-5-20251101 |
system_prompt | textarea | No | Not set | None |
max_tokens | number | No | 1024 | Minimum 1 |
api_key_ref | secret_ref | Yes | Not set | None |
Example configuration
{
"model": "claude-sonnet-4-5-20250929",
"api_key_ref": "secret:anthropic_key",
"max_tokens": 1024
}GPT-4 Classify
Type: gpt4_classify. Catalog availability: production.
Classify text with GPT-4.
Prerequisites and behavior: Requires a prompt, allowed categories, model access, and an OpenAI API-key secret. Review classification_out for the assigned category/result. Categories may be configured as comma-separated text. Model output remains probabilistic; validate critical downstream decisions independently.
Python dependency: openai
Ports
| Port | Direction | Data types | Required input | Description |
|---|---|---|---|---|
text_in | inbound | json, string | Yes | Text to classify |
classification_out | outbound | json | Not applicable | Classification result with category and confidence |
error_out | outbound | json | Not applicable | Error output on failure |
Configuration
| Field | Type | Required | Default | Options and constraints |
|---|---|---|---|---|
model | select | Yes | "gpt-4o" | Choices: gpt-4o, gpt-4o-mini, gpt-4-turbo |
system_prompt | textarea | Yes | Not set | None |
categories | string | Yes | Not set | None |
api_key_ref | secret_ref | Yes | Not set | None |
temperature | number | No | 0.0 | Minimum 0; Maximum 2 |
Example configuration
{
"model": "gpt-4o",
"system_prompt": "Classify the customer request into one category.",
"categories": "billing,technical,other",
"api_key_ref": "secret:openai_key",
"temperature": 0
}LLM Completion
Type: llm_completion. Catalog availability: production.
Generic multi-provider LLM completion node supporting OpenAI, Anthropic, and custom OpenAI-compatible endpoints.
Prerequisites and behavior: Supports OpenAI, Anthropic, and Ollama-compatible configuration. OpenAI-compatible requests can use base_url. The API-key reference is required and resolved even for a local endpoint; provide an appropriate configured secret. completion_out is generated text and usage_out reports provider usage. Provider context, account, and rate limits apply.
Python dependency: openai for OpenAI-compatible providers; anthropic for Anthropic
Ports
| Port | Direction | Data types | Required input | Description |
|---|---|---|---|---|
prompt_in | inbound | json, string | Yes | Input prompt text or JSON |
system_in | inbound | string | No | Optional system prompt override |
completion_out | outbound | json, string | Not applicable | Generated completion text or JSON |
usage_out | outbound | json | Not applicable | Token usage information (input_tokens, output_tokens) |
error_out | outbound | error, json | Not applicable | Error output on failure |
Configuration
| Field | Type | Required | Default | Options and constraints |
|---|---|---|---|---|
provider | select | Yes | "openai" | Choices: openai, anthropic, custom; LLM provider |
model | string | Yes | "gpt-4o" | Model identifier |
system_prompt | textarea | No | Not set | Default system prompt for the model |
temperature | number | No | 0.7 | Minimum 0; Maximum 2; Sampling temperature (0=deterministic, 2=maximum randomness) |
max_tokens | number | No | 1024 | Minimum 1; Maximum tokens in response |
api_key_ref | secret_ref | Yes | Not set | Secret reference to API key |
base_url | string | No | Not set | Custom endpoint URL (for OpenAI-compatible providers) |
response_format | select | No | "text" | Choices: text, json_object; Expected response format |
Example configuration
{
"provider": "openai",
"model": "gpt-4o",
"api_key_ref": "secret:openai_key",
"temperature": 0.2,
"max_tokens": 512
}LLM Router
Type: llm_router. Catalog availability: production.
Select model metadata based on cost or quality preferences.
Prerequisites and behavior: Selects a model based on the supplied model metadata and chosen cost/quality strategy. It passes the input through response_out and emits routing_info_out; it does not invoke a language model itself. Connect an actual completion task/node after making the selection.
Python dependency: No additional provider client beyond the base SDK.
Ports
| Port | Direction | Data types | Required input | Description |
|---|---|---|---|---|
request_in | inbound | json, string | Yes | Request to route to optimal LLM |
response_out | outbound | json, string | Not applicable | Response from selected LLM |
routing_info_out | outbound | json | Not applicable | Which model was selected and why |
error_out | outbound | json | Not applicable | Error output on failure |
Configuration
| Field | Type | Required | Default | Options and constraints |
|---|---|---|---|---|
strategy | select | Yes | "cost" | Choices: cost, quality, balanced |
models | json | Yes | Not set | None |
Example configuration
{
"strategy": "cost",
"models": [
{
"name": "model-a",
"cost_per_1k": 0.001,
"quality_score": 80
},
{
"name": "model-b",
"cost_per_1k": 0.002,
"quality_score": 90
}
]
}OpenAI Embeddings
Type: openai_embeddings. Catalog availability: production.
Generate embeddings via OpenAI.
Prerequisites and behavior: Requires an OpenAI API-key secret and a model available to that account. Accepts text and returns embedding vectors; default batch size is 100. Match embedding dimensions to the destination index, add stable record IDs before writing vectors, and account for provider token/rate limits. Model names in the schema are product defaults, not a promise of provider availability.
Python dependency: openai
Ports
| Port | Direction | Data types | Required input | Description |
|---|---|---|---|---|
text_in | inbound | json, list, string | Yes | Text data to embed |
embeddings_out | outbound | embedding, list | Not applicable | Generated vector embeddings |
error_out | outbound | json | Not applicable | Error output on failure |
Configuration
| Field | Type | Required | Default | Options and constraints |
|---|---|---|---|---|
model | select | Yes | "text-embedding-3-small" | Choices: text-embedding-3-small, text-embedding-3-large, text-embedding-ada-002 |
api_key_ref | secret_ref | Yes | Not set | None |
batch_size | number | No | 100 | Minimum 1; Maximum 2048 |
Example configuration
{
"model": "text-embedding-3-small",
"api_key_ref": "secret:openai_key",
"batch_size": 100
}Prompt Template
Type: prompt_template. Catalog availability: production.
Compose prompts from templates and dynamic variables.
Prerequisites and behavior: Uses {{variable}} placeholders and optional retrieved context. Unresolved placeholders may remain visible; inspect the rendered prompt before sending it. The context length cap is character-based and does not replace model token budgeting.
Python dependency: No additional provider client beyond the base SDK.
Ports
| Port | Direction | Data types | Required input | Description |
|---|---|---|---|---|
variables_in | inbound | any, json | Yes | Template variables as JSON/dict |
context_in | inbound | json, list, string | No | RAG context or retrieved chunks to inject |
prompt_out | outbound | string | Not applicable | Rendered prompt template |
error_out | outbound | error, json | Not applicable | Error output on failure |
Configuration
| Field | Type | Required | Default | Options and constraints |
|---|---|---|---|---|
template | textarea | Yes | Not set | Prompt template with {{variable}} placeholders. Use {{context}} for RAG retrieved chunks. |
context_separator | string | No | "\n---\n" | Separator for joining context items |
max_context_length | number | No | 4000 | Maximum characters for context injection to avoid token overflow |
Example configuration
{
"template": "Answer {{question}} using this context:\n{{context}}",
"context_separator": "\n---\n",
"max_context_length": 4000
}Structured Output
Type: structured_output. Catalog availability: production.
Extract structured JSON data from unstructured text using an LLM.
Prerequisites and behavior: Chooses the provider from the configured model and extracts a JSON object matching output_schema; provider access and credentials are required. structured_out contains parsed data and raw_response_out retains the model response. Strict validation requires jsonschema. Validate sensitive actions independently rather than trusting generated structured data.
Python dependency: openai or anthropic; jsonschema for validation
Ports
| Port | Direction | Data types | Required input | Description |
|---|---|---|---|---|
text_in | inbound | document, json, string | Yes | Unstructured text to extract from |
schema_in | inbound | json | No | Optional JSON schema override |
structured_out | outbound | json | Not applicable | Extracted structured data as JSON |
raw_response_out | outbound | string | Not applicable | Raw LLM response text |
error_out | outbound | error, json | Not applicable | Error output on failure |
Configuration
| Field | Type | Required | Default | Options and constraints |
|---|---|---|---|---|
output_schema | json | Yes | Not set | JSON Schema defining the expected output structure |
model | select | No | "gpt-4o" | Choices: gpt-4o, gpt-4o-mini, claude-sonnet-4-5-20250929; LLM model to use for extraction |
extraction_prompt | textarea | No | Not set | Additional instructions for the extraction (optional) |
api_key_ref | secret_ref | Yes | Not set | Secret reference to API key |
strict_validation | boolean | No | true | Validate extracted JSON against schema |
Example configuration
{
"output_schema": {
"type": "object",
"required": [
"topic"
],
"properties": {
"topic": {
"type": "string"
}
}
},
"model": "gpt-4o",
"api_key_ref": "secret:openai_key",
"strict_validation": true
}Vector storage and search
| Node | Type | Catalog availability |
|---|---|---|
| Chroma Store | chroma_store | production |
| OpenSearch Write | opensearch_write | production |
| pgvector Write | pgvector_write | production |
| Pinecone Write | pinecone_write | production |
| Qdrant Write | qdrant_write | production |
| Vector Search | vector_search | production |
| Weaviate Insert | weaviate_insert | production |
Chroma Store
Type: chroma_store. Catalog availability: production.
Store embeddings and documents in ChromaDB.
Prerequisites and behavior: Accepts records with id, optional embedding/values, document, and metadata. Creates or gets the named collection and adds records. Host must be hostname:port. The current implementation builds authentication headers but does not pass them to the client, so api_key_ref does not authenticate writes. Use your own authenticated client in a task when needed.
Python dependency: chromadb
Ports
| Port | Direction | Data types | Required input | Description |
|---|---|---|---|---|
data_in | inbound | embedding, json, list | Yes | Data to store (list of {id, embedding/values, document, metadata}) |
result_out | outbound | json | Not applicable | Store operation result |
error_out | outbound | error | Not applicable | Error details if store fails |
Configuration
| Field | Type | Required | Default | Options and constraints |
|---|---|---|---|---|
collection | string | Yes | Not set | ChromaDB collection name |
host | string | No | "localhost:8000" | ChromaDB server host:port |
api_key_ref | secret_ref | No | Not set | Optional secret reference to authentication token |
Example configuration
{
"collection": "support_articles",
"host": "localhost:8000"
}OpenSearch Write
Type: opensearch_write. Catalog availability: production.
Index vector documents into an OpenSearch k-NN index.
Prerequisites and behavior: Provision an index with the intended vector mapping. Configure hosts and, where needed, username/password secret. The result includes indexed count and bulk errors; inspect both rather than assuming every record was accepted. Source signing mechanisms outside the exposed username/password options require a custom client.
Python dependency: opensearch-py
Ports
| Port | Direction | Data types | Required input | Description |
|---|---|---|---|---|
vectors_in | inbound | embedding, json, list | Yes | Vector records to upsert (list of {id, values, metadata}) |
result_out | outbound | json | Not applicable | Upsert result with the number of vectors written |
error_out | outbound | error, json | Not applicable | Error details if the write fails |
Configuration
| Field | Type | Required | Default | Options and constraints |
|---|---|---|---|---|
hosts | string | Yes | Not set | Comma-separated host URLs |
index | string | Yes | Not set | None |
vector_field | string | No | "embedding" | None |
username | string | No | Not set | None |
password_ref | secret_ref | No | Not set | None |
use_ssl | boolean | No | true | None |
batch_size | number | No | 500 | Minimum 1 |
Example configuration
{
"hosts": "https://search.example.com:9200",
"index": "articles",
"vector_field": "embedding",
"use_ssl": true,
"batch_size": 500
}pgvector Write
Type: pgvector_write. Catalog availability: production.
Insert vector embeddings into a Postgres/pgvector table.
Prerequisites and behavior: The secret is a PostgreSQL connection string. Provision the pgvector extension, destination table, vector column/dimensions, and a unique conflict key before writing. Configured table/column names refer to your database. Input records carry ID, vector, and metadata. The result reports rows_written; this node does not create the table or implement vector search.
Python dependency: psycopg[binary] or psycopg2
Ports
| Port | Direction | Data types | Required input | Description |
|---|---|---|---|---|
vectors_in | inbound | embedding, json, list | Yes | Vector records to upsert (list of {id, values, metadata}) |
result_out | outbound | json | Not applicable | Upsert result with the number of vectors written |
error_out | outbound | error, json | Not applicable | Error details if the write fails |
Configuration
| Field | Type | Required | Default | Options and constraints |
|---|---|---|---|---|
connection_ref | secret_ref | Yes | Not set | libpq connection string / DSN |
table | string | Yes | Not set | None |
id_column | string | No | "id" | None |
vector_column | string | No | "embedding" | None |
metadata_column | string | No | "metadata" | JSONB column for record metadata; leave blank to skip |
upsert | boolean | No | true | None |
batch_size | number | No | 200 | Minimum 1 |
Example configuration
{
"connection_ref": "secret:postgres_connection",
"table": "article_vectors",
"id_column": "id",
"vector_column": "embedding",
"metadata_column": "metadata",
"upsert": true
}Pinecone Write
Type: pinecone_write. Catalog availability: production.
Upsert vector embeddings to Pinecone.
Prerequisites and behavior: Create an index with dimensions matching your embeddings and grant the key write access. Input records use id, values, and optional metadata. Invalid records can be skipped with warnings; inspect upserted_count against your input count. Writes use batches of 100. The implementation expects the Pinecone client class available in newer client APIs.
Python dependency: pinecone client exposing the Pinecone class
Ports
| Port | Direction | Data types | Required input | Description |
|---|---|---|---|---|
vectors_in | inbound | embedding, json, list | Yes | Vector embeddings to upsert (list of {id, values, metadata}) |
result_out | outbound | json | Not applicable | Upsert operation result with count |
error_out | outbound | error | Not applicable | Error details if upsert fails |
Configuration
| Field | Type | Required | Default | Options and constraints |
|---|---|---|---|---|
index | string | Yes | Not set | Pinecone index name |
namespace | string | No | Not set | Optional Pinecone namespace |
api_key_ref | secret_ref | Yes | Not set | Secret reference to Pinecone API key |
Example configuration
{
"index": "articles",
"namespace": "support",
"api_key_ref": "secret:pinecone_key"
}Qdrant Write
Type: qdrant_write. Catalog availability: production.
Upsert vector embeddings to a Qdrant collection.
Prerequisites and behavior: Provision a collection with matching vector dimensions. Input vector records contain id, values or vector, and optional metadata; use a Qdrant-supported point ID. Optional API-key secret authenticates the client. Returns collection and upserted count. Inspect skipped malformed inputs and batch failures.
Python dependency: qdrant-client
Ports
| Port | Direction | Data types | Required input | Description |
|---|---|---|---|---|
vectors_in | inbound | embedding, json, list | Yes | Vector records to upsert (list of {id, values, metadata}) |
result_out | outbound | json | Not applicable | Upsert result with the number of vectors written |
error_out | outbound | error, json | Not applicable | Error details if the write fails |
Configuration
| Field | Type | Required | Default | Options and constraints |
|---|---|---|---|---|
url | string | Yes | Not set | None |
collection | string | Yes | Not set | None |
api_key_ref | secret_ref | No | Not set | Optional; required for Qdrant Cloud |
batch_size | number | No | 100 | Minimum 1 |
Example configuration
{
"url": "https://qdrant.example.com:6333",
"collection": "articles",
"api_key_ref": "secret:qdrant_key",
"batch_size": 100
}Vector Search
Type: vector_search. Catalog availability: production.
Perform similarity search against vector databases (Pinecone, Weaviate, Chroma) to retrieve relevant documents or records.
Prerequisites and behavior: The implemented providers are Pinecone, Weaviate, and Chroma. Input must be an embedding vector or a dictionary with embedding/vector; raw search text must first be embedded. Qdrant, pgvector, and OpenSearch write nodes do not imply search support here. Returns matches and score metadata; score meanings and filtering depend on the provider.
Python dependency: Selected provider client: pinecone, weaviate-client, or chromadb
Ports
| Port | Direction | Data types | Required input | Description |
|---|---|---|---|---|
query_in | inbound | embedding, json, string | Yes | Query embedding, string, or JSON to search for |
results_out | outbound | json, list | Not applicable | Search results as list of matched records |
scores_out | outbound | json | Not applicable | Similarity scores for each result |
error_out | outbound | error, json | Not applicable | Error details if search fails |
Configuration
| Field | Type | Required | Default | Options and constraints |
|---|---|---|---|---|
provider | select | Yes | Not set | Choices: pinecone, weaviate, chroma; Vector database provider |
index | string | Yes | Not set | Index or collection name to search in |
top_k | number | No | 5 | Minimum 1; Maximum 100; Number of results to return |
api_key_ref | secret_ref | No | Not set | Secret reference to API key |
url | string | No | Not set | URL for Weaviate or Chroma instances |
namespace | string | No | Not set | Namespace (Pinecone only) |
score_threshold | number | No | 0.0 | Minimum 0.0; Maximum 1.0; Minimum similarity score to include in results |
include_metadata | boolean | No | true | Include metadata in results |
filter | json | No | Not set | Provider-specific metadata filter (JSON) |
Example configuration
{
"provider": "pinecone",
"index": "articles",
"api_key_ref": "secret:pinecone_key",
"top_k": 5,
"include_metadata": true
}Weaviate Insert
Type: weaviate_insert. Catalog availability: production.
Insert objects into Weaviate.
Prerequisites and behavior: Input is a list of object dictionaries; create the target class/collection compatible with this node’s API. This implementation uses the legacy Weaviate Client and batch API, so verify the installed client version. Optional API-key resolution failure can continue without authentication; verify actual authorized access before production use.
Python dependency: weaviate-client with the legacy Client API used by this node
Ports
| Port | Direction | Data types | Required input | Description |
|---|---|---|---|---|
data_in | inbound | json, list | Yes | Data objects to insert (list of dicts) |
result_out | outbound | json | Not applicable | Insert operation result |
error_out | outbound | error | Not applicable | Error details if insert fails |
Configuration
| Field | Type | Required | Default | Options and constraints |
|---|---|---|---|---|
class_name | string | Yes | Not set | Weaviate class name |
url | string | Yes | Not set | Weaviate instance URL |
api_key_ref | secret_ref | No | Not set | Optional secret reference to API key for authentication |
Example configuration
{
"class_name": "Article",
"url": "https://weaviate.example.com",
"api_key_ref": "secret:weaviate_key"
}Notifications and destinations
| Node | Type | Catalog availability |
|---|---|---|
| Email Send | email_send | production |
| S3 Write | s3_write | production |
| Slack Alert | slack_alert | production |
| Webhook POST | webhook_post | production |
Email Send
Type: email_send. Catalog availability: production.
Send email notifications via SMTP.
Prerequisites and behavior: The SMTP credential secret is JSON containing username and password. Configure the server, port, recipient, subject, and template; default port is 587. The node sends an email, so verify recipients with a test mailbox. Delivery acceptance does not guarantee arrival in an inbox.
Python dependency: aiosmtplib
Ports
| Port | Direction | Data types | Required input | Description |
|---|---|---|---|---|
data_in | inbound | any | Yes | Data for email template variables |
status_out | outbound | json | Not applicable | Email delivery status |
error_out | outbound | error | Not applicable | Error details if send fails |
Configuration
| Field | Type | Required | Default | Options and constraints |
|---|---|---|---|---|
to | string | Yes | Not set | Recipient email address |
subject | string | Yes | Not set | Email subject line |
body_template | textarea | Yes | Not set | Email body with {{variable}} placeholders |
smtp_host | string | Yes | "smtp.gmail.com" | SMTP server hostname |
smtp_port | number | No | 587 | Minimum 1; Maximum 65535; SMTP server port |
smtp_credential_ref | secret_ref | Yes | Not set | Secret reference to JSON with 'username' and 'password' |
Example configuration
{
"to": "reviewer@example.com",
"subject": "Order export ready",
"body_template": "Exported {{count}} orders",
"smtp_host": "smtp.example.com",
"smtp_port": 587,
"smtp_credential_ref": "secret:smtp_credentials"
}S3 Write
Type: s3_write. Catalog availability: production.
Write data to Amazon S3 (JSON, CSV, Parquet).
Prerequisites and behavior: Requires the execution environment’s standard AWS credentials and permission to write the destination. The exposed aws_credential_ref field is currently not used to create the client. Keys are the configured prefix plus a timestamp and extension; include a trailing slash in a directory-like prefix. The result contains s3_uri, bucket, key, bytes_written, and format. Repeating a write can create another object.
Python dependency: boto3; pyarrow for Parquet
Ports
| Port | Direction | Data types | Required input | Description |
|---|---|---|---|---|
data_in | inbound | any | Yes | Data to write to S3 |
result_out | outbound | json | Not applicable | S3 write result with URI and metadata |
error_out | outbound | error | Not applicable | Error details if write fails |
Configuration
| Field | Type | Required | Default | Options and constraints |
|---|---|---|---|---|
bucket | string | Yes | Not set | S3 bucket name |
prefix | string | No | Not set | Path prefix for S3 keys |
file_format | select | Yes | "json" | Choices: json, csv, parquet; Output file format |
aws_credential_ref | secret_ref | No | Not set | Secret reference to AWS credentials JSON |
Example configuration
{
"bucket": "your-output-bucket",
"prefix": "orders/",
"file_format": "json"
}Slack Alert
Type: slack_alert. Catalog availability: production.
Send Slack messages to a channel via webhook.
Prerequisites and behavior: The secret value is a Slack incoming-webhook URL. Message templates support {{variable}} values from input. The node sends a notification during execution; use retries carefully to avoid duplicate messages. Provider webhook permissions and rate limits apply.
Python dependency: aiohttp
Ports
| Port | Direction | Data types | Required input | Description |
|---|---|---|---|---|
data_in | inbound | any | Yes | Data to include in the message (available as template variables) |
status_out | outbound | json | Not applicable | Status of the Slack message delivery |
error_out | outbound | error | Not applicable | Error details if send fails |
Configuration
| Field | Type | Required | Default | Options and constraints |
|---|---|---|---|---|
channel | string | Yes | Not set | Slack channel or user to send to |
message_template | textarea | Yes | Not set | Message text with {{variable}} placeholders |
webhook_ref | secret_ref | Yes | Not set | Secret reference to Slack webhook URL |
Example configuration
{
"channel": "#data-alerts",
"message_template": "Exported {{count}} orders",
"webhook_ref": "secret:slack_webhook"
}Webhook POST
Type: webhook_post. Catalog availability: production.
Send HTTP POST to webhook endpoints.
Prerequisites and behavior: Posts a JSON payload to the configured URL. Without body_template, the incoming payload is posted; a template customizes it. This is an outbound HTTP step, not an inbound flow trigger or a signed lifecycle subscription. The returned response includes HTTP information; inspect status before treating a downstream business action as successful.
Python dependency: aiohttp
Ports
| Port | Direction | Data types | Required input | Description |
|---|---|---|---|---|
payload_in | inbound | any | Yes | Data to send as webhook payload |
response_out | outbound | json | Not applicable | Webhook response (status code and body) |
error_out | outbound | error | Not applicable | Error details if request fails |
Configuration
| Field | Type | Required | Default | Options and constraints |
|---|---|---|---|---|
url | string | Yes | Not set | URL to POST to |
headers | json | No | Not set | Custom HTTP headers |
body_template | textarea | No | Not set | JSON template for request body (if empty, uses raw payload) |
Example configuration
{
"url": "https://your-service.example.com/hooks/orders",
"headers": {
"Content-Type": "application/json"
}
}Workflow control
| Node | Type | Catalog availability |
|---|---|---|
| Batch Processor | batch_processor | production |
| Conditional Branch | conditional_branch | production |
| Error Handler | error_handler | production |
| Human Approval | human_approval | preview |
| Loop | loop | preview |
| Merge | merge | production |
| Subflow | subflow | preview |
| Wait / Delay | wait | production |
Batch Processor
Type: batch_processor. Catalog availability: production.
Process a large collection in configurable batches with concurrency control and progress tracking.
Prerequisites and behavior: Splits an input collection into batches and applies optional run(batch, batch_number) code. Concurrency and delay apply to work inside this node, not separate downstream graph executions. continue_on_error defaults to true; inspect per-batch errors/counts in the summary before treating all records as processed.
Python dependency: No additional provider client beyond the base SDK.
Ports
| Port | Direction | Data types | Required input | Description |
|---|---|---|---|---|
items_in | inbound | dataframe, json, list | Yes | Full collection to process |
batch_out | outbound | json, list | Not applicable | Emits one batch at a time |
progress_out | outbound | json | Not applicable | Progress updates (batch_number, total_batches, percent) |
completed_out | outbound | json | Not applicable | Final summary when all batches done |
error_out | outbound | error | Not applicable | Error details if batch processing fails |
Configuration
| Field | Type | Required | Default | Options and constraints |
|---|---|---|---|---|
batch_size | number | Yes | 100 | Minimum 1; Maximum 10000; Number of items per batch |
max_concurrent | number | No | 1 | Minimum 1; Maximum 50; Max batches to process concurrently |
delay_between_batches | number | No | 0 | Minimum 0; Seconds to wait between batches (for rate limiting) |
batch_code | code | No | Not set | Optional Python code defining run(batch, batch_number) applied to each batch. Return value becomes the batch result. Leave empty to pass the batch through. |
continue_on_error | boolean | No | true | Continue processing remaining batches if one fails |
Example configuration
{
"batch_size": 100,
"max_concurrent": 1,
"batch_code": "def run(batch, batch_number):\n return {\"batch\": batch_number, \"count\": len(batch)}"
}Conditional Branch
Type: conditional_branch. Catalog availability: production.
Route data based on conditions (if/else).
Prerequisites and behavior: Evaluates a condition over the input and emits it only on the selected true/false port; the unselected output is absent or None. Required downstream inputs on the unselected branch are skipped. Expressions should be authored by trusted developers.
Python dependency: No additional provider client beyond the base SDK.
Ports
| Port | Direction | Data types | Required input | Description |
|---|---|---|---|---|
data_in | inbound | any | Yes | Data to evaluate the condition against |
true_out | outbound | any | Not applicable | Output when condition is true |
false_out | outbound | any | Not applicable | Output when condition is false |
error_out | outbound | error | Not applicable | Error details if condition evaluation fails |
Configuration
| Field | Type | Required | Default | Options and constraints |
|---|---|---|---|---|
condition | code | Yes | Not set | Python expression using 'data' variable (e.g., data.get('status') == 'active') |
Example configuration
{
"condition": "data[\"amount\"] > 100"
}Error Handler
Type: error_handler. Catalog availability: production.
Wrap a section of the flow with try/catch error handling.
Prerequisites and behavior: Handles an error value supplied as input using the configured strategy. The current node runtime does not forward outputs from failed nodes, including error_out, so simply wiring a failed node to this node does not provide automatic recovery. Explicit successful routing, such as data_quality route mode, is required for that pattern.
Python dependency: No additional provider client beyond the base SDK.
Ports
| Port | Direction | Data types | Required input | Description |
|---|---|---|---|---|
data_in | inbound | any | Yes | Normal data path |
error_in | inbound | error, json | No | Upstream error signals |
success_out | outbound | any | Not applicable | Data when no error |
fallback_out | outbound | any | Not applicable | Fallback data when error handled |
unhandled_out | outbound | error | Not applicable | Errors that couldn't be handled |
Configuration
| Field | Type | Required | Default | Options and constraints |
|---|---|---|---|---|
strategy | select | Yes | "log_and_continue" | Choices: default_value, skip, log_and_continue, propagate; Strategy for handling errors |
default_value | json | No | Not set | Value to emit on fallback_out when strategy=default_value |
max_errors | number | No | 0 | Minimum 0; Max errors before propagating (0=unlimited) |
error_message_template | textarea | No | Not set | Custom error message template with {{error}} placeholder |
Example configuration
{
"strategy": "log_and_continue"
}Human Approval
Type: human_approval. Catalog availability: preview.
Wait for a human decision before selecting an output path.
Prerequisites and behavior: Preview. Waits for a workspace approval decision when the hosted approval capability is available; standalone execution cannot invent an approval. It polls while execution remains alive and is not a durable pause across worker restarts. The default base node timeout is 300 seconds and the maximum is 3,600 seconds, regardless of a longer timeout_hours field. Notification-channel fields are currently logged but do not send notifications themselves.
Python dependency: No additional provider client beyond the base SDK.
Ports
| Port | Direction | Data types | Required input | Description |
|---|---|---|---|---|
data_in | inbound | any | Yes | Data pending approval |
approved_out | outbound | any | Not applicable | Data after approval |
rejected_out | outbound | any | Not applicable | Data if rejected |
timeout_out | outbound | any | Not applicable | Data if approval times out |
error_out | outbound | error | Not applicable | Error details if approval fails |
Configuration
| Field | Type | Required | Default | Options and constraints |
|---|---|---|---|---|
approval_message | textarea | Yes | Not set | Message shown to reviewer with {{variable}} placeholders |
timeout_hours | number | No | 24 | Minimum 0.1; Maximum 720; Hours to wait before timeout |
notification_channel | select | No | "none" | Choices: none, webhook, email, slack; Where to notify reviewers |
webhook_url | string | No | Not set | Webhook URL for notifications |
approver_hint | string | No | Not set | Suggested approver name/role for routing |
poll_interval_seconds | number | No | 5 | Minimum 1; Maximum 3600; How often to check the approval store for a decision |
Example configuration
{
"approval_message": "Review order {{order_id}}",
"timeout_hours": 0.1,
"_timeout_seconds": 600,
"notification_channel": "none",
"poll_interval_seconds": 5
}Loop
Type: loop. Catalog availability: preview.
Process each item of a collection inside one node.
Prerequisites and behavior: Preview. Iterates inline within this node, applying body_code or body_expression and collecting results. It does not re-execute the downstream graph for every item. The default cap is 1,000 items and excess items are truncated; inspect the completed summary’s truncated/failed counts. item_out contains the final processed result, not an event stream of every iteration.
Python dependency: No additional provider client beyond the base SDK.
Ports
| Port | Direction | Data types | Required input | Description |
|---|---|---|---|---|
items_in | inbound | dataframe, json, list | Yes | The collection to iterate over |
item_out | outbound | any | Not applicable | Last processed result after the loop finishes |
index_out | outbound | number | Not applicable | Current iteration index (0-based) |
completed_out | outbound | json | Not applicable | Summary when all iterations complete |
error_out | outbound | error | Not applicable | Error details if iteration fails |
Configuration
| Field | Type | Required | Default | Options and constraints |
|---|---|---|---|---|
max_iterations | number | No | 1000 | Minimum 1; Maximum 10000; Safety limit on iterations |
item_key | string | No | Not set | If items are dicts, extract this key as the item value |
body_expression | code | No | Not set | Optional Python expression evaluated per item with 'item' and 'index' in scope (e.g. item['value'] * 2). Leave empty to pass items through unchanged. |
body_code | code | No | Not set | Optional Python code defining run(item, index) applied per item. Takes precedence over Body Expression when both are set. |
continue_on_error | boolean | No | true | Continue processing remaining items if one item's body raises |
collect_results | boolean | No | true | Collect all iteration results into completed_out |
Example configuration
{
"max_iterations": 1000,
"body_expression": "item[\"amount\"] * 2",
"continue_on_error": true,
"collect_results": true
}Merge
Type: merge. Catalog availability: production.
Merge data from multiple sources.
Prerequisites and behavior: Combines available upstream inputs using concat, zip, or deep-merge strategies. It runs once after its dependencies are terminal; it does not turn failed upstream results into successes. Verify duplicate keys and differing list lengths for the chosen strategy.
Python dependency: No additional provider client beyond the base SDK.
Ports
| Port | Direction | Data types | Required input | Description |
|---|---|---|---|---|
input_a | inbound | any | Yes | First data source |
input_b | inbound | any | Yes | Second data source |
merged_out | outbound | any | Not applicable | Combined output from all inputs |
error_out | outbound | error | Not applicable | Error details if merge fails |
Configuration
| Field | Type | Required | Default | Options and constraints |
|---|---|---|---|---|
strategy | select | Yes | "concat" | Choices: concat, zip, deep_merge, wait_all; How to combine the two inputs |
Example configuration
{
"strategy": "concat"
}Subflow
Type: subflow. Catalog availability: preview.
Invoke a saved workflow from another workflow when hosted support is available.
Prerequisites and behavior: Preview. Calls a saved flow only when the execution environment provides hosted subflow support. Standalone execution can return status_out.status="not_available" with a successful node result even though nothing ran; inspect that status. wait_for_completion and timeouts are bounded by the outer node/runtime timeout. This node is separate from Python SDK child-flow calls.
Python dependency: No additional provider client beyond the base SDK.
Ports
| Port | Direction | Data types | Required input | Description |
|---|---|---|---|---|
params_in | inbound | any, json | Yes | Parameters passed to the subflow |
result_out | outbound | any, json | Not applicable | Subflow execution result |
status_out | outbound | json | Not applicable | Execution status and metadata |
error_out | outbound | error | Not applicable | Error details if subflow execution fails |
Configuration
| Field | Type | Required | Default | Options and constraints |
|---|---|---|---|---|
flow_id | string | Yes | Not set | ID of the flow to invoke as a subflow |
flow_version | string | No | "latest" | Specific version or 'latest' |
timeout_seconds | number | No | 300 | Minimum 10; Maximum 3600; Execution timeout in seconds |
wait_for_completion | boolean | No | true | Block until the subflow finishes (up to Timeout) and emit its result |
pass_secrets | boolean | No | true | Forward current context secrets to subflow |
parameter_mapping | json | No | Not set | Map upstream fields to subflow input parameters: {subflow_param: upstream_field} |
Example configuration
{
"flow_id": "your-saved-flow",
"flow_version": "latest",
"wait_for_completion": true,
"timeout_seconds": 120,
"pass_secrets": false
}Wait / Delay
Type: wait. Catalog availability: production.
Pause execution for a specified time.
Prerequisites and behavior: Waits for the configured delay and then emits a trigger. The delay consumes execution time and is bounded by the node/runtime timeout. Use a schedule for long delays instead of holding a worker.
Python dependency: No additional provider client beyond the base SDK.
Ports
| Port | Direction | Data types | Required input | Description |
|---|---|---|---|---|
trigger_in | inbound | any | Yes | Signal to start waiting |
trigger_out | outbound | trigger | Not applicable | Signal emitted after wait completes |
error_out | outbound | error | Not applicable | Error details if wait is cancelled |
Configuration
| Field | Type | Required | Default | Options and constraints |
|---|---|---|---|---|
delay_seconds | number | Yes | 5 | Minimum 0; Maximum 3600; Duration to wait in seconds |
Example configuration
{
"delay_seconds": 5
}Python, shell, and containers
Use these nodes when your integration needs trusted application code, an installed command, or a Docker image. They run with the permissions and capabilities of the execution environment. A node appearing in the catalog does not make its dependencies available in every hosted runtime.
| Node | Type | Catalog availability |
|---|---|---|
| Docker Container | docker_container | production |
| Python Function | python_function | production |
| Shell Command | shell_command | production |
Docker Container
Type: docker_container. Catalog availability: production.
Run arbitrary Docker images.
Prerequisites and behavior: Requires a reachable Docker daemon and permission to run the selected image. A catalog entry does not make Docker available in every hosted runtime. Inspect the exit code and logs. This node cannot provision a daemon for you.
Python dependency: docker package and reachable Docker daemon
Ports
| Port | Direction | Data types | Required input | Description |
|---|---|---|---|---|
input_in | inbound | any | No | Input data mounted as environment variables |
output_out | outbound | string | Not applicable | Container stdout output |
error_out | outbound | error | Not applicable | Error details if container fails |
Configuration
| Field | Type | Required | Default | Options and constraints |
|---|---|---|---|---|
image | string | Yes | Not set | Docker image to run |
command | string | No | Not set | Command to run in container |
env_vars | json | No | Not set | Environment variables to pass to container |
Example configuration
{
"image": "python:3.11-slim",
"command": "python --version"
}Python Function
Type: python_function. Catalog availability: production.
Execute custom Python code or import functions.
Prerequisites and behavior: Inline code must define run(input_data). An import path can address module:attribute, but the exposed base validation still requires a nonempty code field. Python execution is not a hostile-code sandbox; only run trusted code and ensure imports exist in the execution environment.
Python dependency: No additional provider client beyond the base SDK.
Ports
| Port | Direction | Data types | Required input | Description |
|---|---|---|---|---|
input_in | inbound | any | No | Input data passed to the function |
output_out | outbound | any | Not applicable | Return value from the function |
error_out | outbound | error | Not applicable | Error details if function fails |
Configuration
| Field | Type | Required | Default | Options and constraints |
|---|---|---|---|---|
code | code | Yes | Not set | Python code that defines a run(input_data) function |
import_path | string | No | Not set | Alternative: Python import path (module:attribute) instead of code |
Example configuration
{
"code": "def run(input_data):\n return {\"count\": len(input_data or [])}"
}Shell Command
Type: shell_command. Catalog availability: production.
Execute shell commands.
Prerequisites and behavior: Requires the command and binaries to exist in the selected runtime. Supports working directory, environment overrides, and a command timeout. Output ports contain stdout, stderr, and exit code. Shell commands execute with runtime permissions; do not interpolate untrusted input.
Python dependency: No additional provider client beyond the base SDK.
Ports
| Port | Direction | Data types | Required input | Description |
|---|---|---|---|---|
trigger_in | inbound | any | No | Optional trigger input |
stdout_out | outbound | string | Not applicable | Command stdout |
exit_code_out | outbound | number | Not applicable | Process exit code |
error_out | outbound | error | Not applicable | Error details or stderr |
Configuration
| Field | Type | Required | Default | Options and constraints |
|---|---|---|---|---|
command | code | Yes | Not set | Shell command to execute |
work_dir | string | No | Not set | Working directory for command execution |
env_vars | json | No | Not set | Additional environment variables as JSON |
_timeout_seconds | number | No | 300 | Minimum 1; Maximum 3600; Command timeout in seconds |
Example configuration
{
"command": "python --version",
"_timeout_seconds": 30
}Troubleshoot a node integration
| Symptom | Recommended action |
|---|---|
| Missing dependency | Install the listed client in the actual execution runtime, then rerun the same small input. |
| Required field not set | Supply the field explicitly; schema defaults are not automatically applied by the Python constructor. |
| Secret not found | Match the exact stored name, reference syntax, environment, and credential shape. |
| Connection refused or timed out | Check destination address, network access, provider health, and client timeout. |
| Permission denied | Confirm the source account and least privileges for the requested query/read/write. |
| Output count lower than input count | Inspect warnings, batch errors, filters, file limits, and skipped malformed records. |
| Selected node fails with the documented TypeError | Use the stated Python-task alternative; dependency installation alone does not fix these known runtime issues. |
| Preview node returns not_available or times out | Verify the hosted capability and timeout budget; do not infer success from the node wrapper alone. |
For custom integration behavior, create a node or implement a Python task. See production guidance and limits before expanding batch size or concurrency.