Workshop - 0.56.1
π Highlights
- Patch release with minor fixes and improvements
π Improvements
- Minor improvements to stability and upcoming unreleased features.
Product updates and releases
bessel_j, bessel_y, bessel_i, and bessel_k for computing Bessel functions of the first kind, second kind, modified Bessel functions of the first kind, and modified Bessel functions of the second kind, respectively.PairHopSum(tensor) represents a Hermitian sum of pair hopping terms: . It differs from CoulombSum in that the pair hopping terms do not include spin indices (which introduces an additional constraint).adjointed() member function to quantum Operators to dynamically compute the Hermitian conjugate.Operators support .is_hermitian(), .is_unitary(), and .is_real() dynamic introspection properties.PhaseShift(angle, i): Single-qubit phase gate operator.Model can now be initialized from .lattice_model files by passing the path to the file to the model constructor (e.g. model("path/to/model.lattice_model")).Model class now has a method to inspect labels that need to be registered model.unregistered_labels().set_coefficient method can now also take an aleph function that takes a coordinate and returns a complex number.PairRotation where sparse vectors were not correctly multiplied, causing incorrect results.CoefficientFunction, Model::set_coefficient now expects a complex number instead of a real number.UI responsiveness
Platform readiness
.aleph file into an Aleph editor to automatically insert an include statement..h5 / .hdf5) to insert an HDF5File(...) reference.π‘ Have ideas for other shortcuts or workflows? Weβd love to hear them β feel free to share your suggestions on our Discord!
LSP connectivity
Platform readiness
Kai workspace awareness
AST export (Python SDK)
Add language server support for formatting Aleph code files (beta).
Added logarithmic binning accumulators to statistics support. These can be used to estimate auto correlation times and can be constructor by calling accumulator("logarithmic"). Includes
parameters base and initial_depth to set the bin size of each level of the logarithmic accumulation and the initial depth of the levels.
MPS and MPO arithmetic operations now support integer, real and complex scalar types.
mps *= scalar and mps /= scalar, mpo *= scalar and mpo /= scalar.scalar * mps, scalar * mpo, mps * scalar and mpo* scalar.mps / scalar and mpo / scalar.+=, -=, *=, /=.Integrated aliased discrete distribution into Aleph which offers O(1) sampling speed as opposed to O(N) from a standard discrete distribution.
Can be built using random_distribution("aliased_discrete", ["probabilities" : [...]]).
Universal operator identity and zero factories: Identity() and Zero().
More fermionic operator transformations have been added:
anticommuted : anticommutes two fermionic operators and returns while respecting the canonical commutation relations of . Supported for Create, Destroy, and Number operators.site_canonicalized : orders a a fermionic operator into site canonical order with .canonicalize : orders a site-canonical product into complete canonical order .Added a size() method to OperatorProducts to enable easier for looping over terms.
Aleph now uses the Xoshiro256 algorithm as the default random number generator as opposed to Mersenne Twister. Xoshiro offers generally superior performance in terms of both time and space requirements.ID and FermiId in favor of the unified Identity() operator factory. Use Identity() for universal identity operators across all operator types.AlephLanguageServerClient to the Python SDK.sse_order to determine the order from a given SSE configuration.fermionic_site_reorder(operator): Reorders creation and annihilation operators by site while tracking phase changes from anticommutation relations.converted_to_create_destroy(operator): Converts named fermionic operators to their creation/annihilation form. Handles multi-site interactions like density-density (), hopping (), and pair operators ().simplified_create_destroy(operator): Simplifies operator products by reordering and removing invalid terms (e.g., and ).fused_into_number(operator): Fuses creation-annihilation pairs into number operators ().reduced_number_power(operator): Reduces powers of number operators to at most 1 ( for fermionic systems).Release description not available.
"finishReason" error for certain prompts.Editable figures
Format Document action
Alt/Opt + Shift + FEnhanced Markdown navigation
File renaming UX
Markdown editing upgrades
NumberNumber(i, j): Two-site density-density interaction .TransferNumber(i, j, k): interaction.HopNumber(i, j, k): interaction.NumberSum(sites): Total occupancy on a set of sites .NearestNumberSum(sites): Nearest-neighbor density interaction .NextNearestNumberSum(sites): Next-nearest-neighbor density interaction .PairTransfer(i, j, k, l): Directed pair transfer operator .PairHop(i, j, k, l): Pair hopping operator .PhaseHop(angle, i, j): Complex phase-hop operator .NumberPhase(angle, i): Site-specific phase operator .NumberNumberPhase(angle, i, j): Two-site phase operator .ModeRotation(angle, i, j): Givens rotation operator .PairRotation(angle, i, j): Bogoliubov rotation operator .NumberPotential(coefficients [, sites]): Efficient representation of weighted density sums .CoulombSum(tensor): General Coulomb interaction on interleaved spin-orbitals.FourBody, DoubleExcitation, NumberN, NumberNumberNN, NumberNumberNNN) for backward compatibility.get_arg(name, type[, default]), enabling typed inputs to be provided when launching executions or scheduling jobs.sse_specific_heat(order).complex("2 + 1i") and "2 + 1i".complex() now work.${ab.first}), avoiding invalid and overlapping semantic tokens in editors.2.0 * X(0) + 3.0i * Y(1) is now a valid expression.0. This affects conversions like real("abc") and integer("abc"). Loss-of-precision conversions still behave as before, e.g. integer("5.3") -> 5.Transient error handling
Platform readiness
Figure.visual_map(...) options in the Plotting module.visual_map when none specified when a figure has a heatmap..compress to control the growth for MPS..compress to control the growth for MPS..open_boundary() to open the boundary condition, .periodic_boundary() for periodic boundary condition..set_boundary_like(mps | mpo) to set the boundary condition like another TN.string(...) call could mark the start of a literal as a function.${...} interpolation spans.runtimeId is now optional when creating executions and jobsAPI & SDK enhancements
Simplified execution & job creation
runtimeId is now optional when creating executions or jobs.runtimeId unless a specific runtime version is required.Reload Tab
Clickable stack traces
Figure raw editing enhancements
Improved dragβnβdrop
Expanded context menus
Execution signal display
HDF5File support in Data Files to allow reading and updating platform-stored files, in addition to writing new files.HDF5File now supports reading/writing HDF5 files up to version 2.0 and includes compression options.HDF5File supports many Aleph types, including lists, arrays, and tensors.TextFile for reading/writing files as strings.operator_function API has changed to support both Hermitian and non-Hermitian operators; it now accepts an option map similar to that of iterative_eigensolver. See the New Features section for details.HDF5File types and functions have been substantially updated and may break code written prior to this release; this binding is expected to be stable moving forward.Scrollable Job Details
Figure rendering in Markdown (JSON)
Docusaurus-style admonitions
Light theme export for figures
matrix_element(bra,operator,ket) to compute the matrix element of an operator.expval(operator,ket) to compute the expected value of the operator.accumulator("no_binning")
and accumulator("binning"). The bin size can be set via accumulator("binning" ["bin_size" : 1024 ]).FourBody symbolic fermionic operator: . An operator can be created via
FourBody(i,j,k,l) where i,j,k,l are the sites where the operator acts.DoubleExcitation fermionic operator: . An operator can be created via
DoubleExcitation(i,j,k,l) where i,j,k,l are the sites where the operator acts.array and matrix factories now accept array and matrix objects together with a type tag. For example: array(my_matrix, as_complex) will create a complex array from my_matrix even if it is of real type.mps.compress(tol) to compress a MPS to specified error tolerance.operator_function now supports both Hermitian and non-Hermitian matrices and operators. The appropriate Krylov method (Lanczos or Arnoldi) is automatically selected based on the input. The API can be summarized as:
operator_function(H, dim, fun(real){real}, ["is_real":true]) for real-valued functions and Hermitian operators. Note that the ["is_real":true] option is required to indicate that the function is real-valued.operator_function(H, dim, fun(complex){complex}) for other Hermitian operators.operator_function(H, dim, fun(complex, integer){complex}) for non-Hermitian operators. The integer argument stands for the order of the derivative of the function, which is required for non-Hermitian operators.Hmat instead of an operator H and a dimension dim.["krylov_dimension": 32].PhaseHop(angle,i,j) factory function has been added to create fermionic hopping operators with an associated phase factor: .Adds internal support for handling sparse matrix operations with free fermion objects.
Real arrays and matrices are not implicitly convertible to complex arrays and matrices anymore. An explicit conversion is now required using as_complex.
Cmake presets to help manage compilation with IDE/VScode.
VScode devcontainer mount the user's .ssh for syncing with gitlab.
$HOME/.sshoperator_function API has changed to support both Hermitian and non-Hermitian operators; it now accepts an option map similar to that of iterative_eigensolver. See the New Features section for details.Figure math rendering
Figure layout tuning
matrix_element(bra,operator,ket) to compute the matrix element of an operator.expval(operator,ket) to compute the expected value of the operator.accumulator("no_binning")
and accumulator("binning"). The bin size can be set via accumulator("binning" ["bin_size" : 1024 ]).FourBody symbolic fermionic operator: . An operator can be created via
FourBody(i,j,k,l) where i,j,k,l are the sites where the operator acts.Job scheduling
Run now
Unified job refresh
Improved job metadata
Clear agent separation
Smarter file creation from Markdown
Accurate cloud agent system info
Better cloud job error reporting
matrix_element(bra,operator,ket) to compute the matrix element of an operator.expval(operator,ket) to compute the expected value of the operator.accumulator("no_binning")
and accumulator("binning"). The bin size can be set via accumulator("binning" ["bin_size" : 1024 ]).`
New Welcome screen
Figure editing (limited preview)
File context menu actions
Security hardening
Stability improvements
Separate agent selection flows
Agent-aware UI
Smarter agent menus
Tooltip & UI polish
Interactive (Shared) agent
Cloud agent tooltip
As we close out 2025, this release focuses on polish, usability, and smoother day-to-day workflows. Thanks for building with Kothar β and see you in 2026 π
Markdown word wrap (default)
Enhanced Markdown preview
.figure outputs directly inside Markdown previews.Diff syntax support
π End of 2025 note
Thanks for being part of the Kothar journey this year. This final Workshop release of 2025 focuses on polish, stability, and better everyday ergonomics β setting the stage for an even more powerful 2026.
Shorter AI chat summaries
Chat summaries are now more concise and focused, making conversations easier to scan and review.
Stricter unified diff generation
π
Happy holidays from the Kothar team!
Whether youβre writing code or running jobs β we hope this release makes your end-of-year workflows smoother.
Execution metrics visualization
Automatic Aleph editor context in Kai
Figure support in Workshop
AI Assistant naming
AI model selection (internal users only)
Internal users can now choose which AI model to use when starting a chat.
Markdown support in the editor
Enhanced Markdown capabilities
Reasoning tokens in AI Chats
AI Chats now surface reasoning tokens when available, improving transparency during model interactions.
oblique, rectangular and honeycomb geometries which were throwing errors for incorrectly defining the basis vectors.async now runs on a shared worker pool, and await_all, parallel_map, plus sleep round out the toolkit for structured concurrency.Model class has been revamped. Now as opposed to adding general functions via add_term(XX, neighbourhood)
we have add(term([X, X], neighbourhood)). The add method is also more general,
allowing for add(neighbourhood_rule(...)) and add(coefficient(...)).Model's add_observable method has been replaced with measure which takes a name and a term, (e.g.my_model.measure("name", Term(...)).Term and Coefficient have been introduced as helper types when defining model, with associated factories term and coefficient.NumberNumber which is a fused version of Number * Number, Number(List) a fused sum of number operators, NumberNumberNN a fused sum of NumberNumber operators for nearest-neighbours, and NumberNumberNNN a fused sum of NumberNumber operators for next nearest neighbours.await_all(futures) waits for each Future in a list, consuming the inputs and returning the resolved values in submission order.parallel_map(values, mapper) applies the mapper concurrently across the shared async pool, keeping results aligned with the original list.sleep(seconds) pauses execution for a positive duration, throwing if a negative value is supplied.eigensolver factory that picks the appropriate eigenvalue solver based on the properties of the input matrices, solves the eigenvalue problem and returns an object representing the solution. It currently supports standard and generalized eigenvalue problems for dense matrices (real, complex, Hermitian or not). The returned object has methods eigenvalues and eigenvectors to retrieve the eponymous quantities.svd factory that computes the SVD decomposition of any dense matrix. It supports two algorithms: Jacobi and BDC. The default is Jacobi, which is more accurate for small and medium sized matrices, while BDC is faster for large matrices. The returned object has methods singular_values, matrix_u, and matrix_v to retrieve the eponymous quantities.cholesky factory that computes the Cholesky decomposition of symmetric (Hermitian) matrices. It supports two algorithms: standard (LLT) and robust (LDLT). The default is standard, which requires the matrix to be positive definite. The robust algorithm (LDLT) can handle positive or negative semidefinite matrices. The returned object has methods matrix_l and matrix_u to retrieve the factors.lu factory that computes the LU decomposition of any dense matrix. It supports two pivoting strategies: partial and full. The default is partial pivoting. The returned object has methods matrix_l, matrix_u, and matrix_p (and matrix_q for full pivoting) to retrieve the factors.qr factory that computes the QR decomposition of any dense matrix. It supports three pivoting strategies: none, partial (column pivoting), and full. The default is no pivoting. The returned object has methods matrix_q, matrix_r, and matrix_p (if pivoting is used) to retrieve the factors.fft and ifft functionsmpo(model) function to convert lattice models to finite MPO representations. This enables direct MPO construction from a Model definitions for use in DMRG and tensor network algorithms.observables_to_mpo(model) function to convert observables defined in a Model to MPO form, returning a map of observable names to their MPO representations.resize, insert, insert_at, replicate, replicated, extend and extended now clone inserted elements to match existing push_back, assignment, and constructor behavior.List::push_back in the API reference.make_random_mps and make_random_mpo, they were wrongly classified as functions and the first argument was missing from the documentations.BoundaryCondition types.resize, insert, insert_at, replicate, replicated, extend or extended mutating the original values will behave differently.Job management enhancements
Job context menu
A new context menu in the jobs list provides quick access to common job actions.
AI Chat streaming & cancellation support
The Workshop AI Chat now supports real-time streaming responses and graceful cancellation, matching the updated AI API.
Enhanced AI Chat behavior
Improved interaction flow, responsiveness, and handling of intermediate states during AI generation.
Improved job duration display
Job durations are now normalized for longer-running jobs, making timelines easier to read and compare.
Streaming AI responses
AI-generated content can now be streamed as it is produced, enabling more responsive user experiences.
Client + server tool support
The AI API now supports client-side tools in addition to server-side tools, unlocking more flexible AI workflows.
Job metadata API
New endpoints allow updating job names and notes
Backend feature flags
Feature flag support added in the platform (in addition to the Workshop) to progressively enable or disable features without redeploying.
AI API aligned with OpenAIβs canonical format
The AI Chats API now uses a messages/roles structure consistent with the OpenAI API, simplifying integrations and future compatibility.
Improved editor context handling
Editor context is now explicitly passed and correctly processed by the model.
Usage tracking per conversation
AsyncDisposable callbacks).β οΈ This will break the existing AI Chat feature in production until the Workshop is updated.
NumberNumber which is a fused version of Number * Number.boundary_condition variable.boundary_condition.open, boundary_condition.periodic etc... as opposed to the old syntax, open_bc, periodic_bc etc...β Internal / Technical Changes
>>> [1,2] //-> Interval(lower=1.000000, upper=2.000000).fit function no longer accepts two-element lists as interval specifications. Users must now explicitly use the interval factory to define intervals.
chebyshev_series_delta(10, [a, b]), use chebyshev_series_delta(10, interval(a, b)).A clearer and more capable AI experience behind the scenes, with improved model flexibility and stronger Aleph code support.
Model class which can be used to represent arbitrary lattice Hamiltonians and construct associated observables.chebyshev_series_delta and operator_chebyshev_series can be used together with iterative_eigensolver to compute interior eigenvalues and eigenvectors of operators. This is particularly useful for large-scale problems where traditional matrix representations are infeasible.matrix factory (which returns the matrix representation of an operator) now supports the as_sparsematrix type tag as an optional argument. This allows users to directly obtain a sparse matrix representation of an operator. Note that the type tag can be combined with other type tags such as as_real to specify the desired scalar type of the resulting sparse matrix (i.e. as_real | as_sparsematrix).Model class can be used to represent a Hamiltonian and observables in terms of lattice coordinates.operator_sum that takes an instance of Model and returns either a complex (default) or real OperatorSum depending on the type specifier (as_complex or as_real)chebyshev_series_delta function creates a Chebyshev series that approximate the delta function over a specified interval. This is useful for spectral filtering and other applications requiring delta function approximations.operator_chebyshev_series factory has been added to create operators based on Chebyshev series. This allows for efficient representation and manipulation of operators using Chebyshev polynomial expansions.count methods to Fbit that help in counting the number of occupied sites on subsets and linear cuts of the system.as_sparsematrix flag. One can also convert arrays and dense matrices directly to sparse matrices with the matrix factory. One can also create sparse matrices is by initializing them with the zeros, identity, uninitialized factory. Yet another way is to use insert which accepts three arguments: an array of row indices, an array of column indices, and an array of values. Lastly, one can of course use [] to extract elements or assign to them.set_tensor_threads(thread_number) can be invoked to control the thread count for tensor operations.extended for lists, an out-of-place extension of a list by an input list.as_real variants for TimerDuration conversion methods: hours, microseconds, milliseconds, minutes, seconds to retrieve more precise values when needed.OperatorSum and scalars with mixed coefficient types, enabling operations; real * ComplexOperatorSum and complex * RealOperatorSum.time, benchmark_for and benchmark_for are now marked standalone, bringing the documentation to the Module Functions section.eval method has been renamed to evaluate for improved clarity and consistency.evaluate method returns objects of the same type as the input argument. For example, if the input is a list, the output will also be a list.transpose, flatten, and squeeze.random_tensor, filled_tensor, zero_tensor, delta_tensor, uninitialized_tensor..conjugate().transpose(tensor, permutation): permutes tensor dimensions with validation.flatten(tensor): reshapes tensor into a order 1 tensor.squeeze(tensor): removes all dimensions of size 1 from a tensor.tensor + scalar, scalar + tensor, tensor - scalar, scalar - tensor for element-wise arithmetic.random_real_tensor β random_tensor, filled_complex_tensor β filled_tensor, etc...
as_real or as_complex (e.g., random_tensor([2, 3], as_complex)).as_real for real-valued tensors.βοΈ Internal / Technical Changes
random function can be used to generate random numbers on the fly.random_distribution factory can produce user specified distributions.random_generator allows users to seed their own random number generators.set_random and random_like can now take a Distribution specified by the user.std::exception escaping AST evaluation.EvalError..conjugate() and conjugated() methods for complex conjugation. Leave the tensors unchanged in the real case.π Highlights
This release focuses on UI polish and usability. Tree navigation is now more reliable in tight layouts, visual consistency is improved when renaming items, and several cross-platform rendering quirksβespecially on Linuxβhave been addressed.
βΈ»
π Improvements
βΈ»
π Fixes
βοΈ Internal / Technical Changes
βοΈ Internal / Technical Changes
π§© Fix
Commented include statements in Aleph scripts are no longer parsed as dependencies by the Agent. Example:
// include "dependency.aleph"
Previously, this line could incorrectly trigger dependency resolution and fail the execution. It is now correctly ignored.
π§ Impact
This fix prevents incorrect dependency lookups and ensures consistent execution graphs when using commented or disabled includes.
Weβve added a simple, built-in way for anyone to report bugs β right from inside the app.
β¨ New
π Improvements