---
title: "Run one v2 conversation turn with an SSE response"
method: POST
path: "/v1/conversations/{conversation_id}/turns/stream"
tags: ["conversations"]
---

# Run one v2 conversation turn with an SSE response

`POST /v1/conversations/{conversation_id}/turns/stream`

SSE counterpart to ``POST /conversations/{id}/turns``.

Token streaming: the v2 ``ConversationTurnDriver`` prepares a snapshot,
computes without a checked-out connection, and then finalizes atomically. It 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`` commits admission before the response is
constructed, is connection-free while the driver task computes, and commits finalization
before the ``complete`` frame. The generator only touches the session after the driver task
has finished, so the two never race on it.

## Path parameters

- `conversation_id` string, uuid, required

## Query parameters

- `trace` boolean

## Request body

- TurnRequest — Drive one turn of a v2 conversation (Phase F1).
  - `user_message` string, required
  - `for_update` boolean — Deprecated compatibility field; all turns use optimistic guarded finalization and this value has no effect.
  - `include_evidence` boolean
  - `evidence_view` 'display' | 'full'

## Response `200`

Successful Response

- unknown

## Other responses

- `400` — Bad request
- `401` — Authentication required
- `404` — Resource not found
- `409` — The conversation changed during computation. Safe to retry after the advertised delay; model and tool work was not replayed internally.
- `422` — Validation Error
- `503` — The turn outcome is uncertain after output, a possible external action, or an unresolved commit. Do not retry automatically.

---

[API](https://skmtc.net/oneloop-hq/apis/feather-api.md) · [All operations](https://skmtc.net/oneloop-hq/apis/feather-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/oneloop-hq/feather-api/revisions/5a5597ebb2d6/schema)
