Skip to main content

ToolCall

Struct ToolCall 

Source
pub struct ToolCall { /* private fields */ }
Expand description

One call to one tool.

Built through ToolCatalog, so a tool nobody declared cannot be constructed — the refusal happens before an effect exists, rather than inside one.

Implementations§

Source§

impl ToolCall

Source

pub fn prepare( catalog: &ToolCatalog, client: Arc<dyn ToolClient>, id: ToolId, arguments: Value, egress: Option<&Egress>, ) -> Result<Self, ToolError>

Prepare a call, if the operator permits this tool.

§Prefer StepCtx::call_tool

This takes whatever catalogue it is handed, and nothing here binds that catalogue to the manifest governing the caller. A hand-built one — which is the obvious thing to write, and what an older version of examples/governed_transfer.rs demonstrated — compiles, runs, and can be laxer than the declaration: a ToolSafety::read_only entry for a tool the manifest calls mutating exempts it from the whole-value taint gate and carries Recovery::Retry, so a timed-out money-moving call is sent again. The plane’s own catalogue is refused at build for exactly that divergence; a skill’s is not checked by anything.

StepCtx::call_tool dispatches over the plane’s checked catalogue and makes the drift unrepresentable. Where a skill genuinely needs its own — a catalogue assembled before a runtime exists, or one for a test — build it with ToolCatalog::from_manifest, which derives the reach from the declaration rather than restating it.

§Errors

ToolError::Unreachable when the tool is not in the catalogue. It is deliberately not a separate “unknown tool” error at the call site: from the run’s point of view an undeclared tool is one it cannot reach, and treating it as anything softer invites a fallback.

Source

pub fn answering( self, call: &ToolCall, offered: &ToolDeclaration, ) -> Result<Self, ToolError>

Mark this execution as the answer to a model’s call made to offered, so its span carries the provider’s call id (gen_ai.tool.call.id).

Telemetry only: the id is in neither the effect key nor the journal’s descriptor. An id over 256 bytes is not recorded.

§Errors

ToolError::Unreachable when the call named another offer, or the offer stands for another tool: a span joining this execution to the call would say the model asked for what ran.

Trait Implementations§

Source§

impl Debug for ToolCall

Source§

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

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

impl Effect for ToolCall

Source§

fn gen_ai_request(&self) -> Option<GenAiRequest>

No provider: a tool call names what ran, not who served it.

Source§

fn trust(&self) -> Trust

A tool result is the outside world’s data.

Stated rather than inherited, because this is the one effect where a reader is most likely to wonder whether the catalogue could relax it. It cannot: the catalogue governs authority, not provenance.

Source§

fn source(&self) -> SourceId

The tool’s own reference, so a source rule can name this tool.

tool://server/name — the spelling a manifest grants and a reviewer reads. Under the family-level default every granted tool answered as effect:tool.call, so a ProtectedField::from_sources rule could not distinguish the CRM lookup from the ticket search: “the recipient must come from the CRM” was unsatisfiable strictly, and satisfiable loosely by whichever tool an injected prompt reached first.

Source§

type Output = Value

What comes back. Must round-trip through JSON: replay reconstructs it from the journal rather than from the driver.
Source§

fn gen_ai_operation(&self) -> Option<&'static str>

Which OpenTelemetry GenAI operation this effect is, if it is one. Read more
Source§

fn descriptor(&self) -> EffectDescriptor

What this effect does. Hashed (with position) into the effect key.
Source§

fn mutates(&self) -> bool

Whether this mutates external state. Read more
Source§

fn recovery(&self) -> Recovery

What to do when the outcome is unknown — after a crash, or after an InDoubt failure. The two are the same situation reached from different directions.
Source§

fn retry(&self) -> RetryPolicy

How many times to repeat this effect when it fails, and how far apart. Read more
Source§

fn retries_landed(&self) -> bool

Whether a failure that landed may be tried again, within retry. Read more
Source§

fn max_sensitivity(&self) -> Sensitivity

The highest data sensitivity this sink may receive. Read more
Source§

fn sink_arguments(&self) -> Option<&Value>

The exact value this effect will send to its sink. Read more
Source§

fn rebind(&mut self, arguments: Value) -> bool

Bind arguments in place of the ones this effect was built over, where it can — what a declared redaction at a sink needs. Read more
Source§

