Savant Conversion Matrix
PlaidCloud converts Savant Labs analyses into native Advanced workflows. The importer maps each Savant agent to a workflow step, project variable, or canvas object, so a converted workflow runs cloud-native.
Each agent has a mapping tier:
- Full — every option of the agent has a valid mapping to a PlaidCloud step.
- Partial — the agent converts, and the option named in its row has no mapping: it becomes a named placeholder that refuses at run time, is refused by name, or is replaced by a stated fallback.
External-system connectors are connected, not converted — see Connecting to External Systems.
Agent Support
Section titled “Agent Support”Across the 33 agents: 33 Full, 0 Partial.
| Agent | Tier | PlaidCloud Equivalent | Converts | Option without a mapping |
|---|---|---|---|---|
Adapter Agent (adapter) |
Full | Select and schema projection step | Renames, retypes, and orders fields. | — |
API / Infer Agent (legacy service) (service) |
Full | Same as the API or Infer Agent, by serviceType | An LLMService converts as the Infer Agent and an APIService as the API Agent; a missing or misspelled serviceType is read from the node’s keys with a warning. | — |
API Agent (apiService) |
Full | Table Extract, REST Request, and a left join back | One GET, POST, PUT, PATCH or DELETE request per input row; the raw response body lands in a text column, HTTP errors stay as rows, every input row is kept, and a quota per period becomes a fractional requests-per-second. A relative URL joins its api_bindings base URL or REST connection host; a host, port or path from a row field is substituted per row; next-URL, Link-header, offset and page paging are followed. | — |
Blend Agent (blend) |
Full | Inner Join, Outer Join, Anti Join | Inner, left, right, full, anti and outer-excluding-inner blends, OR-joined, contains and is-part-of conditions, with matched and unmatched streams; columns a pivot or parse names only at run time are carried through. | — |
Dedupe Agent (deduplicate) |
Full | Table Extract with distinct rows | Keeps the first record per key, within Group By groups, and routes duplicates to a second stream or flags them. | — |
Destination Agent (destination) |
Full | Export: CSV, Export: Excel, Export: Parquet, JSON, Avro or XML, Export to PDF, Export: Tableau Hyper with Publish to Tableau, Export: External Database Tables, Export to Google Spreadsheet, Notify via Slack, or email | Writes through destination_bindings to a document account (CSV, TSV, TXT, Excel, Parquet, JSON, Avro, XML, PDF or a Tableau .hyper, in any Java charset, a character it lacks written as ?), a connection table, a Google Sheet, a Tableau data source or a Slack channel, or email recipients. Append, upsert, update and groupReplace merge on the match keys (a file or table is read back and rewritten; Tableau updates its rows in place). | — |
Explode Agent (explode) |
Full | Cross Join | Cross-joins a small side against the main stream. | — |
Filter Agent (filter) |
Full | Table Extract with a filter expression | Splits records by wizard or expression into true and false paths. | — |
Filter Pushdown (pdfilter) |
Full | Table Extract with a filter expression | Database-side filter, converted the same as Filter. | — |
Format Agent (format) |
Full | Table Extract with column renames, or Promote Header | Hides, retypes, renames and fills fields matched by name (contains, starts with, ends with) or by being empty; header-row promotion and is-empty matching run at run time in the Promote Header step. | — |
Fuse Agent (fuzzy_match) |
Full | Fuzzy Match, between a Union All and two joins | Stacks both inputs, matches records on the key fields with the deterministic Jaro/TF-IDF matcher at threshold 80, and joins both sides back with a Confidence Score. | — |
Group (group) |
Full | Canvas container | Preserved as workflow organization. | — |
Infer Agent (gen_ai) |
Full | AI/NLP prompt task | The prompt runs per row over the input fields on the visible LLM connection matching Savant’s provider and model; the answer lands in an AI Answer column beside every input column, and rowLimit caps the rows answered. | — |
JSON Agent (json) |
Full | JSON Parse | Flattens a JSON field into dotted-key columns, or explodes an array into one row per element; the keys are read from the data at run time. | — |
Notes Agent (notes) |
Full | Canvas annotation | Preserved as workflow context. | — |
Pivot Agent (pivot) |
Full | Pivot | Pivots rows to columns with aggregation. | — |
Recursion Agent (hierarchy) |
Full | Hierarchy Closure, Table Extract, and Multi-Table Join | Walks a parent/child tree to any depth, aggregating each node over the ids on its path to the root, itself included, and writing Depth and Path; a loop stops at the repeated node. | — |
Sample Agent (sample) |
Full | Table Extract with a row limit | Keeps the first N rows, optionally per group, a random percent or N rows, or one row in every N. | — |
Search and Replace (search_replace) |
Full | Table Extract with nested replace expressions, split across stages | Find/replace rules (contains or matches; replace or append), case-sensitive or not, whole word or not, applied in order over the chosen text fields, or every text field when none is named. | — |
Source Agent (source) |
Full | Import steps bound through source_bindings (Import: CSV, Import: Excel, Import: SQL) or an existing table |
Reads the bound table or document; an unbound source creates an empty import and a warning. | — |
Spatial Match Agent (spatial_match) |
Full | Spatial Match (executor), Cross Join, or Find Nearest | Intersects, within, contains, touches, crosses, overlaps, equals, disjoint and and/or multi-rule matches, geodesic within distance, nearest N with a maximum distance and a Distance column (combined with other rules as nearest-then-filter: AND joins, OR unions), and Cross, with matched and unmatched streams. | — |
Spatial Summarize Agent (spatial_summarize) |
Full | Spatial Combine, Spatial Centroid, and point-to-line steps | Union, intersect, bounding box, one or several geometric centers, and polyline or polygon builds, per group with an optional sort. | — |
Split Agent (split) |
Full | Split Text, or Table Extract with split_part columns | Splits a text field on a literal separator of any length into rows or columns, with trim and keep-original; the number of columns is read from the data at run time. | — |
Split Output (outlet) |
Full | Workflow edge | Routes a named output to its consumers. | — |
Stack Agent (multi_stack) |
Full | Union All | Stacks any number of inputs by name or position. | — |
Summarize Agent (summarize) |
Full | Table Extract with aggregation | Groups and aggregates, including first/last by a deterministic sort and per-row window aggregates (useWindow). | — |
Summarize Pushdown (pdsummarize) |
Full | Table Extract with aggregation | Database-side aggregation, converted the same as Summarize. | — |
Text (text) |
Full | Canvas annotation | Preserved as workflow context. | — |
Time Series Agent (rollup) |
Full | Table Extract aggregation over a period-bucket expression, Period Spine, Anti Join and Union All | Rolls records up to day, week, month, quarter, year or decade periods between optional start and end dates, per group, excluding NULL dates and zero-filling empty periods. | — |
Transform Agent (edit) |
Full | Table Extract with column expressions | Calculated columns, type changes, and window calculations (lag, lead, cumulative sum, row number, forward and backward fill), evaluated in order. | — |
Unpivot Agent (unpivot) |
Full | Melt | Converts columns to rows as a name/value pair. | — |
Vision Agent (vision) |
Full | Image OCR, then the AI/NLP prompt task | Each document goes to the provider as an image or PDF when it accepts that type and size, else its PDF text layer or OCR text is sent; the prompt’s answer lands in an AI Answer column. | — |
XML Agent (xml) |
Full | XML Parse | Selects elements, extracts child values and attributes into columns, or converts XML to JSON; a simple //a/b path converts as before and any other XPath 1.0 path (predicates, attribute tests, wildcards, functions such as count(), name() and contains()) is evaluated as XPath, namespace-aware or as written. | — |
Wiring, canvas, and pushdown variants (Split Output, Group, Text, Filter Pushdown, Summarize Pushdown) are Savant node types without a help-center agent article of their own; each converts as the agent it mirrors.
A credential in an API Agent request is never copied into a workflow step. Over https it moves into a REST connection; over http, without permission to write connections, or in a conversion made through MCP it is withheld with a warning. This is by design and does not lower the tier.
Named Refusals
Section titled “Named Refusals”Two constructs are refused by name rather than converted. Neither lowers an agent’s tier.
| Construct | Why It Is Refused |
|---|---|
| An aggregate or window function in a plain expression | Savant itself fails on it at run time, so there is no result to reproduce. Inside a Transform calculation or a Summarize it converts. |
| An API Agent request that carries a credential and takes its host from an input field | Each row could send the credential to a host the data chooses. The request becomes a named placeholder. A request without a credential, and a credential on a fixed host, convert. |
A relative API URL converts when you bind a base URL or REST connection with api_bindings; see Convert-Time Bindings.
Expression Language
Section titled “Expression Language”Savant expression functions and operators convert to PlaidCloud expressions. Tier: Full. Functions and operators convert to PlaidCloud expressions, GEO_* functions anywhere in an expression run in companion Spatial steps, TO_TEXT/date formats (numeric DecimalFormat patterns, per-row formats, S fraction, MMMMM, week tokens) run in Text Function steps, and a function with no equivalent is flagged by name.
Every function and format converts, including TO_TEXT with a numeric pattern, a format that is only known per row, fractional-second tokens, and week-based date tokens. The one exception is an aggregate or window function in a plain expression. It fails in Savant itself, so the converter flags it by name; inside a calculation or a Summarize it converts.
Export Formats
Section titled “Export Formats”The loader accepts every observed export shape — flat, model-wrapped, server-record, recipe envelope, array-wrapped, BOM-prefixed, and legacy type aliases — and normalizes them into one model. Tier: Full.
Analysis Parameters
Section titled “Analysis Parameters”Savant analysis parameters convert to project variables, and references to them inside node configs are rewritten to the PlaidCloud variable syntax. List, dictionary, and aliased parameter shapes all load.
Connecting to External Systems
Section titled “Connecting to External Systems”Savant connectors are source and destination targets, not steps, and an export carries no datasets or credentials. PlaidCloud reaches these systems through a connection rather than through a node on the canvas.
| Savant | Where It Goes in PlaidCloud |
|---|---|
| Source connector | source_bindings maps the Savant node or dataset to a PlaidCloud table or a Document file, read through the matching import step; an unbound source warns and processes nothing |
| Destination: CSV, Excel and other file formats | An export step (Export: CSV, Export: Excel, Export to PDF) |
| Destination: Google Sheets, Tableau, Slack | Export to Google Spreadsheet, Publish to Tableau, or Notify via Slack, through a connection you bind with destination_bindings |
| Destination: other connectors | A CSV or table destination with a warning naming the original target |
Conversion never contacts the source or destination system.
Validating a Converted Workflow
Section titled “Validating a Converted Workflow”Validation is by oracle, and the evidence label travels with every result.
- Parity is claimed only against a real golden — output from the customer’s own system of record, compared row by row.
- Alteryx-equivalence is the strongest evidence available for a Savant analysis without a golden: the analysis is migrated from an Alteryx workflow with a real golden through Savant’s own migration, converted, run, and diffed. A match proves the output is Alteryx-equivalent for that flow, not that it matches the Savant runtime.
- Expected output derived from the spec shows consistency with the documented behavior and is never reported as parity.
- Semantics Savant does not document are implemented as the Alteryx reading and reported as unverified against Savant.
Comparison checks schema, row count, and row values, and ignores row order unless the workflow depends on it.