[Startseite](https://codefionn.eu/de/) · [Projekte](https://codefionn.eu/de/projects/) · [Über mich](https://codefionn.eu/de/about/) · [GitHub](https://github.com/codefionn)

---

# Das schlechte Design von LLM-APIs

> Was mir die Entwicklung eines LLM-Gateways über den Stand von KI beigebracht hat

*Veröffentlicht am 2026-10-04 · [View as HTML](https://codefionn.eu/das-schlechte-design-von-llm-apis/) · [Read in English](https://codefionn.eu/the-bad-design-of-llm-apis/)*

---


Ich entwickle zurzeit viele verschiedene KI-Anwendungen und habe dafür
[llmleaf](https://github.com/codefionn/llmleaf) gebaut, einen KI-Gateway-Proxy,
der alle möglichen LLM-API-Anbieter vereinheitlicht und mit zusätzlichen
Informationen anreichert.

Dabei hatte ich einige Probleme mit diesen Schnittstellen und manchmal auch mit
ihren Informationen. Dieser Artikel behandelt die Probleme, die die KI-Anbieter
irgendwie ignorieren.

## <abbr title="Server-sent events">SSE</abbr>

Wie würdest du ein bidirektionales Kommunikationsprotokoll umsetzen? Einzelne
Anfragen? Ein selbst erstelltes Binärprotokoll? Vielleicht WebSockets?

Die Antwort der Branche war natürlich
<abbr title="Server-sent events">SSE</abbr>. Das ist ein Webstandard, um Events
vom Server zum Client zu streamen, was gut ist. Entscheidend ist aber, dass es
nicht in die andere Richtung streamt, und das ist schlecht. Vielleicht war das
in den frühen ChatGPT-Tagen eine gute Entscheidung, aber die Zeit nach Opus 4.8
braucht etwas anderes.

Das führt zu zwei Problemen. Wenn der Client Nachrichten an den Server
zurückschicken muss, und im Zeitalter agentischer Entwicklung sind das viele
Tool-Call-Ergebnisse, muss ein komplett neuer Request an den Server gehen.
Verschlimmert wird das dadurch, dass Prompt-Caching aus Kostengründen Pflicht
ist und Thinking versteckt oder verschlüsselt wird.

Wenn der neue Request einen Tool-Call beantwortet, muss die API die letzte
Server-Antwort aus dem Kontext ableiten, vermutlich über Hashing. Sobald sie
gefunden ist, funktioniert das Caching richtig und der Nutzer zahlt hoffentlich
weniger für Tokens, die schon verarbeitet wurden. Der Entwickler muss dafür
sorgen, dass die gesendeten Nachrichten als dieselben erkannt werden, die schon
vorher gesendet wurden.

Es gibt sogar spezielle API-Funktionen, die versuchen, das zu umgehen, z. B.
`cache_control` von Anthropic oder `previous_response_id` von OpenAI.

Dieses ständige Neuverbinden kostet Latenz, die eine vernünftige Umsetzung nicht
hätte. Wer das selbst erleben will, nutzt einfach Codex mit dem
OpenAI-Abonnement. Das verwendet bereits WebSockets.

<div class="images images-column">
    <figure class="image">
        <img src="/static/img/llm-api-sse-turns-de.svg" alt="Der Agent schickt den ganzen Verlauf an die LLM-API, bekommt einen SSE-Stream bis zum nächsten Tool-Call und schickt das Tool-Ergebnis als neuen Request, wieder mit dem ganzen Verlauf" width="674" height="220" />
        <figcaption>Mit SSE bedeutet jeder Tool-Call einen neuen Request mit dem ganzen Verlauf</figcaption>
    </figure>
    <figure class="image">
        <img src="/static/img/llm-api-websocket-turns-de.svg" alt="Der Agent hält einen WebSocket offen, Nachrichten fließen darüber in beide Richtungen und nur neue Tool-Ergebnisse werden geschickt, während die LLM-API den Zustand im Speicher hält" width="600" height="225" />
        <figcaption>Mit einem WebSocket bleibt die Verbindung offen und nur neuer Input wird geschickt</figcaption>
    </figure>
</div>

## <abbr title="Model Context Protocol">MCP</abbr>s

Die bisherigen <abbr title="Model Context Protocol">MCP</abbr>-Spezifikationen
waren so schlecht, dass die Spezifikation vom 2026-07-28 sie reparieren musste.
Zur Info: Die bisherigen Spezifikationen haben zustandsbehaftete Verbindungen
verlangt. Das hat Dinge wie den Zugriff der Agenten deiner Kunden auf deine
Dokumentation über MCP viel schwieriger und ressourcenhungriger gemacht als
nötig. Die Spezifikation vom 2026-07-28 macht MCP endlich zustandslos.

Ein weiteres Problem war, dass mit den bisherigen Spezifikationen jede
Agenten-Session ihre eigenen MCP-Verbindungen aufbauen musste. Mit einigen
größeren MCP-Servern wurden dadurch schon drei oder mehr Agenten sehr teuer.

## Der List-Endpunkt

KI-Anbieter haben Endpunkte, die die unterstützten Modelle auflisten. Das
Problem: Sie liefern oft nicht die nötigen Informationen. Im schlimmsten Fall
bekommst du nur Modell-IDs, Namen und Veröffentlichungsdaten.

<div class="images">
    <figure class="image">
        <img src="/static/img/llm-api-model-list.svg" alt="curl-Request an den Modell-Endpunkt von OpenAI für gpt-6-astra, der nur id, object, created, owned_by und shutdown_date zurückgibt" width="520" height="306" />
        <figcaption>Die Modellliste von OpenAI: kein Kontextfenster, keine Preise, keine Fähigkeiten</figcaption>
    </figure>
</div>

Für eine KI-Anwendung braucht man aber viel mehr Informationen: Länge des
Kontextfensters, maximale Output-Tokens, Preise, unterstützte Parameter und
Fähigkeiten wie Thinking, Input- und Output-Modalitäten (z. B. ob das Modell
Bilder annehmen kann) und automatische Kontextkomprimierung (Zusammenfassung).

Deshalb sind Anbieter wie OpenRouter eine einfache Lösung für Anwendungen, die
"jeden" Anbieter unterstützen, denn sie liefern die wesentlichen Informationen.

## Die Zukunft

Ich hoffe, dass mehr Anbieter erkennen, wie gut WebSockets für agentische
Workflows sind, und sie stärker unterstützen. MCP wurde mit der Spezifikation
vom 2026-07-28 repariert, aber es wird wohl Jahre dauern, bis die alten
MCP-Programme verschwinden. List-Endpunkte werden wahrscheinlich wegen
Lock-in-Effekten nicht repariert, weil man seine Software auf einen bestimmten
Anbieter optimieren muss.

Die Anbieter haben wenig Gründe, einige dieser Probleme zu beheben. Deshalb
müssen Gateway-Proxys wie [llmleaf](https://github.com/codefionn/llmleaf) oder
[Portkey AI Gateway](https://github.com/Portkey-AI/gateway) die Lücken füllen.

## Weiterführende Links

- [Server-sent events verwenden](https://developer.mozilla.org/de/docs/Web/API/Server-sent_events/Using_server-sent_events)
- [Speeding up agentic workflows with WebSockets in the Responses API](https://openai.com/index/speeding-up-agentic-workflows-with-websockets/) (Englisch)
- [OpenAI WebSocket mode](https://developers.openai.com/api/docs/guides/websocket-mode) (Englisch)
- [Die MCP-Spezifikation vom 2026-07-28](https://blog.modelcontextprotocol.io/posts/2026-07-28/) (Englisch)

---

[Impressum](https://codefionn.eu/impressum/) · [Datenschutzerklärung](https://codefionn.eu/datenschutz/) · [Mastodon](https://c.im/@codefionn)

© Copyright 2022-2026 Fionn Langhans
