> ## Documentation Index
> Fetch the complete documentation index at: https://docs.eigenpal.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 0.20.41

> EigenPal platform release 0.20.41

## Platform (Studio)

* Workflow canvas, for large workflows with conditions, switches, loops and parallel steps: - Nested blocks stay inside their branch. - Fork and join lines meet every branch. - Short branches no longer stretch into empty panes. - Containers show their description and can be collapsed to a one-line summary. - Loops say what they repeat over. - "Fit to screen" shows the whole workflow. - "Add step" buttons appear on hover inside branches and in longer workflows.
* Workflow editor and Evals fixes: - Undo now takes one step back per change, including the first change after an undo. - Undoing a newly added step also closes its settings panel. - Cmd+S saves from inside a field, including edits you haven't left the field for yet. - Leaving with unsaved changes offers Save & Leave. - The unsaved-changes marker is a labelled "Unsaved" status. It no longer appears on Evals right after saving. - New steps describe missing settings by name ("Input is required") instead of raw validation text. - The run panel opens the output when a run finishes. - Experiments that no evaluator scored show "Not scored" instead of 0%. - Evaluator names are formatted as you type, and save errors read as plain sentences. - A new dataset example opens on its Input tab. - The toast for starting an experiment from Dataset has a View link to the results.
* Workflow editor and Evals: the canvas is calmer, with Start and End matching the step cards, Run inside the Start card, neutral connectors, quieter step containers and a subtle response on hover and click. Switching between Editor and Evals, and between Experiments, Dataset and Evaluators, now responds the moment you click, and the workflow version stays visible on both views. Experiments are listed by their example count with a short id instead of a long raw id, "Run all dataset examples" shows progress while it starts, an empty time range shows a single clear message instead of empty charts, and experiments without evaluators point you to adding one. Workflow Pal always builds with the current Parse Document and explains that the previous version is kept only for existing workflows.
* Workflow editor: - The canvas has Undo and Redo buttons. - Renaming a step, a workflow input, or a Set Value or Extract Data field updates every reference to it. - The run panel shows the run's status and duration first. - Step types are named as on the canvas ("Set Value"). - When a run input is missing, the form highlights the field and moves the cursor to it. Evals: the pass threshold is set in the evaluator config and saved with it, with a single "Save evaluators" button.
* Grafana dashboard: the Deployment target now defaults to All and panels merge targets, so the dashboard keeps working after an app pod restart changes the scrape target's IP instead of showing NO TARGET until someone picks the new one.
* Workflows: new Merge Documents step combines several uploaded files (PDFs, scans, phone photos, Word, PowerPoint and OpenDocument files) into one PDF, so Parse, Label Pages, Split and Inspect Pages number pages continuously across every file. Its output lists which pages came from which upload, and the run view shows that page map. In the step picker, Parse Document is now the only parser offered for new steps; existing steps on the previous parser show as Parse Document v1 and offer a one-click switch. Run views now preview the right document when a step reads a file produced earlier in the run, and output files show their real names.
* Prometheus: a new `eigenpal_automation_ocr_pages_total\{automation_id}` counter reports the OCR pages each workflow processed. The Grafana dashboard now shows total OCR pages for the selected range, an OCR pages by workflow table, and a pages-per-minute chart of the top 10 workflows.
* SSO: API keys owned by an SSO user no longer stop working 24 hours after the owner's last sign-in when EigenPal cannot re-check them with the identity provider. Scrapers and integrations keep running; keys still stop when the identity provider refuses the owner, the owner is removed or demoted, or the key is revoked. Refused keys now log a reason (`owner_refused_by_directory`, `owner_without_access`) instead of failing silently.

## Public API

* Starting a run with a single file for an input declared as a list of files now works: the file is treated as a one-item list instead of being rejected.
* `GET /api/v1/runs` accepts `hasExample=true` to return only runs linked to a dataset example, so evaluation views no longer have to page through production runs to find them.

## SDK

* Listing runs accepts a `hasExample` filter (`has_example` in Python) that returns only runs linked to a dataset example.

## Infrastructure & processing

* AI steps whose `model` belongs to a different provider than the one the step uses now fail before calling the provider, with code `llm_model_mismatch` and a message saying to set `provider` to that model. When a provider does not recognize the requested model, the run fails once with `llm_model_not_found` instead of a generic `running_failed`, and no longer retries the same model through the prompt fallback.
* Merge Documents lists each source document by its original filename in the merged page map.
* Merging documents keeps each PDF page's text, turns photos upright, sizes scans and photos to a normal page, splits multi-page TIFF files into one page per frame, and also accepts PDFs with print or copy restrictions.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.