Which runtime is my agent on?
As a rule of thumb, agents created before August 1 2026 run on runtime v1, and agents created on or after that date run on runtime v2. When you’d rather not rely on a date, two things tell you for sure:
The thread id is the quickest check — send one message and look at the
thread_id that comes back.
What’s different
Sending is identical on both runtimes:sendMessage, streamMessage, rerun,
and the channel openers route automatically based on the agent behind your
key, and you never pick a runtime when sending. The differences surface in a
few places only:
Reading runtime v1 threads
A thread lives on the runtime that created it, and thread reads name that runtime withruntime_version. Runtime v1 is the default — so reads of
runtime v1 threads take no selector at all, while reads of runtime v2 threads
must carry one:
1.x value (or none) selects runtime v1;
any value outside the 1.x family selects runtime v2, and it doesn’t have
to match the thread’s exact build. Asking the wrong runtime returns 404 — the
most common symptom is a UUID thread that “disappears” when read without
runtime_version.
The same applies on the management client and the REST API:
Traces
Runtime v1 agents expose the reasoning trace behind every interaction — what the agent understood, which rules fired, what it decided:threadTrace is paginated — pass page[size], page[after] / page[before],
and sort_by / sort_order in an optional second argument. On a runtime v1
WebSocket session opened with include_trace=true, the final
message envelope also embeds the trace as data.trace_info.
Trace support for runtime v2 is coming; until then these calls apply to
runtime v1 agents only.
WebSocket sessions
Runtime v1 agents accept a bidirectional WebSocket session throughclient.connect() — typed envelopes, automatic reconnection, and seq-based
resume. The full protocol is on the WebSocket page (SDK) and
API → WebSocket (wire format).
Runtime v2 agents don’t open sessions: connect() answers with an error
envelope explaining the session is SSE-only. They stream over HTTP with
streamMessage instead — one call per turn, the same token-by-token reply,
resumable with Last-Event-ID, and nothing to keep alive. The frames map
almost one to one:
Moving an integration to runtime v2
When the agent behind your key moves to runtime v2, sends keep working untouched. Work through this list for everything else:- Thread reads — add
runtime_version(the build your agent runs on, e.g.'0.8.0') tolistMessages,threads.getThread,getThreadMessages, andupdateThread; scopelistThreadswithruntime_versionplusagent_idoruser_id. - Thread ids — stop validating them as 24-character hex ids; runtime v2 ids are UUIDs.
- Streaming — replace
connect()+sendMessageframes withstreamMessage, dropagent_idfrom the request, and resume withLast-Event-IDinstead of aresumeframe. - Follow-up suggestions — handle the new
suggestionsframe (data.followup_suggestions, with thethread_idandinteraction_idit belongs to) instead of reading them off the message. - Traces — guard
threadTrace/interactionTrace/getThreadTrace/getInteractionTracecalls until runtime v2 trace support lands.
Still importing
ApolloClient from @aui.io/aui-client 1.x (the
ia-controller client)? Upgrade to v3 first — the
SDK upgrade guide maps every call — then come back to this
page for the runtime differences.