Faster default simulation solver, structured error details on failed pipelines and optimizations, Wasserstein weighted mode and MSMRFullCell dQ/dU output
Faster default simulation solver
Simulations now default to a new solver that is a drop-in replacement for the previous PyBaMM-based solver, with substantially reduced per-step cost on supported model types and automatic fallback for models it doesn’t yet cover. Piecewise interpolation now also acceptssmoothing=0 so a hard step function can be modelled directly.Structured error details on failed pipelines and optimizations
Pipeline element and optimization failures now carry a structurederror_detail with the exception type and a link to the captured
diagnostic event. Two new job error codes — CONFIGURATION_ERROR and
SOLVER_ERROR — separate user-fixable config mistakes from
solver-side failures. In Studio, failed optimizations now show a
View diagnostic button (superadmin only) that opens the captured
event directly; the exception message itself is stripped before
serialization so user-visible diagnostics stay safe to share.Wasserstein weighted-point-cloud mode and MSMRFullCell dQ/dU output
iws.costs.Wasserstein gains optional position_variable and
weight_variable fields. When both are set, the cost computes one
Wasserstein-1 distance per objective comparing two weighted point
clouds — useful for full-cell MSMR fits where peak-location error in
Voltage [V] should be measured by the |dQ/dV| weights instead of
sample-by-sample. MSMRFullCell also now emits
Differential capacity [Ah/V] when listed in objective variables,
derived from Full voltage [V] / Full capacity [A.h] and
interpolated to the data voltage grid.Pipelines documentation moved to schema-first Docs section
The runnable “how do I actually run this” pipelines content has moved out of the Guide into a new schema-first Pipelines section under the Documentation tab, with every code sample rewritten to useionworks-schema + ionworks-api. The Guide retains the theory —
equations, parameter tables, intuition — and its existing “Pipelines”
group is renamed to Parameterization. The Japanese tab mirrors
the new section.Studio
Studio
Fixes
- Project-scoped ECM fitting from existing measurements no longer fails with a validation error: the frontend now sends the payload shape the backend expects for per-measurement initial SOC, and shows a per-measurement initial-SOC input next to each selected measurement.
Pipeline
Pipeline
Improvements
client.simulation.protocol(...)acceptsdesign_parametersagain as a flat dict — the single-simulation convenience that was accidentally removed when the protocol-template flow landed. Supplying bothdesign_parametersanddesign_parameters_doe, or a DOE that expands to more than one simulation, now raises explicitly instead of silently billing for the extra runs.- BioLogic
.mpsprotocols with large embedded drive-cycle tables (e.g. ~96k-row Urban Profile traces inlined as YAML block scalars) no longer time out when parsed via/protocols/parse-to-template. iws.direct_entries.DirectEntryaccepts apybamm.ParameterValuesdirectly. Callable values (concentration- / temperature-dependent interpolants) are serialized automatically and deserialized back into pybamm symbols so local and API consumption paths behave the same.
- Logging configuration now correctly governs all pipeline submodule loggers, so log-level settings apply consistently across the package.
Python API
Python API
Improvements
client.simple_pipeline.create(...)accepts aPipelineOptions(e.g.live_progress_updates=False), wiring this option through end to end from the SDK client.
- Outbound JSON payloads no longer raise
TypeErrorwhen a request body contains a pandas DataFrame with datetime columns.pd.Timestampis serialized viaisoformat()andpd.NaTbecomesnull.
Protocol Simulator
Protocol Simulator
Fixes
- BioLogic
.mpsparser no longer hangs on protocols likelfp_gr_cccv.mpswhere an internal sub-cycle pointer could be misread as a forward jump. Only genuine forward jumps emit gotos; backward or equal values are treated as plain step-ends.
Skills
Skills
Improvements
- Ionworks skills can now be installed as a Gemini CLI extension; the Coding agents docs page is updated to cover Gemini CLI, Cursor, and GitHub Copilot install paths alongside Codex and Claude Code.
- New half-cell MSMR template and helper scripts in the parameterize skill. The reference page mandates the template and lays out a discover → inspect → scaffold → dry-run → submit → validate workflow so every half-cell OCP fit uses the same canonical priors, multistarts, and method.
- The process-data skill now documents the platform’s actual current
sign convention (
positive = discharge), matches the validator and corresponding transform, and calls out the double-flip trap.
Tighter measurement-data validation, broader UCP-to-cycler conversion, Wasserstein distance cost function
Stronger measurement-data validation and processing
A new strict-mode check,capacity_energy_from_current_power, compares the
reported Discharge/Charge capacity [A.h] and …energy [W.h] columns against a
per-step trapezoidal integral of Current [A] and Power [W], flagging
row-by-row mismatches (10% default tolerance) so a transient mid-step error that
later cancels out is still caught. When the reported charge/discharge columns are
swapped — common in half-cell exports — fix_swapped_charge_discharge_columns
detects and corrects the labels. The current-sign-convention check now weights
each step’s vote by the charge it actually passes (∫|I| dt) instead of its row
count, so a long near-zero-current voltage hold no longer outvotes genuine
discharge pulses and raises a false CURRENT_SIGN_REVERSED.Small-current coin- and half-cell data now processes end-to-end: rest-step
detection scales its threshold to the trace’s peak current (sub-mA currents are
no longer all classified as rest), the auto-flip retry drops stale
capacity/energy columns before recomputing, and caller-supplied Step count
labels survive sign correction. A new generic parquet reader uses the same
alias-based column detection as the CSV reader, and folder: data references now
accept time_series.parquet / steps.parquet (preferred over CSV when both are
present).Broader, validated UCP-to-cycler conversion
The UCP-to-Arbin and UCP-to-Maccor converters handle more end-condition and step types (variable / loop / compound ends, temperature ends, Maccor pause steps) and now validate up front, raising clear errors on features a target cycler genuinely cannot represent instead of emitting files that fail to re-parse.Wasserstein distance cost function
A new Wasserstein (earth mover’s) distance cost function is available for data fitting, comparing model output and data as distributions rather than point-by-point. Available in both the pipeline and schema packages.Studio
Studio
Improvements
- Protocols list loads dramatically faster: the experiment-templates list
endpoint now omits heavy JSONB columns by default (~7.5 KB vs 7.7 MB on 22
templates), with callers opting into
protocol_config,parameters_schema, and similar fields via?include=. - Failed pipelines can be resubmitted from the pipeline details page, which now shows an error banner that deep-links to each failed element; individual elements display an inline error alert.
- Material property dataset plots now have an always-visible vertical legend with units, positioned to the right of the plot.
- Filtering measurements by ID on the project data page now narrows the list —
the
idquery parameter was previously dropped silently, returning every measurement. - Material dataset upload no longer shifts column indices when a CSV has an unnamed leading column, and now requires every column to be named (with a clear error) instead of silently skipping unnamed ones.
- Project membership management, active-organization switching, and parameterized-model deletion now go through the backend API instead of direct database writes, so they behave consistently with the platform’s access controls.
Python API
Python API
Improvements
client.auth_check()andclient.whoami()verify which user and organization a configured API key resolves to, backed by a newGET /auth/healthendpoint — useful for debugging wrong-org (403) errors and confirming which key is active.
Protocol Simulator
Protocol Simulator
Improvements
- Maccor protocols with
SubRoutsteps survive UCP YAML round-trips: resolved subroutine steps are namespaced and written back into the YAML, and intra-subroutinegototargets resolve at simulation time, fixing theSubroutine '<name>' not founderror in the parse-then-simulate flow.
Skills
Skills
Improvements
- New
validate-dataskill guides agents through the measurement-data validation and column-fix workflow. - A Codex plugin manifest was added so the Ionworks skills package installs in Codex alongside Claude Code.
Material properties in Studio, native UCP simulation for design optimization, SimplePipeline workflow, global search endpoint
Material properties in Studio
A new Materials section in the project sidebar lets you create materials within a project and attach measured property datasets (CSV / parquet) to each one. Upload, plot, edit, re-process, replace, and delete are all wired up. The Python SDK gains read-onlyclient.material
and client.material_property_dataset sub-clients with list, get,
get_units, and get_data (returns a polars.DataFrame); the REST
surface supports signed-URL downloads, on-the-fly downsampling, and
x-range filtering. A new docs page covers the UI workflow and REST
endpoints.Native UCP simulation for design optimization
DesignObjective gained a backend="ucp" option that runs UCP protocols
natively inside the optimization loop instead of converting them first.
This preserves UCP features that the conversion dropped — dynamic loops,
conditionals, gotos, set_variable, subroutines — and avoids
per-iteration overhead. EIS steps are now rejected up front in design
optimization (with a clear error both in the frontend form and at the
backend), because the UCP backend does not yet support frequency-domain
steps; standalone simulations remain the path for EIS.SimplePipeline workflow
A new lightweight pipeline variant for configs with at most one expensive element (one data fit or one validation). The whole config runs end-to-end as a single background job instead of fanning out to child jobs. CRUD endpoints under/simple_pipelines (POST returns 202;
LIST supports filters; PATCH for name/description; cancel and delete),
plus a client.simple_pipeline SDK sub-client with create, get,
list, update, cancel, delete, and wait_for_completion.Global search API
NewGET /search endpoint performs prefix full-text + substring
search across projects, studies, simulations, models, parameterized
models, optimizations, optimization templates, experiment templates,
pipelines, cell specifications, and materials within the authenticated
organization. There is no frontend search bar in Studio yet — the
new docs page makes this explicit so you don’t go looking for one.Studio
Studio
Improvements
- Optimizations table: bulk Delete restored next to the existing
bulk Cancel action, gated by
optimization:delete, with a confirmation dialog that pluralizes correctly and per-row error toasts. - Protocol simulator: Download CSV button next to “Configure Plot” exports the full time-series plus step-level columns (cycle count, step number, protocol variables) expanded to match each time point, regardless of zoom.
- Time-series measurement plot: overlay multiple variables sharing the
same unit on either Y-axis via a
+button — unit-filtered dropdown, distinct color cycle per series, individual×to remove, and selecting a primary variable with a different unit clears incompatible extras. - ECM models now expose
Anode potential [V],Cathode potential [V], and their open-circuit counterparts so BioLogic three-electrode EWE / ECE control limits can be reproduced from a simulation. NewLFP/Li metalhalf-cell chemistry added to the parameter library and the cell configuration UI. - Hover tooltips standardized to 3 decimal places across all plots.
- EIS Nyquist plot renders as markers-only scatter (no connecting lines), with a slightly larger marker.
- Cell-spec cascade delete now batches storage-path deletion and parallelizes per-measurement folder deletes, so one transient failure doesn’t abort cleanup for the others.
- Storage downloads now retry transient errors with exponential backoff — fixes job failures on intermittent non-JSON error responses.
- A new endpoint returns the parsed contents of a job’s metadata blob, giving the Python SDK a path to large validation payloads that the legacy result endpoint could not reach.
- Simulation submission unified to a two-step pattern (parse-to-template then simulate-with-template). Removed several redundant older simulation endpoints.
- Simulation dedup: removed a session-specific identifier from the uniqueness key used to detect duplicate simulations, so the “simulation already exists” path actually triggers and duplicate rows stop accumulating.
- Measurement details: Cycles tab is visible again and the cycle
filter slider’s range is correct after the
Cycle number→Cycle countcolumn rename. - Measurements of type
propertiesorfilenow show an informational alert pointing to the details panel or the SDK instead of rendering empty time-series tabs.
Pipeline
Pipeline
Improvements
ionworks-schemais now the single validation boundary for parser inputs across the pipeline, improving consistency between the SDK’s schema classes and pipeline execution.- Standardized user-facing optimizer kwargs across all fitting
backends:
max_iterationsreplaces older per-backend names, andpopulation_sizereplacespopsizeon the differential evolution optimizer. Old names continue to work with aDeprecationWarning. - A transient protocol solver failure during differential evolution now lands on the finite-penalty path instead of killing the optimization. Protocol and configuration errors still surface as errors so static bugs remain visible.
pybamm.Experimentperiodandtemperaturenow round-trip correctly through serialization (fix shipped inpybamm 26.4.3). Experiment schemas accept the new field set (per-stepperiod,temperature,tags,description,direction,start_time,skip_ok; experiment-levelperiod,temperature,termination);durationalso accepts human-readable strings like"287 seconds".- SimplePipeline jobs run data fits in-process and now establish their own connection to the compute backend, so distributed evaluation actually fires; when that connection fails, the fit falls back to its in-process path. Legacy element-type labels are now canonicalized consistently at ingress.
Python API
Python API
Improvements
client.simple_pipelinesub-client for the new SimplePipeline workflow.client.protocol.convert(protocol, target)returns aConvertResultwithprimary_bytes,text(), andsave(dir)helpers — exports a UCP YAML protocol to a native vendor file (Maccor, Arbin, Neware, BioLogic BT-Test, or Novonix). Maccor returns any drive-cycle MWF assets alongside the primary file.client.job.get_metadata(job_id)returns the parsed contents of a job’s metadata blob, giving the SDK access to large validation payloads the legacy result endpoint could not reach.
Protocol Simulator
Protocol Simulator
Improvements
- BioLogic
.mpsparser: User Profile (drive cycle) steps are now extracted from embedded Urban Profile Tables, or from sibling.txtfiles supplied viaadditional_contentwhen the.mpslacks embedded tables. Current sign is flipped on the way in so positive represents discharge for UCP/PyBaMM. - Arbin parser rewritten to keep the step list flat with raw gotos
instead of inferring loops from backward-goto patterns. Fixes
sibling backward gotos to the same target, cross-loop goto
resolution, and digit-bearing formula labels like
F_EIS_10%_capacity_change. Pause steps emit UCP’s first-class auxiliaryPausestep. - More Arbin / Maccor step types recognized:
Arbin
Internal Resistance→Restwith aUserWarning, additional Arbin step variants mapped to their UCP types, bracketedMV_UD[n]normalised, leading-negative current expressions classified asDischarge. MaccorUser Def CYCLE <op> Ntranslated to a UCPVariableEndagainst the runtimeCYCLEalias. - Per-step overhead trimmed substantially on long protocols, speeding up simulation of protocols with many steps.
- Solver failures are now distinguished from protocol and configuration errors, which keep their original error types and gain step context.
- Real Maccor
.MWFexports that include a multi-line preamble plus a header row now parse correctly. Files containing only data rows still parse unchanged.
Skills
Skills
Improvements
- New
run-simple-pipelinesskill walks through the SimplePipeline client end-to-end. process-data: clarified thatprotocolholds test conditions that affect the electrochemical outcome (temperature, C-rate, SoC, DoD, pressure) whiletest_setupholds physical logistics (cycler model, operator, lab, channel) that do not.test_setuplives only on measurements, not on cell instances.process-data:set_step_countwith a step column is now the unambiguous default, so decreasing / repeating step ids from GITT or RPT-with-substeps work the same as monotonic ones; the sign-based fallback is reframed as a fallback for when no step column exists at all. Added a caveat for cyclers that emit duplicateTime [s]rows at step transitions.process-data: mandatory header-audit step codifies eight rules (walk every file, group by cohort × column-set, classify Standard / Auxiliary / Drop, diff reader output, preserve aux columns, keep multi-thermocouple channels separate, confirm units / sign per cohort, surface missing-temperature as a finding) and a required confirmation-report shape, so silent column drops between cycler families are caught before any standardized parquet is written.
Custom PyBaMM model + Li-S support, ECM capacity co-optimization, default project for the Python SDK, structured validation issues
Custom PyBaMM models with Lithium-Sulfur chemistry
The/models/upload-custom endpoint now accepts a chemistry field (defaulting
to lithium_ion), and Li-S models get more accurate and robust initialization
when they run. The manage-projects SDK skill documents the full upload
workflow — pybamm.Serialise().save_custom_model(filename=...) → multipart
upload → client.model.get(id) returns is_custom_model: true.ECM fit: capacity co-optimization and per-segment initial SoC
Several interlocking improvements to the project-scoped ECM fit. Supplying anocv_soc_curve (and optional bounds_capacity) lets you co-optimize cell
capacity Q jointly with the fit instead of pinning Q to a single seed; on
a 25 °C rate-test trace the fitted capacity now lands within 0.9 % of the
coulomb-counting truth across all knot schedules. initial_soc accepts a
list (one entry per measurement) so multi-measurement fits reset SoC at each
segment boundary instead of integrating coulombs across the gaps; if you omit
it, an improved auto-seed routine now estimates each segment’s starting SoC
automatically. num_knots, num_knots_r0, knot_schedule, and
clamp_max_ratio are now first-class parameters on /fit-from-measurements
and /fit-from-file. A boundary-clamp default was also loosened, fixing an
issue where it could collapse the R0 fit and cause solver failures on
rate-test forward simulations.Default project for the Python SDK
TheIonworks client now resolves a default project_id at construction time
from a project_id= argument or the new IONWORKS_PROJECT_ID environment
variable, so callers no longer have to thread project_id through every call.
The previous PROJECT_ID env var still works but emits a DeprecationWarning.
All client.study.* methods take project_id as an optional keyword
(after the resource ID) defaulting to the client value, and pipelines and
optimizations auto-inject it into payloads.Structured measurement-validation issues
MeasurementValidationError.errors is now list[ValidationIssue] — a frozen
dataclass carrying a stable IssueCode (StrEnum), severity, human-readable
message, and JSON-native payload. Downstream code can branch on check
identity via e.has_code(IssueCode.CURRENT_SIGN_REVERSED) instead of grepping
the message string. ionworksdata’s auto-fix path now keys off the new codes;
IssueCode and ValidationIssue are re-exported from the top-level
ionworks package.Studio
Studio
Improvements
- Simulation boards now have a dedicated backend API at
/projects/{project_id}/studies/{study_id}/simulation_boards, fixing a blank Visualization tab in some cases. - Optimization Performance Detail and Performance Summary tabs now surface
buried
validation_warning/validation_not_supportedissues as top-level alerts above the tabs, with info “no data” alerts inside the tabs for the rare empty-but-valid case. - Defensive UX in the Visualization tab: the Data/Visualization toggle stays visible even when no board is available, with a warning alert prompting the switch back to Data instead of trapping the user on a blank page.
- The single simulation result page no longer flashes “Simulation not found” before the data loads on a fresh navigation.
Pipeline
Pipeline
Improvements
ionworks-schemagainedConstraint,Penalty,CMAESOptions,PSOOptions,DEOptions,LatinHypercube, andUniformschema classes, plus improved documentation across objectives, data fits, parameter estimators, regularizers, and distribution samplers.
- Fixed an issue where a solver failure on a bad parameter combination during a fit could crash the whole datafit instead of being handled gracefully. Cloud fits stay alive and the offending sample just gets a huge cost.
Python API
Python API
Improvements
- New
client.urls.measurement(measurement_id, project_id)helper returns the web app deep link for a measurement, so callers don’t have to hand-build URLs themselves.
Skills
Skills
Improvements
manage-projectsdocuments the/models/upload-custommultipart workflow and the Model / ParameterizedModel disambiguation.upload-dataand other validation-aware skills updated to reference the newIssueCode/ValidationIssueAPI and thee.has_code(...)pattern instead of substring-matching error strings.
Full optimization experiment editor, Arbin reader, Maccor coverage, UCP input schema
Full editor for optimization experiments
Optimization experiments now use the same protocol editor as the rest of the app. The bare text field has been replaced with a rich editor featuring YAML syntax highlighting, dark-mode support, frontend pre-validation, and the full protocol-builder dialog for picking templates and tuning steps. New protocols pre-load a “Constant Current Charge” template so users have a working starting point.Iterative metrics for design optimization
Design optimization now supportsCyclewiseMetric and StepwiseMetric
wrappers end-to-end. The optimization form lets you target a metric on a
specific cycle or step with bounded input fields driven by the parsed
experiment, mix pipeline variables alongside PyBaMM variables, and
round-trips wrapped metrics through save/load. A long-standing bug where
repeated protocol blocks were flat-expanded has also been fixed, which broke
solution.cycles indexing for cycle-wise metrics. Two new templates ship: a
simplified Charge optimization and composite system models.Arbin cycler support
ionworksdata now reads native Arbin exports — CSV, XLSX, and the binary
.res format. The .res reader extracts data directly from Arbin’s export
format (no separate Access database tool required), sorts rows chronologically
to handle interleaved multi-session recordings, and reads the absolute start
time from the file’s session metadata. Auto-detection picks the right reader
from file headers, and arbin res is also exposed as an explicit reader name.Maccor protocol coverage
The Maccor parser and simulator now handle several real-world protocol features that previously failed at parse time or during simulation, including per-limit safety gotos,Chg/Dis Func CCCV step types, and robust variable
setvar handling. The Maccor ionworksdata reader also gained support for the
compact short-form column header set used by some firmware versions, which
previously crashed and silently dropped capacity/energy columns.Machine-checkable UCP input schema
The discovery endpoint/discovery/schemas/protocol now exposes a JSON
Schema matching the actual YAML authoring format (single-key dicts like
{Charge: {...}}) rather than the internal parsed shape. Parity tests
round-trip good and bad fixtures through both the schema and the parser so
they cannot drift. Submitting the legacy kind: shape to
POST /protocols/validate now returns a helpful error pointing at the
canonical YAML examples, and the discover-api and run-simulations skills
show local pre-validation via jsonschema.validate(...).Studio
Studio
Improvements
- The Ionworks Agent tab has been replaced with a static instructions page; the in-app chat agent has been removed in favour of the agent-skills workflow.
- New cell specifications no longer pre-fill a default capacity, so users enter the actual cell capacity from the start.
- Storage permissions are now enforced at the organization level so members of the same org can read each other’s measurement files as expected.
created_by_emailis now consistently populated on cell-spec, cell-instance, and cell-measurement responses across bothgetandlistendpoints.- Simulation usage is aggregated at the organization level (matching the
org-level usage limit that the backend already enforces) and is fetched
from a dedicated
GET /organizations/current/usageendpoint.
Pipeline
Pipeline
Fixes
- Half-cell ECM now exposes anode and cathode potential variables
(
Anode potential [V],Cathode potential [V]) for plotting and metrics. get_cycle_metricskeeps theCycle countcolumn name on output instead of renaming it toCycle number, matching the input convention used throughout the data pipeline.
Python API
Python API
Improvements
validate_measurement_data,CellMeasurement.create, andCellMeasurement.create_or_getaccept askip_checksparameter so callers can relax a single strict validator (e.g.time_gaps) instead of disabling strict mode wholesale. Unknown check names raiseValueError, and the canonical set is exposed asionworks.validators.STRICT_CHECK_NAMES.validate_strict=Trueis now the recommended default.
Data Processing
Data Processing
Improvements
- New Arbin reader covering CSV, XLSX, and native
.resexports (see the highlight above). - Maccor reader now accepts the compact short-form column header set used by some cycler firmware versions.
Documentation
Documentation
Improvements
- New electrolyte parameterization page with a worked Landesfeind fit example.
- Optimization experiment editor, iterative metrics, simplified Charge template, and composite system models are documented.
- Custom variables reference now documents anode/cathode potential exposure on the half-cell ECM (English and Japanese).
- Maccor native
CCCVstep type is documented (English and Japanese). - Arbin is listed in the supported cyclers table.
- SEO metadata (keywords, OG tags, tightened descriptions) added across the docs site, including expanded data-fitting guide descriptions.
Skills
Skills
Improvements
- Each mirrored package (
ionworksdata,ionworks-schema,ionworks-api,iwutil,ionworkspipeline,skills) now ships a per-packageCHANGELOG.mdin Keep-a-Changelog format, written and validated as part of the release workflows. discover-apiandrun-simulationsskills updated to reference the new UCP input JSON Schema and demonstrate local pre-validation.upload-dataskill updated to recommendvalidate_strict=Trueand document the newskip_checksparameter.
Project-scoped ECM fitting, PyBaMM v26.4.0 support, SDK skills plugin, strict upload validators
Project-scoped ECM fitting
Equivalent-circuit-model fitting is now available directly inside a project. Pick any measurement already attached to one of the project’s cells (or upload a fresh CSV), preview the trace, run the fit, and save the result back to the project as a new model with one click. The new flow adds a model-vs-data plot, an error plot, a fitting-progress indicator, an OCV toggle helper, and auto-scrolls to the results when the fit completes. The standalone ECM demo continues to work for unauthenticated users.PyBaMM v26.4.0 support
The simulation engine has been updated for PyBaMM v26.4.0, which introduces a dedicatedRest
step class in place of the old zero-current step and renames the MSMR electrode-capacity
parameters from short keys (e.g. Q_n_1, Q_p_1) to descriptive strings (e.g. “Negative
electrode host site occupancy capacity (1) [A.h]”). Existing experiments and MSMR parameter sets
continue to parse correctly under the new release.SDK skills as a Claude Code plugin
The Ionworks Python SDK now ships with a set of installable Claude Code skills covering api-discovery, cell-data, data-upload, simulations, pipelines, and projects-and-studies. Each skill documents the relevant sub-clients, method signatures, and the create-or-get patterns so an AI assistant can drive the SDK against the current API surface. Contact Ionworks for access.Strict upload validators in the Python API
CellMeasurementClient.create and create_or_get now run optional client-side validators
before sending data to Studio so processing bugs surface as a local error instead of a confusing
upload result. A hard time-gap check (>5 h between consecutive rows) runs by default; passing
voltage_window enables a voltage-continuity check (catches chronological misordering from a
faulty data split), and passing rated_capacity enables a consecutive same-direction full-step
check plus a soft warning for any step whose capacity exceeds 5× rated.Studio
Studio
Improvements
- Measurement chart controls collapse into a compact header summary; per-axis variable selectors now allow adding and removing series dynamically with a unified two-column layout.
- Study visualization no longer collapses to an empty state when switching between studies whose experiment-type tabs differ — the filter resets to All when the previous tab isn’t present.
- Users with a stale session can recover by signing out via the sign-in page instead of being stuck on the redirect.
- The empty cells page now uses the correct organization-level permission check, so users who can create cells no longer see a misleading “contact a project admin” message.
- Pipeline element details view no longer triggers rapid duplicate fetches for
Data FitandValidationconfigs.
Pipeline
Pipeline
Improvements
- Simulations now compile faster by default, speeding up repeated runs that share the same model.
- Simulation objectives with custom mesh or spatial-method settings (such as
CycleAgeing) now serialise and reload correctly.
Python API
Python API
Fixes
- Time-monotonicity validation error message now reports the correct two adjacent values (the previous off-by-one showed the values just before the actual violation).
Data Processing
Data Processing
Fixes
- Sign-convention detection no longer misclassifies low-current pulse datasets as all-rest; the rest threshold now scales relative to the 95th-percentile current so violations are caught on small-amplitude data.
Python SDK resource clients, validation initial conditions, capacity calculation fix
Python SDK resource clients
The Python SDK gains typed sub-clients for managing Studio resources programmatically. You can now create, list, retrieve, update, and delete projects, models, parameterized models, studies, protocols, and optimizations directly from theIonworks client — for example, client.project.list(),
client.model.get(id), or client.study.create(...). A new “Managing resources” section in the
Python API docs walks through each sub-client with usage examples, and requests for Projects,
Models, and Studies no longer require your organization to be specified separately — it’s resolved
from your account automatically.Validation initial conditions and UX polish
Validations now let you choose how the simulation is initialized: auto-detect from the measurement, a custom starting voltage, or a custom state of charge. Each validation row in the Report tab can be removed individually with a confirmation dialog, and a dedup bug that caused two measurements sharing the same initial voltage to overwrite each other’s drive cycle has been fixed. Validation error plots also now render with grid lines for easier reading.Capacity calculation fix for multi-electrode cells
A capacity calculation was reading a non-canonical parameter name for the number of electrodes connected in parallel, causing the maximum concentration to be over-computed by a factor of N when users set the correct key. The fix aligns all lookups with PyBaMM’s canonical parameter name so multi-electrode cells parameterize correctly.Studio
Studio
Improvements
- Studies with simulations of a single experiment type now auto-select that type so the visualization view is immediately accessible.
- Failed variable-evaluation jobs now surface an error state with a Retry button instead of spinning indefinitely.
- Studies list and parameterized models list now support pagination.
- Fixed a crash when rendering time-series measurements with thousands of short steps (e.g. HPPC pulse protocols with ~1500 steps) — the dashboard can now load these measurements.
- Fixed coupled custom variables being silently dropped when their resolution failed, which could remove convenience variables like “Temperature [degC]” from simulation outputs.
- Fixed an issue where an overly large page size on the models list could cause an error.
Pipeline
Pipeline
Improvements
- Bumped PyBaMM to 26.3.1, which falls back to a base model with a warning when a custom model references a package that isn’t installed in the run environment.
- Improved reliability of OCP-related fitting objectives so they work correctly in Validation pipelines.
- Fixed an issue where a data fit submitted with a single objective could fail unexpectedly.
Python API
Python API
Improvements
- Added typed sub-clients for Models, Studies, Optimizations, Projects, Protocols, and ParameterizedModels, replacing raw HTTP requests for resource management.
- Requests no longer require your organization to be specified in resource paths — it’s resolved from your account automatically.
- Simulation polling now propagates errors immediately instead of swallowing them, and uses typed job status objects with clearer completion/failure fields.
- Fixed the simulation job poll endpoint, which was pointing at an incorrect route.
Data Processing
Data Processing
Fixes
- Fixed a sign-detection bug in the ECM validator where a symmetric current profile (charge / discharge / charge returning to the same net charge) was incorrectly rejected despite having a non-zero SOC span.
Async optimization, study validation reports, cell data filtering
Asynchronous optimization evaluation
Optimizers now support asynchronous evaluation for both local and distributed workloads, keeping all workers saturated without waiting for generation boundaries. New convergence criteria — including a patience counter and population diversity guards — prevent premature stopping.Study validation reports
Studies now include a validation workflow for comparing simulation results against experimental measurements. A new Report tab displays overlay plots of simulated vs. measured data along with quantitative error metrics (RMSE, MAE), and a Data tab lets you manage which measurements are paired with which simulations.Find out more →Cell data filtering and ordering
All cell list endpoints (specifications, instances, and measurements) now accept filter and ordering parameters — including name, creator email, date ranges, and sort direction. The Python SDK exposes matching keyword arguments on eachlist() method, and the frontend measurement table uses server-side
filtering.Studio
Studio
Improvements
- Pipeline and cell measurement tables now support server-side sorting.
- Added an error screen with auto-retry when the initial user info request fails.
- Removed SNES optimizer option from the frontend.
- Fixed cross-site scripting issues in the notifications drawer and job progress display.
- Improved error message consistency across the app.
- Eliminated slow file-listing calls on file-measurement endpoints by caching filenames, reducing response times from ~10 s to under 100 ms.
Pipeline
Pipeline
Improvements
- Added dedicated algorithm test suites for CMA-ES, XNES, and Nelder-Mead.
- Improved convergence for CMA-ES and XNES by preferring the evaluated distribution mean when it outperforms the best sample.
- Fixed a flaky deterministic design optimization test.
Python API
Python API
Improvements
- Added filter and ordering keyword arguments to
CellSpecificationClient.list(),CellInstanceClient.list(), andCellMeasurementClient.list(). download_files(filenames=)now skips the listing round-trip; newget_file()method for single-file fetch.
Data Processing
Data Processing
Improvements
- Added temperature column recognition for Biologic files.
Measurement types, performance improvements, total time termination, parameterized model enhancements
Measurement types for non-time-series data
Cell measurements now support ameasurement_type field with three values: time_series (the
default), properties for key-value metadata such as checkpoint measurements, and file for arbitrary
files such as images, PDFs, or numpy arrays. Each type has its own creation and retrieval flow, and
list endpoints can filter by type.Find out more →Performance improvements
Pipeline creation is now significantly faster, and the platform handles concurrent load with improved throughput. Models, parameterized models, studies, and optimizations now use server-side pagination and filtering, eliminating the need to load entire collections into memory.Total time termination condition
Protocol steps can now usetotal_time as a built-in termination condition, ending a step after a
specified duration of total elapsed experiment time rather than just step time.Find out more →Parameterized model improvements
The parameterized model detail view has been consolidated into a single page with tabs, replacing the previous multi-page layout. Models can now be downloaded as a zip archive containing the full configuration, and initial temperature is now correctly accounted for in design optimization objectives for temperature-dependent studies.Find out more →Studio
Studio
Improvements
- Cell specification list now displays as a sortable data table instead of cards.
- Added a UI warning when a simulation produces no data because all protocol steps were skipped.
- Removed hardcoded convenience variables from the variable evaluator and improved the evaluate variables UX.
- All update requests now use partial update semantics.
- Standardized all duplicate resource errors to return HTTP 409 with structured error details.
- Replaced signed URL downloads with HTTP 307 redirects for simpler, faster file access.
- Flattened cell measurement composite response shapes for a more consistent API surface.
- Design optimizations now default to the Differential Evolution algorithm.
- Fixed optimization deletion hitting the wrong API endpoint.
- Fixed clone optimization sending a reverted request body.
- Fixed optimization list page sending redundant API requests.
Pipeline
Pipeline
Improvements
- Initial temperature is now correctly parsed for temperature-dependent optimization studies.
- Fixed fitted parameter dictionaries occasionally including an extraneous internal entry.
- Fixed validation to correctly handle certain transformed parameters.
- Fixed initial SOC not being passed to EIS frequency-domain simulations.
Protocol Simulator
Protocol Simulator
Improvements
- Added support for arithmetic expressions with input parameters when converting protocols for
simulation (e.g.
1000 / input["Total cells"]now produces correct results).
- Fixed initial SOC not being applied in EIS frequency-domain simulations.
Python API
Python API
Improvements
- Replaced signed URL downloads with direct HTTP 307 redirects for measurement file access.
- Flattened cell measurement response shapes for simpler data access.
- Added
measurement_typefield to measurement models for non-time-series data. - All update methods now use partial update semantics.
- Improved loading of studies and parameterized models with large numbers of simulations via server-side pagination.
Data Processing
Data Processing
Improvements
- Faster, more portable local caching.
- Added Latin-1 encoding support for Neware CSV files.
ECM parameterization, resistance scaling, custom variables, and BaSyTec reader
ECM parameterization
A new ECM parameterization page lets you upload cycling data, select 0–5 RC pairs with a live circuit diagram, and view fitted parameters including OCV and R0. Results can be downloaded as CSV.Find out more →Adjust resistance in protocol simulations
The protocol simulator now uses Equivalent Circuit Models (ECM) instead of SPM for faster, more robust cycler protocol simulations. ECM parameter sets are available for all six supported chemistries, and a new resistance scaling parameter in the UI lets you adjust the overall cell resistance before running a simulation.Find out more →Custom variables on models
You can now define custom derived quantities on models — such as electrode potentials or temperature in different units — as PyBaMM expressions stored in the model configuration. These custom variables are evaluated at simulation time and included in result data, making it easy to track application-specific metrics across design sweeps.Find out more →BaSyTec battery cycler reader
Data processing now supports BaSyTec CSV exports (CTS, X50 series). The reader auto-detects BaSyTec files by header signature, parsesHH:MM:SS.sss timestamps (including values
above 24 hours), applies the correct current sign convention, and extracts start times from companion
_meta.txt files.Find out more →Studio
Studio
Improvements
- Added dark mode with a theme toggle in the dashboard header.
- Moved optimization templates from organization scope to project scope with project-level management pages.
- Made optimization name optional when creating optimizations.
- Added pagination to cell specification, instance, and measurement list endpoints.
- Added OCV traces to drive cycle simulation result plots.
- Unified EIS column naming to
Z_Re [Ohm]/Z_Im [Ohm]across simulation, measurement ingestion, and frontend rendering.
- Fixed
LumpedSPMRmodel crash due to a missing internal reference. - Fixed an issue where datafit setup configuration could be mutated between runs.
Pipeline
Pipeline
Improvements
- Added support for computing lithium inventory from maximum stoichiometries without requiring maximum concentration values.
- Adopted PyBaMM’s native model and experiment serialization.
- Added
absas a unary operation for composed metrics.
- Fixed thermal model using incorrect heat generation variable in ECM.
- Fixed trailing space in electrode balancing direction parameter names.
- Fixed validation to discover sub-parameters inside function-based parameters.
Protocol Simulator
Protocol Simulator
Improvements
- Unified EIS impedance columns to
Z_Re [Ohm]/Z_Im [Ohm]with SI units and standard sign convention.
- Fixed CCCV resolution to apply consistently to all sub-steps within a protocol.
Python API
Python API
Improvements
- Added local data caching for cell measurements, reducing repeated downloads.
- Added pagination support (
limit/offset) to cell list methods, returning aPaginatedListwith a.totalattribute. - Improved sign detection algorithm for measurement current data.
Data Processing
Data Processing
Improvements
- Added BioLogic plain CSV reader for non-MPR exports.
- Added automatic derivation of
Z_ReandZ_ImfromZ_ModandZ_Phasewhen impedance components are missing.
- Fixed CSV reader to skip auto-detection for explicitly mapped columns.
- Fixed plotting bugs in data visualization utilities.