Skip to main content

Command

Enum Command 

Source
pub enum Command {
Show 14 variants Infer { prompt: String, max_tokens: u32, images: Vec<Handle>, }, Open { path: String, }, Slice { handle: Handle, offset: u64, len: u64, }, SliceBytes { handle: Handle, offset: u64, len: u64, }, PageText { handle: Handle, page: u32, }, PageTextOpt { handle: Handle, page: u32, }, PageImage { handle: Handle, page: u32, }, Embed { texts: Vec<String>, }, Fetch { url: String, }, DocumentText { handle: Handle, }, ImageOp { handle: Handle, op: ImageOperation, }, Emit { progress: Value, }, Done { result: Value, }, Fail { code: String, message: String, },
}
Expand description

What a guest asks the host to do, returned from its init/step exports.

Variants§

§

Infer

Run a prompt against the job’s model.

Fields

§prompt: String

The prompt to generate from.

§max_tokens: u32

Upper bound on tokens generated. A guest can also end generation early by returning TokenAction::Stop from its on_token export.

§images: Vec<Handle>

Images to accompany the prompt, named by handle.

Handles rather than bytes, for the same reason file contents are not handed over: an image can be tens of megabytes, and routing it through guest memory would put the 4 GiB wasm32 ceiling back in play for no benefit. The host already holds the bytes; it can pass them to the model directly.

Requires a model with vision capability. Empty for ordinary text-only inference, which is why it is #[serde(default)] — a block compiled before this field existed still deserializes.

§

Open

Open a file. Capability-checked against the job’s spec.

Yields a handle and a length rather than contents — see the crate docs on why bulk data does not cross this boundary.

Fields

§path: String

Path to open. Denied unless the spec grants read access to it.

§

Slice

Pull one bounded window of an open file into guest memory.

The guest picks len, so the guest sets its own memory ceiling.

Fields

§handle: Handle

Handle from a previous Command::Open.

§offset: u64

Byte offset to read from. u64 so that files far larger than a guest could hold remain fully addressable.

§len: u64

Maximum bytes to return. The host may return fewer; see Event::Sliced.

§

SliceBytes

Pull one bounded window of an open file as raw bytes.

The binary counterpart to Command::Slice. Prefer Slice for text: it needs no encoding, and it handles the character-boundary problem for you. This exists for blocks that genuinely need bytes — inspecting an image header, say — and pays base64’s cost to carry them.

Fields

§handle: Handle

Handle from a previous Command::Open.

§offset: u64

Byte offset to read from.

§len: u64

Maximum bytes to return.

§

PageText

Extract one page of a document as text.

Fails when the document has no text layer; check MediaKind::Document::has_text_layer first.

Fields

§handle: Handle

Handle from a previous Command::Open.

§page: u32

Zero-based page number.

§

PageTextOpt

Extract one page as text, reporting failure as a value.

Same work as Command::PageText, different contract: where that one fails the whole block, this answers Event::PageTextAttempted with whether it worked. One unreadable page in a 300-page filing then costs that page rather than the document.

This is not a try/catch around a host call, which would break replay by letting the guest swallow the suspend signal. The host still issues exactly one answer for exactly one command, in the same order, every time — only the value differs. Determinism forbids catching the suspension, not receiving a negative result.

A handle that names nothing still fails hard. That is a block asking for something it never opened — a bug in the script rather than a property of the corpus — and returning ok: false for it would let a typo read as “every page of every document is unreadable”.

Fields

§handle: Handle

Handle from a previous Command::Open.

§page: u32

Zero-based page number.

§

PageImage

Render one page of a document to an image.

Yields a new handle referring to the rendered image, which can then be named in Command::Infer. That indirection is deliberate: the image stays host-side like every other bulk value, and a rendered page is usable exactly wherever a file-backed image is.

Fields

§handle: Handle

Handle from a previous Command::Open.

§page: u32

Zero-based page number.

§

Embed

Embed one or more texts, returning a vector each.

Batched by construction: the guest hands over every text it wants embedded in one command. Embedding a corpus means tens of thousands of chunks, and a round trip per chunk is the difference between minutes and hours — so the batch is the primitive and a single text is just a batch of one.

Served by the spec’s embedding_model, which is deliberately not the job’s chat model: they are different models, and asking a chat model to embed either fails or returns something that is not an embedding.

Fields

§texts: Vec<String>

The texts to embed, in order. Vectors come back in the same order.

§

Fetch

Download a URL and hand back a handle to it.

Answers with Event::Opened, the same event Command::Open produces, so everything downstream is unchanged: a fetched resource can be sliced, identified, extracted from, or handed to a vision model exactly as a local file can. One new command, no new surface.

Requires a matching Fetch prefix in the spec’s capabilities. A corpus on the web is still a corpus, and the capability list has to describe reaching it.

Fields

§url: String

The URL to retrieve. Must begin with a granted prefix.

§

DocumentText

Every character of text in a document, in one call.

What most callers reading a PDF actually want, and the direct way to ask for it. Before this existed the only route was Command::PageText with page: 0, which reads like “the first page” and quietly means “everything” whenever the extractor emitted no page breaks — a gap that cost a real user two iterations and nearly a wrong conclusion about whether cuttlefish could read their corpus at all.

Prefer this over walking pages unless the pages are genuinely needed separately: the whole document is one extraction either way.

Fields

§handle: Handle

Handle from a previous Command::Open.

§

ImageOp

Transform an image handle, yielding a new image handle.

Same indirection as Command::PageImage, and for the same reason: pixels stay host-side, and the result is usable exactly wherever a file-backed image is — including as an Command::Infer image.

This is the one image operation that needs a decoder, which is why it lives here rather than in the guest. Metadata (dimensions, EXIF, chunk structure) is header parsing and is available to any script without a host round trip or a feature flag; looking at the pixels is not.

Hosts built without the image-ops feature reject this with a clear message rather than pretending to succeed.

Fields

§handle: Handle

Handle from a previous Command::Open or Command::PageImage.

§op: ImageOperation

What to do to it.

§

Emit

Report progress to whoever is watching the job’s event stream.

Fields

§progress: Value

Arbitrary JSON, forwarded verbatim to the job’s subscribers.

§

Done

Finish successfully with this payload.

Fields

§result: Value

The job’s result, shaped by the spec’s declared output.

§

Fail

Give up. The job ends with this code and message, and no result.

Fields

§code: String

Machine-readable code; see error_codes.

§message: String

Human-readable explanation.

Trait Implementations§

Source§

impl Clone for Command

Source§

fn clone(&self) -> Command

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 Command

Source§

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

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

impl<'de> Deserialize<'de> for Command

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 Command

Source§

fn eq(&self, other: &Command) -> 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 Command

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 Command

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, 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.