fn protected_fields(&self) -> &[ProtectedField]

Field-specific source and sensitivity rules for a structured sink. Read more
Source§

fn output_sensitivity(&self) -> Sensitivity

How sensitive this effect’s output is, at minimum. Read more
Source§

fn attach(&mut self, provenance: &Provenance)

Receive the run-scoped provenance for this call. Read more
Source§

fn perform<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<Value, EffectError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Do the thing. Called at most once per key per run; never called during replay. Read more
Source§

fn gen_ai_response(&self, output: &Self::Output) -> Option<GenAiResponse>

What came back, split the way the convention reports it. Read more
Source§

fn carried(&self) -> Option<Tainted<Value>>

What this effect sends beside its bound arguments, with the label of everything in it. Read more
Source§

fn rebind_carried(&mut self, _carried: Value) -> bool

Bind a redacted copy of carried, where the effect can. Read more
Source§

fn outbound_bytes(&self) -> u64

How many bytes dispatching this effect sends out of the plane. Read more
Source§

fn credential_binding(&self) -> Option<CredentialBinding>

Whom the credential this effect presents names, for an effect that presents one to another party. Read more
Source§

fn delegation_depth(&self) -> Option<usize>

The resulting delegation depth when this effect hands authority onward. Read more
Source§

fn spend(&self, _output: &Self::Output) -> Spend

What this effect consumed. Read more
Source§

fn reconcile<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<Reconciliation<Self::Output>, EffectError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Ask the provider whether a call landed. Read more

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<E> AnyEffect for E
where E: Effect,

Source§

fn spend_erased(&self, output: &Value) -> Spend

Round-trips the output to ask the typed effect what it cost.

A type that cannot be deserialized from its own serialization is already broken for replay — Effect::Output requires the round-trip, and the journal reconstructs every output that way. Charging zero here is the same answer replay would reach, and the defect surfaces where it belongs.

Source§

fn gen_ai_response_erased(&self, output: &Value) -> Option<GenAiResponse>

Round-trips the output, for the reason spend_erased does.

Source§

fn descriptor(&self) -> EffectDescriptor

Source§

fn attach_erased(&mut self, provenance: &Provenance)

Source§

fn gen_ai_operation(&self) -> Option<&'static str>

Source§

fn mutates(&self) -> bool

Source§

fn recovery(&self) -> Recovery

Source§

fn retry(&self) -> RetryPolicy

Source§

fn retries_landed(&self) -> bool

Source§

fn max_sensitivity(&self) -> Sensitivity

Source§

fn sink_arguments(&self) -> Option<&Value>

Source§

fn rebind_erased(&mut self, arguments: Value) -> bool

Source§

fn carried(&self) -> Option<Tainted<Value>>

Source§

fn rebind_carried_erased(&mut self, carried: Value) -> bool

Source§

fn outbound_bytes(&self) -> u64

Source§

fn credential_binding(&self) -> Option<CredentialBinding>

Source§

fn protected_fields(&self) -> &[ProtectedField]

Source§

fn delegation_depth(&self) -> Option<usize>

Source§

fn source(&self) -> SourceId

Source§

fn trust(&self) -> Trust

Source§

fn output_sensitivity(&self) -> Sensitivity

Source§

fn gen_ai_request(&self) -> Option<GenAiRequest>

Source§

fn perform_erased<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<Value, EffectError>> + Send + 'async_trait>>
where 'life0: 'async_trait, E: 'async_trait,

Source§

fn reconcile_erased<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<Reconciliation<Value>, EffectError>> + Send + 'async_trait>>
where 'life0: 'async_trait, E: 'async_trait,

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<E> BuildsEffect<E> for E
where E: Effect,

Source§

fn into_effect(self) -> Result<E, StepError>

The effect, or the error that stops the step instead. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

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> IntoEither for T

Source§

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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
where F: FnOnce(&Self) -> bool,

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 more
Source§

impl<Unshared, Shared> IntoShared<Shared> for Unshared
where Shared: FromUnshared<Unshared>,

Source§

fn into_shared(self) -> Shared

Creates a shared type from an unshared type.
Source§

impl<T> MaybeSend for T
where T: Send,

Source§

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

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

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

Source§

type Error = !

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

fn try_from(value: U) -> Result<T, !>

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<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

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