pub struct StepRecord {
pub step: u32,
pub decision: String,
pub result: String,
pub prompt: String,
pub tool_call: String,
pub tokens: u64,
}Expand description
One recorded loop step — the full trace entry, as written and read back.
use io_harness::{StepRecord, Store};
let store = Store::memory()?;
let run_id = store.start_run("add a hello function", "src/hello.rs")?;
// A transient provider failure, and then the step that worked. Both are step
// 1: a retry writes its own row under the step number it retried.
store.record(run_id, &StepRecord::new(1, "retry 1 after a 503", ""))?;
// `new` alone records a decision and its result; `with_trace` adds the audit
// half — the exact prompt sent, the call the model made, and what it cost.
// Without it the trace says what happened and not why.
store.record(
run_id,
&StepRecord::new(1, "wrote src/hello.rs", "ok").with_trace(
"<the assembled prompt>",
r#"{"name":"write_file","arguments":{"path":"src/hello.rs"}}"#,
1_280,
),
)?;
// Read back for audit — and the reason `RunSummary::steps` is `MAX(step)`
// rather than a row count: two rows here, one agent step.
let steps = store.steps(run_id)?;
assert_eq!(steps.len(), 2);
assert_eq!(store.last_step(run_id)?, 1);
assert!(steps[1].tool_call.contains("write_file"));
assert_eq!(steps.iter().map(|s| s.tokens).sum::<u64>(), 1_280);Fields§
§step: u321-based step number within the run.
decision: StringWhat the agent decided this step (e.g. “wrote file”, “retry 1 after error”).
result: StringIntermediate result / model text for the step.
prompt: StringThe prompt sent to the model this step.
tool_call: StringThe tool call the model made, as JSON, or “” if none.
tokens: u64Total tokens used this step, 0 if the provider reported none.
Implementations§
Trait Implementations§
Source§impl Clone for StepRecord
impl Clone for StepRecord
Source§fn clone(&self) -> StepRecord
fn clone(&self) -> StepRecord
Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from
source. Read moreSource§impl Debug for StepRecord
impl Debug for StepRecord
Source§impl PartialEq for StepRecord
impl PartialEq for StepRecord
impl StructuralPartialEq for StepRecord
Auto Trait Implementations§
impl Freeze for StepRecord
impl RefUnwindSafe for StepRecord
impl Send for StepRecord
impl Sync for StepRecord
impl Unpin for StepRecord
impl UnsafeUnpin for StepRecord
impl UnwindSafe for StepRecord
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
Mutably borrows from an owned value. Read more
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> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
impl<T> Scalar for T
Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
The inverse inclusion map: attempts to construct
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
Checks if
self is actually part of its subset T (and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
Use with care! Same as
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
The inclusion map: converts
self to the equivalent element of its superset.