> ## Documentation Index
> Fetch the complete documentation index at: https://platform.eldros.ai/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Sessions, turns & traces

> The three-layer model behind every judged conversation.

## The model

```
session (your conversation id)
└── turn (one user ↔ agent exchange)          ← judged unit
    ├── eldros.message events                  ← the transcript
    └── gen_ai.* spans (LLM / tool calls)      ← the trace, auto-instrumented
```

## Sessions

A **session** is one conversation, identified by *your* conversation id — Eldros never invents it when you have one. On WebSocket connections the connection is the session; on HTTP turn-based protocols the id rides each request.

```python theme={null}
with eldros_sdk.turn(msg, session_id=your_conversation_id) as t:
    ...
```

Precedence: an explicit `session_id=` on the turn wins; otherwise the ambient session (`set_session()` at connect) applies; a fresh id is minted only for genuinely single-shot calls.

## Turns

A **turn** is one user message and the agent's reply — the unit our judges score. Each turn is a span carrying the transcript as structured events, so the judge reads clean role/content pairs rather than raw protocol frames.

## Traces

Everything the agent did *during* the turn — LLM calls, tool invocations — nests under the turn span automatically, because the turn is the active span while your handler runs. No ids to manage: the correlation is structural.

<Note>
  Transcripts are what get judged; traces explain the verdict. Both flow through one OpenTelemetry pipeline — there is no second integration to add later.
</Note>
