Skip to main content

OutboundRun

Struct OutboundRun 

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

A scoped handle for one logical outbound run.

All messages sent through this handle carry the same run_id, which lets the peer group them as one run. The run boundary is defined by the caller — this SDK never infers it.

Obtain one from crate::MessageContext::run or crate::WeixinClient::run.

§Ordering

Each send is one HTTP request. Awaiting calls in sequence guarantees the peer observes them in that order. If you spawn sends concurrently, ordering is yours to manage.

§Observed behaviour

Verified against the production API on 2026-08-13: the server accepts tool-call progress items (HTTP 200) but answers with an empty body and allocates no message_id, whereas any message carrying a text item does get one — the server does not treat progress items as conversation messages, and the WeChat client does not render them. Five wire variants were tried (GENERATING state, progress merged into a text item_list, added msg_id/update_time_ms, dropped run_id/context_token) with no change, and getConfig exposes no capability flag. This reads as a capability iLink has reserved but not yet enabled.

run_id was likewise not observed to affect client-side presentation; treat it as a server-side correlation field. The value of both features today is protocol readiness, not a user-visible progress display.

§Example

let run = ctx.run();
run.tool_call_start("bash", Some("call-1")).await?;
// ... execute the tool ...
run.tool_call_result("bash", Some("call-1"), ToolCallStatus::Completed)
    .await?;
run.send_text("done").await?;

Implementations§

Source§

impl OutboundRun

Source

pub fn with_run_id(self, run_id: impl Into<String>) -> Self

Override the auto-generated run ID (e.g. to reuse a caller-side run identifier).

Source

pub fn run_id(&self) -> &str

The run ID carried by every message sent through this handle.

Source

pub fn to(&self) -> &str

The recipient of this run.

Source

pub async fn send_text(&self, text: &str) -> Result<SendResult>

Send text (markdown filter applies per config, same as reply_text).

Source

pub async fn send_media(&self, file_path: &Path) -> Result<SendResult>

Upload and send a media file.

Source

pub async fn tool_call_start( &self, tool_name: &str, tool_call_id: Option<&str>, ) -> Result<SendResult>

Announce that a tool call started.

tool_call_id pairs this event with the matching Self::tool_call_result; provide one whenever the peer may see overlapping calls.

Source

pub async fn tool_call_result( &self, tool_name: &str, tool_call_id: Option<&str>, status: ToolCallStatus, ) -> Result<SendResult>

Announce that a tool call finished.

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> 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> 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> 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 = 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<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