pub struct AgentOutcome {
pub text: String,
pub final_message: String,
pub stop_reason: String,
pub session_id: String,
}Expand description
The canonical agent-outcome record: what a completed agent activity’s result payload carries, from every harness.
Four fields, all snake_case, all mandatory, all AWL-expressible — the
AWL checker demands an agent action’s declared return type be a record of
exactly this shape (text: String, final_message: String, stop_reason: String,
session_id: String), so a workflow reads those values as ordinary record fields.
Empty text and final_message values on a completed run are honest, not a bug: an agent that
finished its turn having emitted only tool calls said nothing, and the harness reports that
truth rather than inventing words (the work is on the transcript). When the run produced exactly
one completed answer, final_message == text; that duplication is the honest degenerate case.
stop_reason is one of the canonical strings produced by StopKind::canonical_stop_reason:
end_turn | tool_use | limit_reached | cancelled | error | other.
Fields§
§text: StringThe whole run output: every completed agent answer, accumulated by the harness.
final_message: StringThe run’s LAST completed agent answer message, alone and exactly as the agent said it.
Reasoning, tool output, and user turns never enter this field. It exists separately from
Self::text so an exact-token judge reads the actual final verdict rather than falsely
failing a successful run because narration from earlier answers precedes it. It is empty when
the agent produced no answer text at all, and equals text when there was exactly one answer.
stop_reason: StringThe canonical snake_case stop reason
(StopKind::canonical_stop_reason).
session_id: StringThe handle of the conversation that produced this outcome.
A FACT, not a promise: the id names the session the harness actually
ran — minted, loaded, or derived by that harness — and says nothing
about whether it can be resumed. Resumability is the per-agent question
a harness’s own handshake answers (for ACP, the initialize response’s
loadSession capability), never something this field asserts.
The id is meaningful only to the harness that minted it; resume routing
pairs the id with the harness identity the workflow record already
carries. It is never empty — a harness with a vacant handle is refused
at AgentOutcome::into_payload, not shipped.
Implementations§
Source§impl AgentOutcome
impl AgentOutcome
Sourcepub fn new(
text: impl Into<String>,
final_message: impl Into<String>,
stop: &StopKind,
session_id: impl Into<String>,
) -> AgentOutcome
pub fn new( text: impl Into<String>, final_message: impl Into<String>, stop: &StopKind, session_id: impl Into<String>, ) -> AgentOutcome
Builds the record from the whole accumulated answer text, the last completed answer alone,
the neutral stop kind, and the conversation handle, spelling stop_reason through the one
canonical mapping.
Sourcepub fn into_payload(self) -> Result<Payload, AgentOutcomeError>
pub fn into_payload(self) -> Result<Payload, AgentOutcomeError>
Serializes the record as the activity’s JSON result Payload.
§Errors
AgentOutcomeError::EmptySessionId when the mandatory session_id
is the empty string — the vacancy is refused by name rather than
shipped. AgentOutcomeError::Encode when the record cannot be
encoded — unreachable for four plain strings, but never swallowed.
Trait Implementations§
Source§impl Clone for AgentOutcome
impl Clone for AgentOutcome
Source§fn clone(&self) -> AgentOutcome
fn clone(&self) -> AgentOutcome
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for AgentOutcome
impl Debug for AgentOutcome
Source§impl<'de> Deserialize<'de> for AgentOutcome
impl<'de> Deserialize<'de> for AgentOutcome
Source§fn deserialize<__D>(
__deserializer: __D,
) -> Result<AgentOutcome, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(
__deserializer: __D,
) -> Result<AgentOutcome, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
impl Eq for AgentOutcome
Source§impl PartialEq for AgentOutcome
impl PartialEq for AgentOutcome
Source§impl Serialize for AgentOutcome
impl Serialize for AgentOutcome
Source§fn serialize<__S>(
&self,
__serializer: __S,
) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>where
__S: Serializer,
fn serialize<__S>(
&self,
__serializer: __S,
) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>where
__S: Serializer,
impl StructuralPartialEq for AgentOutcome
Source§impl TS for AgentOutcome
impl TS for AgentOutcome
Source§type WithoutGenerics = AgentOutcome
type WithoutGenerics = AgentOutcome
WithoutGenerics should just be Self.
If the type does have generic parameters, then all generic parameters must be replaced with
a dummy type, e.g ts_rs::Dummy or (). The only requirement for these dummy types is that
EXPORT_TO must be None. Read moreSource§type OptionInnerType = AgentOutcome
type OptionInnerType = AgentOutcome
std::option::Option<T>, then this associated type is set to T.
All other implementations of TS should set this type to Self instead.Source§fn docs() -> Option<String>
fn docs() -> Option<String>
TS is derived, docs are
automatically read from your doc comments or #[doc = ".."] attributesSource§fn decl_concrete(cfg: &Config) -> String
fn decl_concrete(cfg: &Config) -> String
TS::decl().
If this type is not generic, then this function is equivalent to TS::decl().Source§fn decl(cfg: &Config) -> String
fn decl(cfg: &Config) -> String
type User = { user_id: number, ... }.
This function will panic if the type has no declaration. Read moreSource§fn inline(cfg: &Config) -> String
fn inline(cfg: &Config) -> String
{ user_id: number }.
This function will panic if the type cannot be inlined.Source§fn inline_flattened(cfg: &Config) -> String
fn inline_flattened(cfg: &Config) -> String
Source§fn visit_generics(v: &mut impl TypeVisitor)where
AgentOutcome: 'static,
fn visit_generics(v: &mut impl TypeVisitor)where
AgentOutcome: 'static,
Source§fn output_path() -> Option<PathBuf>
fn output_path() -> Option<PathBuf>
T should be exported, relative to the output directory.
The returned path does not include any base directory. Read moreSource§fn visit_dependencies(v: &mut impl TypeVisitor)where
AgentOutcome: 'static,
fn visit_dependencies(v: &mut impl TypeVisitor)where
AgentOutcome: 'static,
Source§fn dependencies(cfg: &Config) -> Vec<Dependency>where
Self: 'static,
fn dependencies(cfg: &Config) -> Vec<Dependency>where
Self: 'static,
Source§fn export(cfg: &Config) -> Result<(), ExportError>where
Self: 'static,
fn export(cfg: &Config) -> Result<(), ExportError>where
Self: 'static,
TS::export_all. Read moreSource§fn export_all(cfg: &Config) -> Result<(), ExportError>where
Self: 'static,
fn export_all(cfg: &Config) -> Result<(), ExportError>where
Self: 'static,
TS::export. Read more