Skip to main content

WorkflowTotals

Struct WorkflowTotals 

Source
pub struct WorkflowTotals {
    pub total_input_tokens: u64,
    pub total_output_tokens: u64,
    pub total_cached_input_tokens: u64,
    pub total_thinking_tokens: u64,
    pub total_tool_tokens: u64,
    pub total_cost_usd: f64,
    pub task_count: u32,
}
Expand description

Aggregate token + cost rollup emitted on EngineEvent::WorkflowEnd.

Issue #1173: today’s WorkflowEnd carries just the workflow’s return value, so dashboards and the CLI re-walk every TaskEnd to compute per-execution totals. This struct surfaces the same numbers once on the terminating event so consumers can size the run without parsing the full event log.

The engine populates this by summing TokenUsage fields across every TaskEnd emitted in the workflow scope. Sub-script TaskEnds (events wrapped inside EngineEvent::SubScript) DO contribute — the engine relay forwards them to the parent counter so a chain’s outer WorkflowEnd reflects the entire chain’s spend.

total_cost_usd is the only field the engine can’t always populate on its own — pricing tables live in akribes-server to keep akribes-core free of provider rate metadata. The field defaults to 0.0 and stays 0.0 when the engine has no cost data; downstream enrichers may overwrite it on the server side before persistence.

Fields§

§total_input_tokens: u64

Sum of TokenUsage::input_tokens across every TaskEnd in the workflow scope (including sub-script TaskEnds). Superset of cached + cache-write — see TokenUsage for the convention.

§total_output_tokens: u64§total_cached_input_tokens: u64

Sum of TokenUsage::cached_input_tokens (cache READS).

§total_thinking_tokens: u64

Sum of TokenUsage::reasoning_tokens (extended thinking / reasoning tokens — a SUBSET of total_output_tokens).

§total_tool_tokens: u64

Tokens spent on tool-call traffic. Reserved for future per-tool breakdown — the engine doesn’t track this separately today, so it stays 0. Present on the wire so SDKs can render the slot without a schema bump when the engine starts populating it.

§total_cost_usd: f64

Sum of per-task USD cost. Always 0.0 when emitted by the engine — pricing lives in akribes-server. Server-side enrichment may overwrite before persistence.

§task_count: u32

Number of TaskEnd events folded into the totals above.

Implementations§

Source§

impl WorkflowTotals

Source

pub fn accumulate(&mut self, usage: Option<&TokenUsage>)

Fold a single TokenUsage into the running totals. No-op for None so the engine can call it on every TaskEnd without branching on the optional usage field.

Source

pub fn merge(&mut self, other: &WorkflowTotals)

Merge another WorkflowTotals (e.g. from a sub-script) into self. Used by the engine when the relay surfaces a child workflow’s rollup — the outer chain’s totals subsume every sub-script’s.

Trait Implementations§

Source§

impl Clone for WorkflowTotals

Source§

fn clone(&self) -> WorkflowTotals

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for WorkflowTotals

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for WorkflowTotals

Source§

fn default() -> WorkflowTotals

Returns the “default value” for a type. Read more
Source§

impl<'de> Deserialize<'de> for WorkflowTotals

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl PartialEq for WorkflowTotals

Source§

fn eq(&self, other: &WorkflowTotals) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl Serialize for WorkflowTotals

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl StructuralPartialEq for WorkflowTotals

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more