Skip to main content

Block

Enum Block 

Source
pub enum Block {
    Text {
        text: String,
    },
    Thinking {
        text: String,
        signature: Option<String>,
    },
    ToolUse {
        id: String,
        name: String,
        input: Value,
    },
    ToolResult {
        tool_use_id: String,
        content: String,
        is_error: bool,
    },
    Image {
        media_type: String,
        data: String,
        source: Option<String>,
    },
}
Expand description

One piece of a message. A single assistant turn is often several blocks: thinking, then text, then one or more tool calls.

PartialEq because session recording decides between “append the new tail” and “the transcript was rewritten in place” by comparing the messages a run started from with what it left behind.

Variants§

§

Text

Fields

§text: String
§

Thinking

Reasoning. signature is opaque and must be echoed back unchanged when continuing on the same model.

Fields

§text: String
§signature: Option<String>
§

ToolUse

Fields

§name: String
§input: Value
§

ToolResult

Fields

§tool_use_id: String
§content: String
§is_error: bool
§

Image

An image the user put in front of the model.

User turns only, and that is a portability decision rather than a simplification. Anthropic accepts an image inside a tool_result; the OpenAI dialect’s role: "tool" messages carry a string and nothing else, and llama-server is the same. A tool that returned pixels would therefore work on one backend and silently lose them on the other — the shape of failure this project keeps finding, in the one place where the missing thing is what the whole turn was about. So an image enters the conversation the way a person hands one over, and encode_message renders it only on a user message.

Not every model has eyes. Provider::vision says whether the one on the other end does, and a backend that cannot see renders this block as a line of text naming the file instead — so a run against a text-only model behaves exactly as it did before this variant existed, rather than failing on a request it cannot serve.

Fields

§media_type: String

An IANA media type: image/png, image/jpeg, image/gif, image/webp. Both providers require it and neither sniffs.

§data: String

Base64, with no data: prefix. The prefix is a rendering detail of the OpenAI dialect — anthropic.rs wants the payload bare — so it belongs to the backend that needs it and not to the type every backend shares.

§source: Option<String>

What the file was called where it came from.

Never sent to a provider. It exists because every human-facing reader of a transcript — mecha sessions, the TUI, recall — otherwise has a megabyte of base64 and no way to say what it was. It is also what the text-only rendering names.

Implementations§

Source§

impl Block

Source

pub fn text(s: impl Into<String>) -> Self

Source

pub fn image( media_type: impl Into<String>, bytes: &[u8], source: Option<String>, ) -> Self

An image block from raw file bytes.

One encoder, so the data: prefix question is answered once: what goes in is bare base64, and the one dialect that wants a prefix adds it at the wire.

Source

pub fn image_placeholder(media_type: &str, source: Option<&str>) -> String

How a person, or a model with no eyes, is told an image was here.

Shared so the text-only provider rendering and every transcript reader say the same thing. A reader that invented its own wording would be a second answer to “what was in this turn”.

Trait Implementations§

Source§

impl Clone for Block

Source§

fn clone(&self) -> Block

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 Block

Source§

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

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

impl<'de> Deserialize<'de> for Block

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 Block

Source§

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

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

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

Inequality operator !=. Read more
Source§

impl Serialize for Block

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 Block

Auto Trait Implementations§

§

impl Freeze for Block

§

impl RefUnwindSafe for Block

§

impl Send for Block

§

impl Sync for Block

§

impl Unpin for Block

§

impl UnsafeUnpin for Block

§

impl UnwindSafe for Block

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

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