STEP_SCHEMAS in @eigenpal/types, so they always
match what the engine actually accepts and returns.
Steps fall into four categories, see Workflows for how
they fit together.
Full catalog
AI steps
| Step | Type | Summary |
|---|---|---|
| Parse Document | ai.parse | Extract text from documents (PDF, DOCX, images) using OCR or vision models |
| Extract Data | ai.extract | Extract structured data from text using AI with a JSON schema |
| Split Document | ai.split | Split a parsed document into named sections using an LLM. Consumes ai.parse output; emits per-section page ranges and text ready for downstream ai.extract via control.parallel_map. |
| Classify | ai.classify | Classify a document or text into one of a fixed label set using an LLM. Output exposes the picked label (constrained to the configured names), a coarse confidence, and a short justification. Pair with control.fail to reject documents that match an undesired label. |
Transform steps
| Step | Type | Summary |
|---|---|---|
| Set Value | transform.set | Set key-value pairs in the output object |
| Remove Fields | transform.remove | Remove specified fields from an object |
| Combine Data | transform.combine | Merge multiple objects or concatenate arrays |
| Split Data | transform.split | Split a string by delimiter or extract keys from an object |
| Merge Inputs | transform.merge | Merge multiple named inputs into a single output |
| Fill Template | transform.template | Fill a DOCX template with data. Use list_templates tool to get template IDs and their placeholder schemas. |
| Embed PDF Text | transform.pdf-embed | Embed OCR text layer into scanned PDFs/images to make them searchable |
| XLSX to JSON | transform.xlsx-to-json | Convert XLSX spreadsheet to JSON array of row objects for use in scripts or downstream steps |
| Script | transform.script | Execute a TypeScript function in a QuickJS sandbox. Input keys become the function’s parameter list, in declaration order, and the required : R return-type annotation IS this step’s output schema: inputs: { items, taxRate } ⇒ function script(items: …, taxRate: …): R { … }. |
| Text Chunker | transform.text-chunker | Split long text into chunks with regex-anchored boundaries, overlap, and header preservation. Accepts raw text or a parsed-document object; chunks carry source page indexes when pages are provided. |
| Regex Extract | transform.regex-extract | Pull named fields from text via regex patterns (deterministic counterpart to ai.extract). Accepts raw text or a parsed-document object; matches carry _evidence.pageIndex when pages are provided. |
Action steps
| Step | Type | Summary |
|---|---|---|
| HTTP Request | action.http | Make an HTTP request to an external API |
| Invoke Workflow | action.invoke-workflow | Execute another workflow and return its output |
| Website Reader | action.website-reader | Fetch a webpage and convert content to markdown |
Control steps
| Step | Type | Summary |
|---|---|---|
| Condition | control.if | Branch execution based on a condition expression |
| For Each | control.foreach | Loop over an array and execute steps for each item |
| Parallel Map | control.parallel_map | Iterate over an array with concurrent execution up to a limit |
| Parallel | control.parallel | Execute multiple branches concurrently |
| Wait | control.wait | Pause workflow execution for a specified duration |
| Block | control.block | Execute a reusable block workflow inline with input/output mapping |
| Fail | control.fail | Terminate the workflow with a typed status code + message. With an optional condition, only fails when the condition is truthy; otherwise always fails when reached. Pair with ai.classify or any prior step to fail fast on bad inputs. |