# Read a streaming Chat Completions response

Set `stream` to `true` in a Chat Completions request to continuously read generated increments through server-sent events (SSE). This page applies only to Chat Completions; Responses and Anthropic Messages use their own event shapes.

```text
POST https://token.moi.matrixorigin.cn/v1/chat/completions
```

## Before you call

Prepare credentials with Genesis access and a model ID that supports Chat Completions. See [Chat Completions](chat-completions.md) for request fields and the non-streaming response.

## Request example

```bash
curl -N -X POST "https://token.moi.matrixorigin.cn/v1/chat/completions" \
  -H "Authorization: Bearer $GENESIS_ACCESS_TOKEN" \
  -H 'Content-Type: application/json' \
  -H 'Accept: text/event-stream' \
  -d '{
    "model": "'"$MODEL_ID"'",
    "messages": [{"role": "user", "content": "Explain the purpose of a primary key in one sentence."}],
    "stream": true
  }'
```

`-N` disables curl output buffering so that SSE events can be read line by line.

## Successful response

The service returns `text/event-stream`. Parse complete events one by one; append text only from events containing `delta.content`, and mark the result complete only after receiving `data: [DONE]`.

```text
data: {"object":"chat.completion.chunk","choices":[{"delta":{"content":"A primary key"}}]}

data: {"object":"chat.completion.chunk","choices":[{"delta":{"content":" uniquely identifies each row in a table."}}]}

data: [DONE]
```

Network chunks can split an SSE event. Retain incomplete state until a complete event and `[DONE]` are received.

## Error response

Before the stream is established, errors use ordinary HTTP status codes and a JSON error object. An exception after the stream starts can appear as an event error or connection interruption; treat a connection that ends before `[DONE]` as interrupted rather than complete.

## Next steps

See the full [Chat Completions](chat-completions.md#streaming-response) request, response, and field descriptions.
