pub struct RuntimeSessionSpec {Show 18 fields
pub session_id: String,
pub env_id: String,
pub env_component_id: String,
pub model_component_id: String,
pub workflow_edition: Edition,
pub env_contract: EnvContract,
pub num_envs: usize,
pub base_seed: Option<i64>,
pub episode_seeds: Vec<i64>,
pub max_episodes: Option<u64>,
pub trial_index_base: Option<u64>,
pub max_episode_steps: Option<i64>,
pub max_episode_seconds: Option<f64>,
pub close_env_on_end: bool,
pub limits: RuntimeLimits,
pub subset_step: bool,
pub env_ceiling: Option<PeerCeiling>,
pub model_ceiling: Option<PeerCeiling>,
}Expand description
Everything one route needs to run: its identity, the negotiated env
contract, and the per-op limits. validate gates a spec
before the driver runs it.
Fields§
§session_id: StringCorrelation label only; OSS does not key on it (the managed layer owns session lifecycle). Kept as plumbing for telemetry/logs — its removal is the deferred closed split, out of scope here.
env_id: StringThe connected env container, UUIDv7 (minted by the runtime on attach).
The single routing key: replaces the old route_id + positional lane.
(Repurposed from the former descriptive-name field; the human env name
now lives only in the language SDK’s own contract type.)
env_component_id: String§model_component_id: String§workflow_edition: EditionWorkflow edition negotiated at the env handshake, already resolved to the
typed arm whose semantics this session runs under. Wire names are parsed
once, where they arrive, by
rlmesh_proto::parse_retained_edition — that is where the runtime
refuses an edition it was not built to drive, so a name outside the
retained list never reaches this field.
env_contract: EnvContract§num_envs: usize§base_seed: Option<i64>§episode_seeds: Vec<i64>Explicit per-episode reset seeds, consumed in episode-start order (a
vector reset claims one per lane). Overrides base_seed derivation when
non-empty; episodes beyond the list reset unseeded. Requires
driver-owned resets (autoreset DISABLED): under NEXT_STEP the env
seeds its own rolls, so the list would silently not apply.
max_episodes: Option<u64>§trial_index_base: Option<u64>First trial ordinal this route’s episodes walk; None is the default
base, 0 (so is an explicit Some(0)). Under driver-owned resets
(autoreset DISABLED) the driver always mints one ordinal per episode
start (base, base + 1, …), reports it on the episode events and
summaries, and delivers it as ResetRequest.options["trial_index"] to an
env that declared the key (see ENV_RESET_OPTIONS_KEY) – an env that
did not never sees it. A sharded run gives each shard its own base so the
shards together walk a benchmark’s trials once each, instead of every
shard re-deriving an index from a hashed seed. Under NEXT_STEP autoreset
the env restarts its own lanes, so no ordinal is minted at all: the
default base is inert there, and a non-zero base is rejected by
validate since it could never be walked.
max_episode_steps: Option<i64>Truncate any episode after this many steps (runtime-enforced; the lane
is reset and the episode reported truncated). Requires driver-owned
resets (autoreset DISABLED).
max_episode_seconds: Option<f64>Truncate any episode after this wall-clock duration (seconds), same
semantics and autoreset requirement as max_episode_steps.
close_env_on_end: bool§limits: RuntimeLimits§subset_step: boolThe env advertised the subset_step handshake capability: every lane
can be reset and stepped on its own. The driver then runs one episode
loop per lane (a lane is its own group) instead of stepping the vector
in lockstep, and episode seeds/indices come from a route-global slot
counter so the scored set is fixed by the budget alone.
env_ceiling: Option<PeerCeiling>The served env’s ceiling; None when the env runs in-process.
model_ceiling: Option<PeerCeiling>The served model’s ceiling; None when the model runs in-process.
Implementations§
Source§impl RuntimeSessionSpec
impl RuntimeSessionSpec
Sourcepub fn trial_index_base(&self) -> u64
pub fn trial_index_base(&self) -> u64
The first trial ordinal this route walks: trial_index_base, or 0 when
the session left it unset.
pub fn validate(&self) -> Result<(), String>
Sourcepub fn edition_defaults(&self) -> &'static EditionDefaults
pub fn edition_defaults(&self) -> &'static EditionDefaults
The edition-governed defaults this session runs under. Every value the driver would otherwise hardcode comes from here, so a future edition changes a table row instead of a code path.
pub fn env_context(&self) -> RuntimeEnvContext
Sourcepub fn observation_space(&self) -> Option<&SpaceSpec>
pub fn observation_space(&self) -> Option<&SpaceSpec>
Returns the observation space, or None if the spec has not been
populated/validated (env_contract.observation_space is unset).
All RuntimeSessionSpec fields are public, so an unvalidated spec is
trivial to construct; this accessor never panics. The driver validates
the spec before running and uses the infallible internal accessor.
Sourcepub fn action_space(&self) -> Option<&SpaceSpec>
pub fn action_space(&self) -> Option<&SpaceSpec>
Returns the action space, or None if the spec has not been
populated/validated (env_contract.action_space is unset).
See RuntimeSessionSpec::observation_space for why this is fallible.
Trait Implementations§
Source§impl Clone for RuntimeSessionSpec
impl Clone for RuntimeSessionSpec
Source§impl Debug for RuntimeSessionSpec
impl Debug for RuntimeSessionSpec
Source§impl PartialEq for RuntimeSessionSpec
impl PartialEq for RuntimeSessionSpec
impl StructuralPartialEq for RuntimeSessionSpec
Auto Trait Implementations§
impl Freeze for RuntimeSessionSpec
impl RefUnwindSafe for RuntimeSessionSpec
impl Send for RuntimeSessionSpec
impl Sync for RuntimeSessionSpec
impl Unpin for RuntimeSessionSpec
impl UnsafeUnpin for RuntimeSessionSpec
impl UnwindSafe for RuntimeSessionSpec
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
Source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a tonic::Request