Skip to content
Docs/Connect services

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 pageChoose 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 integration

Choose and configure an integration

  1. Find the node below and check its availability and known limitations.
  2. Provision your destination/source and grant the credentials only the access the operation needs. Network access from the execution environment is required.
  3. Store credentials with secrets. A configuration value such as secret:postgres_connection is a reference, not the credential itself.
  4. 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.
  5. 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:

Python
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_seconds can 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_out port 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_type and 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

NodeTypeCatalog availability
Azure Blob Ingestazure_blob_ingestproduction
BigQuery Readerbigquery_readerproduction
Document Parserdocument_parserproduction
GCS Ingestgcs_ingestproduction
HTTP Fetchhttp_fetchproduction
Kafka Consumerkafka_consumerproduction
MongoDB Readermongodb_readerproduction
MySQL Readermysql_readerproduction
MySQL Writermysql_writerproduction
Postgres Readerpostgres_readerproduction
Redshift Readerredshift_readerproduction
S3 Ingests3_ingestproduction
SFTP Ingestsftp_ingestproduction
Snowflake Readersnowflake_readerproduction

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

PortDirectionData typesRequired inputDescription
trigger_ininboundany, triggerNoOptional trigger signal to start ingestion
data_outoutboundbinary, dataframe, jsonNot applicableIngested data from Azure Blob Storage
metadata_outoutboundjsonNot applicableAzure blob metadata (name, size, last_modified)
error_outoutbounderror, jsonNot applicableError details if operation fails

Configuration

FieldTypeRequiredDefaultOptions and constraints
containerstringYesNot setNone
prefixstringNoNot setNone
account_urlstringNoNot setRequired when using a credential/account key instead of a full connection string
connection_refsecret_refNoNot setAzure Storage connection string secret; or set account_url + credential_ref
credential_refsecret_refNoNot setNone
file_formatselectYes"json"Choices: json, jsonl, csv, text, binary
max_filesnumberNo100Minimum 1

Example configuration

