Changelog¶
All notable changes to RLMesh are documented here. This changelog tracks the rlmesh Python package on PyPI. The Rust crates are internal implementation detail and currently carry no separate user stability promise.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
0.1.0 - Unreleased¶
The first release. RLMesh connects models to environments across process, dependency, and machine boundaries with a Gymnasium-style API. This release freezes the rlmesh-wire-v1 protocol generation and seals the 2026.06 workflow edition; everything after 0.1.0 stays compatible with peers built from it.
Added¶
Serve Gymnasium-style environments and drive them with
reset,step,render, andcloseover local or remote gRPC transports:EnvServer,RemoteEnv,RemoteVectorEnv, andpython -m rlmesh.serveas a universal container entrypoint.Evaluate models locally, against a remote server, or inside a sandbox:
Model,RemoteModel, andSandboxModel, withrun()for whole evals andsession()/Sessionfor manualreset/predict/stepcontrol.Tag-driven IO adapters that resolve environment tags against model specs at runtime. Environments tag what they emit (
ImageTag,StateTag,TextTag,Split); models declare what they consume (Image,State,Text,Concat) and produce (Action,Actuator). Conversions cover rotation accept-sets, imagefitandnormalizeranges, channel validation, optional cameras, frame stacking, per-actuatorclip/scale/invert/threshold, and role-less actuators;adapter.explain()prints the chosen transforms andadapter.advisories()surfaces data-loss notes.Action chunking and batched prediction in the runtime. Implement the most general of four corners and the runtime derives the rest:
predict,predict_chunk,predict_batch,predict_chunk_batch. The runtime owns chunk replay and the execution horizon, so one action still reaches the environment per step.Run observability: pass
hooks=RunHooks(...)torun()/Session.runfor per-stepStepEvents (action, reward, timing, lazy role-addressed reads) and episode/run boundaries, cap episodes withmax_episode_steps/max_episode_seconds, and read per-episode timing offEpisodeResult.Read-only observation inspection:
Session.reader()/Session.read()extract any role from a raw observation through the model’s adapter, andSession.observation_roles()/EnvTags.observation_roleslist the roles an env declares.PyTorch and JAX end to end: environments served with framework tensors (
EnvServer(env, framework="torch", device="cuda:0")),rlmesh.torchandrlmesh.jaxfactory, model, and sandbox classes, and DLPack-nativeTensortransport with zero-copy NumPy, Torch, and JAX backends.Isolated sandboxes: rebuild an environment identically in a container (
SandboxEnvwith groupedSandboxBuild/SandboxRuntimeconfig, includingSandboxRuntime.userfor writable bind mounts) or run a prebuilt image. A bare tagless image name resolves against local Docker images and never silently falls into a source build.Declared construction parameters:
EnvFactory.params = ParamSpec(Param(...))validatesmake()arguments,enumerate_variants()lists a factory’s concrete sub-environments, anddescribe()/describe_json()/python -m rlmesh._describeemit a JSON metadata envelope without constructing anything.A live debug viewer: pass
view="terminal",view="http:9000", orview="both"torun()/session(), or configurerlmesh.View(...). It is best-effort and never breaks an eval.rlmesh.sanitize_metadata()coerces a third-party sim’s richinfoobjects into wire-safe metadata, and connection failures name the address and the likely fix instead of a bare transport error.Client timeouts:
RemoteEnv,RemoteVectorEnv, andRemoteModelacceptconnect_timeout_secondsandrequest_timeout_seconds, so a hung peer fails with aTimeoutErrorinstead of blocking forever.Fail-loud argument handling: a parameter that cannot be honored (
instruction=on a served model, an unknownvectorization_mode, a conflicting CLI flag) raises with a directive error instead of being silently ignored.Negotiated workflow editions content-pinned to the sealed
2026.06edition spec, exact-matchrlmesh-wire-v1protocol generation, and a per-laneNEXT_STEPautoreset contract for vector environments.