The Oda web transport

When you work in the DataMind Oda web interface, the page and the DataMind Oda that serves it on this computer are in constant contact: everything the page asks for as data goes through one request layer, and a chat's live view is kept in step by frames. This page is the reference for both, from the shape of a single call to the frames of a chat. For the web app itself, see The Oda web app; for the messages a failed request can show, see Connection and upload messages.

The shape of a request

How a request finds its handler

How a body travels

What an answer carries

What the page fetches

The frames of a chat

A chat's live side is kept in step by frames, which arrive over the interface's own live channel.

Limits of the request layer

Questions, answered

How can I tell which answer belongs to which request?

Every request carries a call id that the page mints, and its answer must echo the same one. An answer with a different call id is discarded rather than used.

What does a call get back when it fails?

The answer still comes: it carries the failure in place of a result, with the message to show. The messages the interface can show are listed in Connection and upload messages.

Why is a request answered not found?

Nothing claimed it: it matched none of the interface's registered routes, and no part of the interface took it under its prefix. Check the target the request names, then send it again.

What happens to a request while an update is being installed?

It waits. While an update is being installed, new requests are held back rather than handled, and they continue once the installation finishes.

Is every request body read in full?

No. An ordinary body is read in full, under the size limit, before its handler runs. A route that takes raw bytes, such as the upload path, receives them as a stream while they arrive and is not counted against the aggregate limit. File uploads in the web app follows that path.

Does an oversize request ever reach its handler?

No. A request over the size limit is refused with 413 and the connection is closed; nothing reaches a handler. The limit and its default are in Connection settings and defaults.

When does an answer arrive as multipart instead of JSON?

When it carries bytes. A response with no bytes is plain JSON; one with bytes arrives as a multipart response whose parts carry the message and the bytes, described in Binary attachments and downloads.

How does the page follow a chat while a turn runs?

Through frames on the interface's own live channel: one turn/start for the turn, an echo of the message you sent, the final assistant message, and one turn/end when the turn finishes; a turn that used tools adds tool/call and tool/result. A full current view arrives as a session/follow series.

Who can answer a request under the interface's prefix?

The parts of the interface register the routes they own while they run: a route lives as long as its part does, and two claims on the same route are refused rather than settled quietly.

Can I cancel a request I sent?

A caller can cancel a call at any point, including while the answer is being read. The call then fails rather than delivering, and bytes that arrive after the cancellation are not used.