Run one v2 conversation turn with an SSE response
SSE counterpart to POST /v2/conversations/{id}/turns.
Token streaming: the v2 ConversationTurnDriver runs the turn as one
read-modify-write transaction but now accepts an on_token callback that
the orchestrators/runnables fire as the answer streams (speculative losers
and transferring members are filtered upstream — a Supervisor buffers the
speculation and flushes only on continue). We bridge that push-callback
to this pull-generator with an :class:asyncio.Queue: the driver runs as a
task that enqueues each token delta, and the generator drains the queue into
delta frames as they arrive. When the driver finishes we emit a
complete frame carrying the v2 TurnResponse JSON (including the
server-measured turn_ttft_ms). The wire contract (delta /
complete / error frames) matches /v1/runtime/turn/stream so the
UI needs no change.
DB session lifecycle: the per-request session runs the org-scope check
and the turn (inside the driver task), and is committed before the
complete frame so the FastAPI dependency teardown doesn’t hold it open
across the response. The generator only touches the session after the driver
task has finished, so the two never race on it.
Authorizations
Path Parameters
Query Parameters
Body
Response
Successful Response