> For the complete documentation index, see [llms.txt](https://api.docs.blockbrain.ai/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://api.docs.blockbrain.ai/de/konzepte/streaming.md).

# Streaming

SSE bietet einen leichten Einweg-Stream über HTTP, bei dem der Server inkrementelle Tokens/Ereignisse an den Client sendet, für reaktionsschnelle UIs und lang laufende Vervollständigungen

#### Wichtige Konzepte

* **Transport**: HTTP mit `Content-Type: text/event-stream`, Verbindung bleibt offen.
* **Ereignisse**: Zeilen, eingeleitet durch `event:` und `data:`; jedes Ereignis endet mit einer Leerzeile.
* **Heartbeat**: Periodische Kommentare (`: ping`) halten die Verbindung aktiv.
* **Beendigung**: Ein finales Ereignis (z. B. `event: done`) oder das Schließen des Streams.

#### Typischer Ablauf

1. Der Client sendet eine Vervollständigungsanfrage und gibt den Streaming-Modus an.
2. Der Server antwortet mit `text/event-stream` und beginnt, Tokens/Ereignisse zu senden.
3. Der Client rendert Tokens inkrementell und lauscht auf das terminierende Ereignis.

### Vollständiger SSE-Stream eines Beispiels

![SSE-Beispiel](/files/0e30acd146b2b3de1cd769bc0a474460bdd82a51)

## So funktioniert unser SSE

![Überblick über unser Streaming-SSE](/files/cb876fe14ced54e8671e3f0016ae3bce1b5eb386)

Unser Streaming-Kommunikationsfluss besteht aus vier Hauptkomponenten:

* Client
* Streaming-Dienst
* Vervollständigungsdienst
* KI-Anbieter

Die Abfolge lässt sich in mehrere Schlüsselphasen unterteilen:

### Einrichtung der initialen Verbindung

* Der Client initiiert eine Verbindung zum Streaming-Dienst über den URL-Endpunkt `/message-stream/{convo_id}/{session_id}`

{% openapi src="<https://blocky.theblockbrain.ai/openapi.json>" path="/message-stream/{convo\_id}/{session\_id}" method="get" %}
<https://blocky.theblockbrain.ai/openapi.json>
{% endopenapi %}

* Nach hergestellter Verbindung antwortet der Streaming-Dienst mit einem `connected` Ereignis

### Anfrageinitiierung

* Der Client sendet eine Anfrage an den Vervollständigungsdienst über den URL-Endpunkt `/cortex/completion/user-input`

{% openapi src="<https://blocky.theblockbrain.ai/openapi.json>" path="/cortex/completions/user-input" method="post" %}
<https://blocky.theblockbrain.ai/openapi.json>
{% endopenapi %}

* Der Vervollständigungsdienst leitet diese Anfrage mit aktiviertem Streaming an den KI-Anbieter weiter; der tatsächliche Endpunkt variiert je nach KI-Anbieter (OpenAI, Azure, Anthropic, Google, ... )

### Streaming-Prozess

* Das Streaming beginnt mit einem `message_start` Ereignis, das vom Vervollständigungsdienst über den Streaming-Bus an den Streaming-Dienst weitergegeben wird; anschließend leitet der Streaming-Dienst es an den Client weiter und signalisiert damit, dass der Dienst mit der Generierung einer Antwort begonnen hat.
* Der KI-Anbieter streamt erzeugte Tokens inkrementell an den Vervollständigungsdienst.
* Jedes Token wird zusammen mit den `new_token` Ereignissen durch die Kette weitergeleitet: KI-Anbieter → Vervollständigungsdienst → Streaming-Dienst → Client.
* Dieser Token-Streaming-Prozess wiederholt sich mehrfach, bis die Textgenerierung abgeschlossen ist.

### Abschluss und Persistenz

* Der Vervollständigungsdienst signalisiert `message_end` wenn die Textgenerierung abgeschlossen ist.
* Die Antwortnachricht wird intern vom Vervollständigungsdienst persistiert.
* Ein `message_ready` Ereignis wird gesendet, um anzuzeigen, dass die vollständige Antwortnachricht nun für die weitere Verarbeitung verfügbar ist (kopieren, löschen, Text-zu-Sprache generieren, ...).
* Der Vervollständigungsdienst gibt eine `200 OK` Antwort auf die ursprüngliche Client-Anfrage zurück.

### Verbindungsbeendigung

* Die Abfolge endet damit, dass der Streaming-Dienst die Verbindung zum Client schließt.

## Liste der SSE-Ereignisse

Neben den Haupt-SSE-Ereignissen gibt es weitere, die zusätzliche Informationen zur Vervollständigungsanfrage liefern; die Details sind wie folgt:

<details>

<summary>Ereignis: connected</summary>

Ereignis: `connected` - Der Stream ist verbunden

Typescript-Interface

```typescript
interface SSEData {
  message: string;
}
```

Beispieldaten:

```json
{
  "message": "Verbindung hergestellt"
}
```

</details>

<details>

<summary>Ereignis: user_message</summary>

Ereignis: `user_message` - Die Eingabenachricht wurde erfolgreich gespeichert und kann für weitere Verarbeitung verwendet werden (kopieren, löschen, Text-zu-Sprache generieren, ... )

Typescript-Interface

```typescript
interface UserMessage {
  _id: string;
  createdAt: string;
  modifiedAt: string;
  botId: string;
  userId: string;
  content: string;
  role: string;
  model: string;
  messageType: string;
  status: string;
}
```

Beispieldaten:

```json
{
  "_id": "678097bc45b174911deeeb44",
  "createdAt": "2025-01-10T03:45:00.534383",
  "modifiedAt": "2025-01-10T03:45:00.534384",
  "botId": "6628fddb8c9b707741f7b551",
  "userId": "255317220014445068",
  "content": "hello",
  "role": "user",
  "model": "azure-gpt-4o",
  "messageType": "user-question",
  "status": "activate"
}
```

</details>

<details>

<summary>Ereignis: message_start</summary>

Ereignis: `message_start` - Die Antwortnachricht wird gleich gesendet

Typescript-Interface

```typescript
interface MessageStartEvent {
  role: string; // Die Rolle der Antwortnachricht, z. B. assistant
  gid: string; // Die ID der Antwortnachricht
}
```

Beispieldaten:

```json
{
  "role": "assistant",
  "gid": "678097bc45b174911deeeb45"
}
```

</details>

<details>

<summary>Ereignis: new_token</summary>

Ereignis: `new_token` - Ein neues Token wird gesendet

Typescript-Interface

```typescript
interface NewTokenEvent {
  role: string;
  token: string; // Das neue Token, das angehängt werden soll
  gid: string; // Die gid der Antwortnachricht
}
```

Beispieldaten:

```json
{
  "role": "assistant",
  "token": "Hello",
  "gid": "678097bc45b174911deeeb45"
}
```

</details>

<details>

<summary>Ereignis: message_end</summary>

Ereignis: `message_end` - Die Antwortnachricht ist vollständig

Typescript-Interface

```typescript
interface MessageEndEvent {
  role: string;
  gid: string;
}
```

Beispieldaten:

```json
{
  "role": "assistant",
  "gid": "678097bc45b174911deeeb45"
}
```

</details>

<details>

<summary>Ereignis: message_ready</summary>

Ereignis: `message_ready` - Die Antwortnachricht wurde erfolgreich gespeichert und kann für weitere Verarbeitung verwendet werden (kopieren, löschen, Text-zu-Sprache generieren, ... )

Typescript-Interface

```typescript
interface MessageReadyEvent {
  messageIds: string[]; // Liste neuer Nachrichten, die erfolgreich gespeichert wurden
}
```

Beispieldaten:

```json
{
  "messageIds": ["678097bc45b174911deeeb45"]
}
```

</details>


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://api.docs.blockbrain.ai/de/konzepte/streaming.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
