Skip to main content
Global search with ⌘K, new Bayesian / TuRBO / SOBER optimizers, faster ECM parameterization, inline image previews for file measurements

Global search across the platform

A ⌘K dialog now searches across projects, cell specifications, cell instances, cell measurements, pipelines, datafits, simulations, optimizations, and parameterized models — with grouped, deep-linked results and per-entity-type chip filters. Cell measurements and instances are indexed via server-side full-text search, so a partial name or id from any of these surfaces lands on the right detail page in one keystroke. The search dialog supports filtering and paging results server-side.

Bayesian Optimization, TuRBO, and SOBER for parameter estimation

Three surrogate-based optimizers ship in ionworkspipeline:
  • BayesianOptimization — sequential or batch BO with (log-)Expected Improvement and a feasibility-weighted acquisition for constrained problems.
  • TuRBO — trust-region BO with Thompson sampling and constraint handling.
  • SOBER — batch BO via Bayesian quadrature with prior-aware importance sampling.
Each algorithm has a matching BayesianOptimizationOptions, TuRBOOptions, SOBEROptions schema, and a new method-selection guide in the docs explains when to reach for them over Nelder–Mead, CMA-ES, or differential evolution.

ECM parameterization runs as a background job

Authenticated ECM fits now run as background jobs instead of blocking on a synchronous request for 10–60 s. POST /ecm/fit-from-file and POST /ecm/fit-from-measurements return 202 {job_id, status}; the public demo POST /ecm/fit stays synchronous so unauthenticated example fits still complete in one round-trip. The new client.ecm Python SDK sub-client covers all three input modes — fit_from_example (sync), fit_from_file and fit_from_measurements (returning an EcmFitJob with wait_for_completion(...) polling), plus save_to_project and detect_and_read — and a new ecm-fitting agent skill walks an agent through picking a mode, running the fit, and persisting it as a parameterized model. Solver errors from user data now surface as clear, actionable API errors instead of generic failures.

Inline image previews for file measurements

File-type cell measurements used to render a “Visualization not yet supported” placeholder; the measurement detail page now fetches every attached file, renders images inline (filling the column with a click-to-expand lightbox, Esc or click-out to dismiss), and offers a download link for any file type. The detail page also no longer fails to load for file and properties-type measurements that don’t have time series data.
Improvements
  • Optimizations get a lighter-weight /optimizations REST surface (list, get, config, metadata, runs, statuses, cancel, resubmit, delete), and the optimization list page now polls a lightweight status projection every 5 s for faster, more efficient updates. The parameterized-model selector also fetches by id rather than scanning a larger cache.
  • A project-scoped parameterized model listing lets the parameterized-model picker filter to models that belong to the current project.
  • Internal indexing helper fields are hidden in the object-fields panels so detail views no longer surface implementation details.
  • Datafit results now surface “Validation not supported” as an inline alert when applicable, instead of leaving the validation tab blank or failing the page.
  • Protocol files that pause or end on a non-error stop condition now render a user-correctable inline message; previously the route returned a generic error.
  • Errors raised internally are now consistently converted into structured error responses across simulation and datafit result endpoints.
  • The Universal Cycler Protocol simulator pages now list Arbin and Novonix alongside Maccor, Bitrode, and BioLogic as supported cycler protocol formats, and the supported-protocols copy is shared between both UCP pages so the two stay in sync.
  • Data grid cards now claim an intrinsic width, fixing collapsed-grid layout issues when the parent container had no explicit width.
  • Measurement-file uploads to storage now retry on transient errors with capped exponential backoff and a clear error once attempts are exhausted.
  • Pipeline list and detail views are more robust to out-of-order responses, so navigating between pipelines during a slow request no longer reverts the view to a stale pipeline. Pipeline-elements caching and background polling were also hardened against stale-data races.
  • The measurements list resets to page 1 at render time when the parent entity changes, removing the flash of stale rows that appeared while a new request was in flight.
  • Org-context resolution on hard refresh is now deterministic — the active project no longer briefly reverts to the first project in the list before the persisted selection loads.