JSON
{
  "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

PortDirectionData typesRequired inputDescription
trigger_ininboundany, triggerNoOptional trigger to start query
data_outoutbounddataframe, jsonNot applicableRows from BigQuery query
error_outoutbounderror, jsonNot applicableError details if operation fails

Configuration

FieldTypeRequiredDefaultOptions and constraints
projectstringYesNot setNone
querycodeYesNot setNone

Example configuration

JSON
{
  "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

PortDirectionData typesRequired inputDescription
file_ininboundbinary, documentYesBinary file content (PDF, DOCX, HTML, Markdown, or text)
text_outoutbounddocument, stringNot applicableExtracted text content from the document
metadata_outoutboundjsonNot applicableDocument metadata (format, pages, encoding, etc.)
error_outoutbounderror, jsonNot applicableError details if parsing fails

Configuration

FieldTypeRequiredDefaultOptions and constraints
formatselectYes"auto"Choices: auto, pdf, docx, html, markdown, text; Document format. Use 'auto' to detect from content or magic bytes.
extract_imagesbooleanNofalseIf true, extract embedded images as base64-encoded data in metadata
page_rangestringNoNot setFor PDF: extract specific pages (e.g., '1-10' or '1,3,5'). Leave empty for all pages.

Example configuration

JSON
{
  "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

PortDirectionData typesRequired inputDescription
trigger_ininboundany, triggerNoOptional trigger signal to start ingestion
data_outoutboundbinary, dataframe, jsonNot applicableIngested data from GCS
metadata_outoutboundjsonNot applicableGCS object metadata (name, size, updated)
error_outoutbounderror, jsonNot applicableError details if operation fails

Configuration

FieldTypeRequiredDefaultOptions and constraints
bucketstringYesNot setNone
prefixstringNoNot setNone
file_formatselectYes"json"Choices: json, jsonl, csv, text, binary
projectstringNoNot setNone
credentials_refsecret_refNoNot setOptional service-account JSON secret; falls back to ambient GCP credentials when unset
max_filesnumberNo100Minimum 1

Example configuration

JSON
{
  "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

PortDirectionData typesRequired inputDescription
trigger_ininboundanyNoOptional trigger or request body
response_outoutboundbinary, json, stringNot applicableHTTP response body
headers_outoutboundjsonNot applicableHTTP response headers
error_outoutbounderror, jsonNot applicableError details if operation fails

Configuration

FieldTypeRequiredDefaultOptions and constraints
urlstringYesNot setNone
methodselectYes"GET"Choices: GET, POST, PUT, DELETE
headersjsonNoNot setNone
bodytextareaNoNot setNone
timeoutnumberNo30Minimum 1; Maximum 300

Example configuration

JSON
{
  "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

PortDirectionData typesRequired inputDescription
trigger_ininboundtriggerNoOptional trigger to start consuming
messages_outoutboundjson, listNot applicableConsumed Kafka messages
error_outoutbounderror, jsonNot applicableError details if operation fails

Configuration

FieldTypeRequiredDefaultOptions and constraints
brokersstringYesNot setNone
topicstringYesNot setNone
group_idstringYesNot setNone
max_messagesnumberNo100Minimum 1

Example configuration

JSON
{
  "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

PortDirectionData typesRequired inputDescription
trigger_ininboundany, triggerNoOptional trigger signal to start ingestion
filter_ininboundjsonNoOptional MongoDB query filter (dict) overriding config filter
data_outoutboundjson, listNot applicableDocuments returned from the collection
error_outoutbounderror, jsonNot applicableError details if operation fails

Configuration

FieldTypeRequiredDefaultOptions and constraints
connection_refsecret_refYesNot setmongodb:// or mongodb+srv:// URI
databasestringYesNot setNone
collectionstringYesNot setNone
filterjsonNoNot setNone
projectionjsonNoNot setNone
limitnumberNo1000Minimum 1

Example configuration

JSON
{
  "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

PortDirectionData typesRequired inputDescription
trigger_ininboundany, triggerNoOptional trigger signal to start ingestion
params_ininboundjson, listNoOptional parameters for parameterized queries (list or dict)
data_outoutbounddataframe, jsonNot applicableRows returned from the SQL query
error_outoutbounderror, jsonNot applicableError details if operation fails

Configuration

FieldTypeRequiredDefaultOptions and constraints
hoststringYesNot setNone
portnumberNo3306Minimum 1; Maximum 65535
databasestringYesNot setNone
userstringYesNot setNone
password_refsecret_refYesNot setNone
querycodeYesNot setNone
fetch_sizenumberNo1000Minimum 1
charsetstringNo"utf8mb4"None
sslbooleanNofalseNone

Example configuration

JSON
{
  "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

PortDirectionData typesRequired inputDescription
rows_ininbounddataframe, json, listYesRows to write (list of dicts)
result_outoutboundjsonNot applicableWrite result with affected row count
error_outoutbounderror, jsonNot applicableError details if operation fails

Configuration

FieldTypeRequiredDefaultOptions and constraints
hoststringYesNot setNone
portnumberNo3306Minimum 1; Maximum 65535
databasestringYesNot setNone
userstringYesNot setNone
password_refsecret_refYesNot setNone
tablestringYesNot setNone
modeselectNo"insert"Choices: insert, upsert, insert_ignore
batch_sizenumberNo500Minimum 1
charsetstringNo"utf8mb4"None

Example configuration

JSON
{
  "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

PortDirectionData typesRequired inputDescription
trigger_ininboundany, triggerNoOptional trigger to start query
params_ininboundjsonNoOptional parameters for parameterized queries
data_outoutbounddataframe, jsonNot applicableRows returned from the SQL query
error_outoutbounderror, jsonNot applicableError details if operation fails

Configuration

FieldTypeRequiredDefaultOptions and constraints
connection_refsecret_refYesNot setNone
querycodeYesNot setNone
fetch_sizenumberNo1000Minimum 1

Example configuration

JSON
{
  "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

PortDirectionData typesRequired inputDescription
trigger_ininboundany, triggerNoOptional trigger signal to start ingestion
data_outoutbounddataframe, jsonNot applicableRows returned from the Redshift query
error_outoutbounderror, jsonNot applicableError details if operation fails

Configuration

FieldTypeRequiredDefaultOptions and constraints
hoststringYesNot setNone
portnumberNo5439Minimum 1; Maximum 65535
databasestringYesNot setNone
userstringYesNot setNone
password_refsecret_refYesNot setNone
querycodeYesNot setNone
fetch_sizenumberNo1000Minimum 1

Example configuration

JSON
{
  "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

PortDirectionData typesRequired inputDescription
trigger_ininboundany, triggerNoOptional trigger signal to start ingestion
data_outoutboundbinary, dataframe, jsonNot applicableIngested data from S3
metadata_outoutboundjsonNot applicableS3 object metadata (key, size, last_modified)
error_outoutbounderror, jsonNot applicableError details if operation fails

Configuration

FieldTypeRequiredDefaultOptions and constraints
bucketstringYesNot setNone
prefixstringNoNot setNone
file_formatselectYes"json"Choices: json, csv, parquet, text, binary
aws_regionstringNoNot setNone
max_filesnumberNo100Minimum 1

Example configuration

JSON
{
  "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

PortDirectionData typesRequired inputDescription
trigger_ininboundany, triggerNoOptional trigger signal to start ingestion
data_outoutboundbinary, dataframe, jsonNot applicableDownloaded file contents
metadata_outoutboundjsonNot applicableSFTP file metadata (path, size, mtime)
error_outoutbounderror, jsonNot applicableError details if operation fails

Configuration

FieldTypeRequiredDefaultOptions and constraints
hoststringYesNot setNone
portnumberNo22Minimum 1; Maximum 65535
userstringYesNot setNone
password_refsecret_refNoNot setNone
private_key_refsecret_refNoNot setPEM private key; alternative to password auth
remote_pathstringYesNot setNone
file_formatselectYes"binary"Choices: binary, text, json, jsonl, csv
max_filesnumberNo50Minimum 1

Example configuration

JSON
{
  "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

PortDirectionData typesRequired inputDescription
trigger_ininboundany, triggerNoOptional trigger signal to start ingestion
data_outoutbounddataframe, jsonNot applicableRows returned from the Snowflake query
error_outoutbounderror, jsonNot applicableError details if operation fails

Configuration

FieldTypeRequiredDefaultOptions and constraints
accountstringYesNot setNone
userstringYesNot setNone
password_refsecret_refYesNot setNone
warehousestringNoNot setNone
databasestringNoNot setNone
schemastringNo"PUBLIC"None
rolestringNoNot setNone
querycodeYesNot setNone
fetch_sizenumberNo1000Minimum 1

Example configuration

JSON
{
  "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

NodeTypeCatalog availability
Aggregatoraggregatorproduction
Column Mappercolumn_mapperproduction
Data Filterdata_filterproduction
Data Joindata_joinproduction
Data Normalizerdata_normalizerproduction
Data Qualitydata_qualityproduction
Deduplicatordeduplicatorproduction
Pandas Transformpandas_transformproduction
Schema Validatorschema_validatorproduction
SQL Transformsql_transformproduction
Text Chunkertext_chunkerproduction

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

PortDirectionData typesRequired inputDescription
data_ininbounddataframe, json, listYesRecords to aggregate
aggregated_outoutbounddataframe, jsonNot applicableOne record per group with computed aggregates
error_outoutbounderror, jsonNot applicableError details if aggregation fails

Configuration

FieldTypeRequiredDefaultOptions and constraints
group_bystringYesNot setComma-separated field names to group by
aggregationsjsonYesNot setList of {field, function, alias}. Functions: sum, avg, count, min, max, first, last, collect

Example configuration

JSON
{
  "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

PortDirectionData typesRequired inputDescription
data_ininbounddataframe, json, listYesRecords with columns to map
data_outoutbounddataframe, json, listNot applicableRecords with mapped columns
error_outoutbounderror, jsonNot applicableError details if mapping fails

Configuration

FieldTypeRequiredDefaultOptions and constraints
mappingsjsonYesNot setList of mappings. Simple rename: {source, target}. Computed column: {expression, target}. Use 'record' variable in expressions.
drop_unmappedbooleanNofalseIf true, only keep mapped columns in output

Example configuration

JSON
{
  "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

PortDirectionData typesRequired inputDescription
data_ininbounddataframe, json, listYesRecords to filter
matched_outoutbounddataframe, json, listNot applicableRecords that matched the filter condition
unmatched_outoutbounddataframe, json, listNot applicableRecords that did not match the filter condition
error_outoutbounderror, jsonNot applicableError details if filtering fails

Configuration

FieldTypeRequiredDefaultOptions and constraints
modeselectYes"expression"Choices: expression, field_match; Filter mode: expression (Python) or simple field matching
conditioncodeYesNot setPython expression evaluated per record. Use 'record' variable. Example: record['age'] > 18
fieldstringNoNot setField name (for field_match mode)
operatorselectNo"equals"Choices: equals, not_equals, contains, gt, lt, gte, lte, in, not_in, regex; Comparison operator (for field_match mode)
valuestringNoNot setValue to compare against (for field_match mode)

Example configuration

JSON
{
  "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

PortDirectionData typesRequired inputDescription
left_ininbounddataframe, json, listYesLeft dataset for join
right_ininbounddataframe, json, listYesRight dataset for join
joined_outoutbounddataframe, json, listNot applicableResult of the join operation
unmatched_outoutboundjson, listNot applicableRecords that had no match in the join
error_outoutbounderror, jsonNot applicableError details if join fails

Configuration

FieldTypeRequiredDefaultOptions and constraints
left_keystringYesNot setField name in left dataset to join on
right_keystringYesNot setField name in right dataset to join on
join_typeselectYes"inner"Choices: inner, left, right, full; Type of join to perform
conflict_resolutionselectNo"prefer_left"Choices: prefer_left, prefer_right, suffix; How to handle duplicate field names

Example configuration

JSON
{
  "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

PortDirectionData typesRequired inputDescription
data_ininbounddataframe, jsonYesData to normalize
data_outoutbounddataframe, jsonNot applicableCleaned and normalized data
error_outoutbounderror, jsonNot applicableError details if operation fails

Configuration

FieldTypeRequiredDefaultOptions and constraints
rulesjsonYesNot setNone

Example configuration

JSON
{
  "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

PortDirectionData typesRequired inputDescription
data_ininbounddataframe, json, listYesRows (list of dicts / dataframe / json) to validate
pass_outoutbounddataframe, json, listNot applicableInput payload forwarded when no blocking check failed
fail_outoutbounddataframe, json, listNot applicableInput payload forwarded when a blocking check failed
report_outoutboundjsonNot applicableStructured report of every check result

Configuration

FieldTypeRequiredDefaultOptions and constraints
checksjsonYesNot setJSON 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_failureselectNo"route"Choices: route, error; What to do when a fail/quarantine-severity check fails.

Example configuration

JSON
{
  "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

PortDirectionData typesRequired inputDescription
data_ininbounddataframe, json, listYesData with possible duplicates
unique_outoutbounddataframe, json, listNot applicableData with duplicates removed
duplicates_outoutbounddataframe, json, listNot applicableRecords that were identified as duplicates
error_outoutbounderror, jsonNot applicableError details if operation fails

Configuration

FieldTypeRequiredDefaultOptions and constraints
key_columnsstringYesNot setNone
strategyselectYes"keep_first"Choices: keep_first, keep_last, remove_all

Example configuration

JSON
{
  "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

PortDirectionData typesRequired inputDescription
data_ininbounddataframe, jsonYesTabular data to transform
data_outoutbounddataframe, jsonNot applicableResult of pandas transformation
error_outoutbounderror, jsonNot applicableError details if operation fails

Configuration

FieldTypeRequiredDefaultOptions and constraints
expressioncodeYesNot setNone

Example configuration

JSON
{
  "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

PortDirectionData typesRequired inputDescription
data_ininbounddataframe, jsonYesData to validate
valid_outoutbounddataframe, jsonNot applicableData that passed validation
invalid_outoutboundjsonNot applicableData that failed validation with error details
error_outoutbounderror, jsonNot applicableError details if operation fails

Configuration

FieldTypeRequiredDefaultOptions and constraints
schemajsonYesNot setNone
strictbooleanNotrueNone

Example configuration

JSON
{
  "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

PortDirectionData typesRequired inputDescription
data_ininbounddataframe, jsonYesData to query (available as 'input' table)
data_outoutbounddataframe, jsonNot applicableRows from the SQL query
error_outoutbounderror, jsonNot applicableError details if operation fails

Configuration

FieldTypeRequiredDefaultOptions and constraints
querycodeYesNot setNone

Example configuration

JSON
{
  "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

PortDirectionData typesRequired inputDescription
text_ininbounddocument, list, stringYesText content to chunk
chunks_outoutboundjson, listNot applicableList of text chunks with metadata (index, start_offset, end_offset)
metadata_outoutboundjsonNot applicableChunking statistics (total_chunks, average_chunk_size, etc.)
error_outoutbounderror, jsonNot applicableError details if chunking fails

Configuration

FieldTypeRequiredDefaultOptions and constraints
strategyselectYes"fixed_size"Choices: fixed_size, sentence, paragraph, recursive; Strategy for splitting text into chunks
chunk_sizenumberNo512Minimum 50; Maximum 8192; Target number of characters per chunk
chunk_overlapnumberNo50Minimum 0; Number of overlapping characters between consecutive chunks
separatorstringNoNot setCustom separator for splitting (for fixed_size strategy). Use \n for newline.

Example configuration

JSON
{
  "strategy": "fixed_size",
  "chunk_size": 512,
  "chunk_overlap": 50
}

Language models and prompts

NodeTypeCatalog availability
Claude Summaryclaude_summaryproduction
GPT-4 Classifygpt4_classifyproduction
LLM Completionllm_completionproduction
LLM Routerllm_routerproduction
OpenAI Embeddingsopenai_embeddingsproduction
Prompt Templateprompt_templateproduction
Structured Outputstructured_outputproduction

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

PortDirectionData typesRequired inputDescription
text_ininbounddocument, json, stringYesText to summarize
summary_outoutboundjson, stringNot applicableGenerated summary text
error_outoutboundjsonNot applicableError output on failure

Configuration

FieldTypeRequiredDefaultOptions and constraints
modelselectYes"claude-sonnet-4-5-20250929"Choices: claude-sonnet-4-5-20250929, claude-haiku-4-5-20251001, claude-opus-4-5-20251101
system_prompttextareaNoNot setNone
max_tokensnumberNo1024Minimum 1
api_key_refsecret_refYesNot setNone

Example configuration

JSON
{
  "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

PortDirectionData typesRequired inputDescription
text_ininboundjson, stringYesText to classify
classification_outoutboundjsonNot applicableClassification result with category and confidence
error_outoutboundjsonNot applicableError output on failure

Configuration

FieldTypeRequiredDefaultOptions and constraints
modelselectYes"gpt-4o"Choices: gpt-4o, gpt-4o-mini, gpt-4-turbo
system_prompttextareaYesNot setNone
categoriesstringYesNot setNone
api_key_refsecret_refYesNot setNone
temperaturenumberNo0.0Minimum 0; Maximum 2

Example configuration

JSON
{
  "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

PortDirectionData typesRequired inputDescription
prompt_ininboundjson, stringYesInput prompt text or JSON
system_ininboundstringNoOptional system prompt override
completion_outoutboundjson, stringNot applicableGenerated completion text or JSON
usage_outoutboundjsonNot applicableToken usage information (input_tokens, output_tokens)
error_outoutbounderror, jsonNot applicableError output on failure

Configuration

FieldTypeRequiredDefaultOptions and constraints
providerselectYes"openai"Choices: openai, anthropic, custom; LLM provider
modelstringYes"gpt-4o"Model identifier
system_prompttextareaNoNot setDefault system prompt for the model
temperaturenumberNo0.7Minimum 0; Maximum 2; Sampling temperature (0=deterministic, 2=maximum randomness)
max_tokensnumberNo1024Minimum 1; Maximum tokens in response
api_key_refsecret_refYesNot setSecret reference to API key
base_urlstringNoNot setCustom endpoint URL (for OpenAI-compatible providers)
response_formatselectNo"text"Choices: text, json_object; Expected response format

Example configuration

JSON
{
  "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

PortDirectionData typesRequired inputDescription
request_ininboundjson, stringYesRequest to route to optimal LLM
response_outoutboundjson, stringNot applicableResponse from selected LLM
routing_info_outoutboundjsonNot applicableWhich model was selected and why
error_outoutboundjsonNot applicableError output on failure

Configuration

FieldTypeRequiredDefaultOptions and constraints
strategyselectYes"cost"Choices: cost, quality, balanced
modelsjsonYesNot setNone

Example configuration

JSON
{
  "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

PortDirectionData typesRequired inputDescription
text_ininboundjson, list, stringYesText data to embed
embeddings_outoutboundembedding, listNot applicableGenerated vector embeddings
error_outoutboundjsonNot applicableError output on failure

Configuration

FieldTypeRequiredDefaultOptions and constraints
modelselectYes"text-embedding-3-small"Choices: text-embedding-3-small, text-embedding-3-large, text-embedding-ada-002
api_key_refsecret_refYesNot setNone
batch_sizenumberNo100Minimum 1; Maximum 2048

Example configuration

JSON
{
  "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

PortDirectionData typesRequired inputDescription
variables_ininboundany, jsonYesTemplate variables as JSON/dict
context_ininboundjson, list, stringNoRAG context or retrieved chunks to inject
prompt_outoutboundstringNot applicableRendered prompt template
error_outoutbounderror, jsonNot applicableError output on failure

Configuration

FieldTypeRequiredDefaultOptions and constraints
templatetextareaYesNot setPrompt template with {{variable}} placeholders. Use {{context}} for RAG retrieved chunks.
context_separatorstringNo"\n---\n"Separator for joining context items
max_context_lengthnumberNo4000Maximum characters for context injection to avoid token overflow

Example configuration

JSON
{
  "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

PortDirectionData typesRequired inputDescription
text_ininbounddocument, json, stringYesUnstructured text to extract from
schema_ininboundjsonNoOptional JSON schema override
structured_outoutboundjsonNot applicableExtracted structured data as JSON
raw_response_outoutboundstringNot applicableRaw LLM response text
error_outoutbounderror, jsonNot applicableError output on failure

Configuration

FieldTypeRequiredDefaultOptions and constraints
output_schemajsonYesNot setJSON Schema defining the expected output structure
modelselectNo"gpt-4o"Choices: gpt-4o, gpt-4o-mini, claude-sonnet-4-5-20250929; LLM model to use for extraction
extraction_prompttextareaNoNot setAdditional instructions for the extraction (optional)
api_key_refsecret_refYesNot setSecret reference to API key
strict_validationbooleanNotrueValidate extracted JSON against schema

Example configuration

JSON
{
  "output_schema": {
    "type": "object",
    "required": [
      "topic"
    ],
    "properties": {
      "topic": {
        "type": "string"
      }
    }
  },
  "model": "gpt-4o",
  "api_key_ref": "secret:openai_key",
  "strict_validation": true
}
NodeTypeCatalog availability
Chroma Storechroma_storeproduction
OpenSearch Writeopensearch_writeproduction
pgvector Writepgvector_writeproduction
Pinecone Writepinecone_writeproduction
Qdrant Writeqdrant_writeproduction
Vector Searchvector_searchproduction
Weaviate Insertweaviate_insertproduction

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

PortDirectionData typesRequired inputDescription
data_ininboundembedding, json, listYesData to store (list of {id, embedding/values, document, metadata})
result_outoutboundjsonNot applicableStore operation result
error_outoutbounderrorNot applicableError details if store fails

Configuration

FieldTypeRequiredDefaultOptions and constraints
collectionstringYesNot setChromaDB collection name
hoststringNo"localhost:8000"ChromaDB server host:port
api_key_refsecret_refNoNot setOptional secret reference to authentication token

Example configuration

JSON
{
  "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

PortDirectionData typesRequired inputDescription
vectors_ininboundembedding, json, listYesVector records to upsert (list of {id, values, metadata})
result_outoutboundjsonNot applicableUpsert result with the number of vectors written
error_outoutbounderror, jsonNot applicableError details if the write fails

Configuration

FieldTypeRequiredDefaultOptions and constraints
hostsstringYesNot setComma-separated host URLs
indexstringYesNot setNone
vector_fieldstringNo"embedding"None
usernamestringNoNot setNone
password_refsecret_refNoNot setNone
use_sslbooleanNotrueNone
batch_sizenumberNo500Minimum 1

Example configuration

JSON
{
  "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

PortDirectionData typesRequired inputDescription
vectors_ininboundembedding, json, listYesVector records to upsert (list of {id, values, metadata})
result_outoutboundjsonNot applicableUpsert result with the number of vectors written
error_outoutbounderror, jsonNot applicableError details if the write fails

Configuration

FieldTypeRequiredDefaultOptions and constraints
connection_refsecret_refYesNot setlibpq connection string / DSN
tablestringYesNot setNone
id_columnstringNo"id"None
vector_columnstringNo"embedding"None
metadata_columnstringNo"metadata"JSONB column for record metadata; leave blank to skip
upsertbooleanNotrueNone
batch_sizenumberNo200Minimum 1

Example configuration

JSON
{
  "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

PortDirectionData typesRequired inputDescription
vectors_ininboundembedding, json, listYesVector embeddings to upsert (list of {id, values, metadata})
result_outoutboundjsonNot applicableUpsert operation result with count
error_outoutbounderrorNot applicableError details if upsert fails

Configuration

FieldTypeRequiredDefaultOptions and constraints
indexstringYesNot setPinecone index name
namespacestringNoNot setOptional Pinecone namespace
api_key_refsecret_refYesNot setSecret reference to Pinecone API key

Example configuration

JSON
{
  "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

PortDirectionData typesRequired inputDescription
vectors_ininboundembedding, json, listYesVector records to upsert (list of {id, values, metadata})
result_outoutboundjsonNot applicableUpsert result with the number of vectors written
error_outoutbounderror, jsonNot applicableError details if the write fails

Configuration

FieldTypeRequiredDefaultOptions and constraints
urlstringYesNot setNone
collectionstringYesNot setNone
api_key_refsecret_refNoNot setOptional; required for Qdrant Cloud
batch_sizenumberNo100Minimum 1

Example configuration

JSON
{
  "url": "https://qdrant.example.com:6333",
  "collection": "articles",
  "api_key_ref": "secret:qdrant_key",
  "batch_size": 100
}

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

PortDirectionData typesRequired inputDescription
query_ininboundembedding, json, stringYesQuery embedding, string, or JSON to search for
results_outoutboundjson, listNot applicableSearch results as list of matched records
scores_outoutboundjsonNot applicableSimilarity scores for each result
error_outoutbounderror, jsonNot applicableError details if search fails

Configuration

FieldTypeRequiredDefaultOptions and constraints
providerselectYesNot setChoices: pinecone, weaviate, chroma; Vector database provider
indexstringYesNot setIndex or collection name to search in
top_knumberNo5Minimum 1; Maximum 100; Number of results to return
api_key_refsecret_refNoNot setSecret reference to API key
urlstringNoNot setURL for Weaviate or Chroma instances
namespacestringNoNot setNamespace (Pinecone only)
score_thresholdnumberNo0.0Minimum 0.0; Maximum 1.0; Minimum similarity score to include in results
include_metadatabooleanNotrueInclude metadata in results
filterjsonNoNot setProvider-specific metadata filter (JSON)

Example configuration

JSON
{
  "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

PortDirectionData typesRequired inputDescription
data_ininboundjson, listYesData objects to insert (list of dicts)
result_outoutboundjsonNot applicableInsert operation result
error_outoutbounderrorNot applicableError details if insert fails

Configuration

FieldTypeRequiredDefaultOptions and constraints
class_namestringYesNot setWeaviate class name
urlstringYesNot setWeaviate instance URL
api_key_refsecret_refNoNot setOptional secret reference to API key for authentication

Example configuration

JSON
{
  "class_name": "Article",
  "url": "https://weaviate.example.com",
  "api_key_ref": "secret:weaviate_key"
}

Notifications and destinations

NodeTypeCatalog availability
Email Sendemail_sendproduction
S3 Writes3_writeproduction
Slack Alertslack_alertproduction
Webhook POSTwebhook_postproduction

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

PortDirectionData typesRequired inputDescription
data_ininboundanyYesData for email template variables
status_outoutboundjsonNot applicableEmail delivery status
error_outoutbounderrorNot applicableError details if send fails

Configuration

FieldTypeRequiredDefaultOptions and constraints
tostringYesNot setRecipient email address
subjectstringYesNot setEmail subject line
body_templatetextareaYesNot setEmail body with {{variable}} placeholders
smtp_hoststringYes"smtp.gmail.com"SMTP server hostname
smtp_portnumberNo587Minimum 1; Maximum 65535; SMTP server port
smtp_credential_refsecret_refYesNot setSecret reference to JSON with 'username' and 'password'

Example configuration

JSON
{
  "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

PortDirectionData typesRequired inputDescription
data_ininboundanyYesData to write to S3
result_outoutboundjsonNot applicableS3 write result with URI and metadata
error_outoutbounderrorNot applicableError details if write fails

Configuration

FieldTypeRequiredDefaultOptions and constraints
bucketstringYesNot setS3 bucket name
prefixstringNoNot setPath prefix for S3 keys
file_formatselectYes"json"Choices: json, csv, parquet; Output file format
aws_credential_refsecret_refNoNot setSecret reference to AWS credentials JSON

Example configuration

JSON
{
  "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

PortDirectionData typesRequired inputDescription
data_ininboundanyYesData to include in the message (available as template variables)
status_outoutboundjsonNot applicableStatus of the Slack message delivery
error_outoutbounderrorNot applicableError details if send fails

Configuration

FieldTypeRequiredDefaultOptions and constraints
channelstringYesNot setSlack channel or user to send to
message_templatetextareaYesNot setMessage text with {{variable}} placeholders
webhook_refsecret_refYesNot setSecret reference to Slack webhook URL

Example configuration

JSON
{
  "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

PortDirectionData typesRequired inputDescription
payload_ininboundanyYesData to send as webhook payload
response_outoutboundjsonNot applicableWebhook response (status code and body)
error_outoutbounderrorNot applicableError details if request fails

Configuration

FieldTypeRequiredDefaultOptions and constraints
urlstringYesNot setURL to POST to
headersjsonNoNot setCustom HTTP headers
body_templatetextareaNoNot setJSON template for request body (if empty, uses raw payload)

Example configuration

JSON
{
  "url": "https://your-service.example.com/hooks/orders",
  "headers": {
    "Content-Type": "application/json"
  }
}

Workflow control

NodeTypeCatalog availability
Batch Processorbatch_processorproduction
Conditional Branchconditional_branchproduction
Error Handlererror_handlerproduction
Human Approvalhuman_approvalpreview
Looplooppreview
Mergemergeproduction
Subflowsubflowpreview
Wait / Delaywaitproduction

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

PortDirectionData typesRequired inputDescription
items_ininbounddataframe, json, listYesFull collection to process
batch_outoutboundjson, listNot applicableEmits one batch at a time
progress_outoutboundjsonNot applicableProgress updates (batch_number, total_batches, percent)
completed_outoutboundjsonNot applicableFinal summary when all batches done
error_outoutbounderrorNot applicableError details if batch processing fails

Configuration

FieldTypeRequiredDefaultOptions and constraints
batch_sizenumberYes100Minimum 1; Maximum 10000; Number of items per batch
max_concurrentnumberNo1Minimum 1; Maximum 50; Max batches to process concurrently
delay_between_batchesnumberNo0Minimum 0; Seconds to wait between batches (for rate limiting)
batch_codecodeNoNot setOptional 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_errorbooleanNotrueContinue processing remaining batches if one fails

Example configuration

JSON
{
  "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

PortDirectionData typesRequired inputDescription
data_ininboundanyYesData to evaluate the condition against
true_outoutboundanyNot applicableOutput when condition is true
false_outoutboundanyNot applicableOutput when condition is false
error_outoutbounderrorNot applicableError details if condition evaluation fails

Configuration

FieldTypeRequiredDefaultOptions and constraints
conditioncodeYesNot setPython expression using 'data' variable (e.g., data.get('status') == 'active')

Example configuration

JSON
{
  "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

PortDirectionData typesRequired inputDescription
data_ininboundanyYesNormal data path
error_ininbounderror, jsonNoUpstream error signals
success_outoutboundanyNot applicableData when no error
fallback_outoutboundanyNot applicableFallback data when error handled
unhandled_outoutbounderrorNot applicableErrors that couldn't be handled

Configuration

FieldTypeRequiredDefaultOptions and constraints
strategyselectYes"log_and_continue"Choices: default_value, skip, log_and_continue, propagate; Strategy for handling errors
default_valuejsonNoNot setValue to emit on fallback_out when strategy=default_value
max_errorsnumberNo0Minimum 0; Max errors before propagating (0=unlimited)
error_message_templatetextareaNoNot setCustom error message template with {{error}} placeholder

Example configuration

JSON
{
  "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

PortDirectionData typesRequired inputDescription
data_ininboundanyYesData pending approval
approved_outoutboundanyNot applicableData after approval
rejected_outoutboundanyNot applicableData if rejected
timeout_outoutboundanyNot applicableData if approval times out
error_outoutbounderrorNot applicableError details if approval fails

Configuration

FieldTypeRequiredDefaultOptions and constraints
approval_messagetextareaYesNot setMessage shown to reviewer with {{variable}} placeholders
timeout_hoursnumberNo24Minimum 0.1; Maximum 720; Hours to wait before timeout
notification_channelselectNo"none"Choices: none, webhook, email, slack; Where to notify reviewers
webhook_urlstringNoNot setWebhook URL for notifications
approver_hintstringNoNot setSuggested approver name/role for routing
poll_interval_secondsnumberNo5Minimum 1; Maximum 3600; How often to check the approval store for a decision

Example configuration

JSON
{
  "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

PortDirectionData typesRequired inputDescription
items_ininbounddataframe, json, listYesThe collection to iterate over
item_outoutboundanyNot applicableLast processed result after the loop finishes
index_outoutboundnumberNot applicableCurrent iteration index (0-based)
completed_outoutboundjsonNot applicableSummary when all iterations complete
error_outoutbounderrorNot applicableError details if iteration fails

Configuration

FieldTypeRequiredDefaultOptions and constraints
max_iterationsnumberNo1000Minimum 1; Maximum 10000; Safety limit on iterations
item_keystringNoNot setIf items are dicts, extract this key as the item value
body_expressioncodeNoNot setOptional Python expression evaluated per item with 'item' and 'index' in scope (e.g. item['value'] * 2). Leave empty to pass items through unchanged.
body_codecodeNoNot setOptional Python code defining run(item, index) applied per item. Takes precedence over Body Expression when both are set.
continue_on_errorbooleanNotrueContinue processing remaining items if one item's body raises
collect_resultsbooleanNotrueCollect all iteration results into completed_out

Example configuration

JSON
{
  "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

PortDirectionData typesRequired inputDescription
input_ainboundanyYesFirst data source
input_binboundanyYesSecond data source
merged_outoutboundanyNot applicableCombined output from all inputs
error_outoutbounderrorNot applicableError details if merge fails

Configuration

FieldTypeRequiredDefaultOptions and constraints
strategyselectYes"concat"Choices: concat, zip, deep_merge, wait_all; How to combine the two inputs

Example configuration

JSON
{
  "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

PortDirectionData typesRequired inputDescription
params_ininboundany, jsonYesParameters passed to the subflow
result_outoutboundany, jsonNot applicableSubflow execution result
status_outoutboundjsonNot applicableExecution status and metadata
error_outoutbounderrorNot applicableError details if subflow execution fails

Configuration

FieldTypeRequiredDefaultOptions and constraints
flow_idstringYesNot setID of the flow to invoke as a subflow
flow_versionstringNo"latest"Specific version or 'latest'
timeout_secondsnumberNo300Minimum 10; Maximum 3600; Execution timeout in seconds
wait_for_completionbooleanNotrueBlock until the subflow finishes (up to Timeout) and emit its result
pass_secretsbooleanNotrueForward current context secrets to subflow
parameter_mappingjsonNoNot setMap upstream fields to subflow input parameters: {subflow_param: upstream_field}

Example configuration

JSON
{
  "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

PortDirectionData typesRequired inputDescription
trigger_ininboundanyYesSignal to start waiting
trigger_outoutboundtriggerNot applicableSignal emitted after wait completes
error_outoutbounderrorNot applicableError details if wait is cancelled

Configuration

FieldTypeRequiredDefaultOptions and constraints
delay_secondsnumberYes5Minimum 0; Maximum 3600; Duration to wait in seconds

Example configuration

JSON
{
  "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.

NodeTypeCatalog availability
Docker Containerdocker_containerproduction
Python Functionpython_functionproduction
Shell Commandshell_commandproduction

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

PortDirectionData typesRequired inputDescription
input_ininboundanyNoInput data mounted as environment variables
output_outoutboundstringNot applicableContainer stdout output
error_outoutbounderrorNot applicableError details if container fails

Configuration

FieldTypeRequiredDefaultOptions and constraints
imagestringYesNot setDocker image to run
commandstringNoNot setCommand to run in container
env_varsjsonNoNot setEnvironment variables to pass to container

Example configuration

JSON
{
  "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

PortDirectionData typesRequired inputDescription
input_ininboundanyNoInput data passed to the function
output_outoutboundanyNot applicableReturn value from the function
error_outoutbounderrorNot applicableError details if function fails

Configuration

FieldTypeRequiredDefaultOptions and constraints
codecodeYesNot setPython code that defines a run(input_data) function
import_pathstringNoNot setAlternative: Python import path (module:attribute) instead of code

Example configuration

JSON
{
  "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

PortDirectionData typesRequired inputDescription
trigger_ininboundanyNoOptional trigger input
stdout_outoutboundstringNot applicableCommand stdout
exit_code_outoutboundnumberNot applicableProcess exit code
error_outoutbounderrorNot applicableError details or stderr

Configuration

FieldTypeRequiredDefaultOptions and constraints
commandcodeYesNot setShell command to execute
work_dirstringNoNot setWorking directory for command execution
env_varsjsonNoNot setAdditional environment variables as JSON
_timeout_secondsnumberNo300Minimum 1; Maximum 3600; Command timeout in seconds

Example configuration

JSON
{
  "command": "python --version",
  "_timeout_seconds": 30
}

Troubleshoot a node integration

SymptomRecommended action
Missing dependencyInstall the listed client in the actual execution runtime, then rerun the same small input.
Required field not setSupply the field explicitly; schema defaults are not automatically applied by the Python constructor.
Secret not foundMatch the exact stored name, reference syntax, environment, and credential shape.
Connection refused or timed outCheck destination address, network access, provider health, and client timeout.
Permission deniedConfirm the source account and least privileges for the requested query/read/write.
Output count lower than input countInspect warnings, batch errors, filters, file limits, and skipped malformed records.
Selected node fails with the documented TypeErrorUse the stated Python-task alternative; dependency installation alone does not fix these known runtime issues.
Preview node returns not_available or times outVerify 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.