Fixes
  • Dark mode now derives selection, focus, and hover colors from the Ionworks brand pink so the focused row, selected nav item, and hovered button no longer look muddy against the dark background.
  • Validation plot axis titles render correctly with the latest charting library version.
  • The cell card on the cell detail page no longer shows redundant metadata fields that duplicated the breadcrumb.
  • The all-measurements page now loads cell specs on cold/direct navigation so the spec-name and spec-anode/cathode columns populate on first paint instead of only after navigating in from elsewhere.
Improvements
  • CycleAgeing defaults to a unified experiment model when an experiment is supplied, and compiles by default in that mode. Cycling experiments repeat the same handful of steps many times, so this collapses build and solve cost, giving a substantial speedup for cycle-ageing fits. Pinned to PyBaMM 26.6.1.0.
  • CycleAgeing accepts experiment="from data", which builds the cycling experiment from the loaded dataset instead of requiring the user to restate it.
  • CycleAgeing automatically skips storing intermediate-cycle data when every requested metric only needs first/last-cycle quantities.
  • save_at_cycles on CycleAgeing is now auto-derived from the requested metric tree when the caller does not pass one explicitly — only the cycles that downstream metrics actually consume are saved.
  • ElectrodeBalancing emits dQ/dV curves alongside the existing capacity outputs, so weighted costs can be computed directly against the dQ/dV peak structure.
  • The Time metric accepts a vector of times and reports the metric at each one, replacing the previous one-scalar-at-a-time loop in callers that needed a few sample points.
  • Solver options can now be passed through to every objective, complementing last week’s solver options on the constructor side.
  • SimplePipeline is a new pipeline mode with a client-side validator that rejects configs containing more than one expensive element (DataFit, ArrayDataFit, Validation), mirroring the server-side guardrail.
Fixes
  • An unsupported preprocessing option is now rejected at config time when passed in objective options, matching the runtime ban and giving a clearer config-time error.
Improvements
  • client.electrolyte.transport_from_dataset(dataset_id, forms=, columns=) turns a material property dataset into a pybamm.ParameterValues of concentration-dependent transport functions ready to hand to iws.direct_entries.DirectEntry(parameters=...). Two function forms are supported per property: tabulated interpolation (default) and a Landesfeind–Gasteiger isothermal exponential fit, which stays positive and finite below the lowest measured concentration so high-rate DFN solves don’t fail when the electrolyte depletes.
  • Quantity constructors accept PyBaMM-style unit strings and normalize them on input, so values copied from a PyBaMM parameter set round-trip into and out of cell schemas without a manual unit rewrite.
  • JobClient.get_parameter_trace(job_id) returns the parameter- evaluation trace from an optimization job as a DataFrame for inspection or downstream plotting.
  • client.ecm (introduced above) is the new ECM sub-client.
Fixes
  • POST and PATCH calls retry on transient connection drops with the same capped-backoff policy already used for GETs, removing spurious connection errors during long-running uploads against a flaky link.
Fixes
  • A constant-current discharge segment with the unsigned mixed-mode sign convention no longer mislabels the step direction, and the matching CC-discharge classifier no longer reverses the sign on file round-trip.
Improvements
  • Arbin protocols with a SIGN(...) or step-time piecewise-current formula now parse correctly and emit the expected step plan; the previous parser failed on the conditional with a generic syntax error.
  • human_readable_protocol(...) renders drive-cycle steps in the same shorthand notation the simulator uses elsewhere, instead of expanding them inline.
Fixes
  • Pause and end stop reasons now surface as user-correctable inline errors instead of being treated as solver failures.
Improvements
  • The parameterize skill gains a current-driven fit template and a full-cell OCV template, each with an objective / cost decision tree so an agent can route an incoming dataset to the right starting configuration without re-deriving the choice every time.
  • A new electrolyte-transport SDK skill documents the client.electrolyte.transport_from_dataset(...) workflow, including the interpolant vs. Landesfeind-exponential trade-off and the DirectEntry integration pattern.
  • A new ecm-fitting SDK skill walks through the three ECM input modes (example, file, measurements) and the save-to-project flow.
  • The parameterize skill explains the component/material model and the material → cells reverse lookup so an agent can find which cell specs reference a given material before editing it.