~/tools / Ein lokales LLM auf dem eigenen Server / Ollama Stream Reader

Ollama Stream Reader — Gestreamte Ollama-Antwort zusammensetzen, mit Tempo und Stoppgrund

Fügen Sie eine gestreamte Antwort von Ollama ein, von /api/chat, /api/generate oder dem OpenAI-kompatiblen /v1/chat/completions, und das Tool setzt die Teile wieder zum vollständigen Text, zum Thinking und zu den Tool Calls zusammen. Es zeigt, warum das Modell angehalten hat, wie schnell es generiert und den Prompt verarbeitet hat und ob der Stream abgebrochen wurde, und liefert Ihnen die Assistant-Nachricht für die nächste Anfrage. Nichts verlässt Ihren Browser.

So speichern Sie einen Stream mit curl

-N schaltet das Puffern von curl aus, und > stream.txt speichert den Stream in einer Datei. Ersetzen Sie das Modell und die Nachricht durch Ihre eigenen.

curl -sN http://localhost:11434/api/chat -d '{"model":"qwen2.5:7b","messages":[{"role":"user","content":"Hello"}]}' > stream.txt

curl -sN http://localhost:11434/v1/chat/completions -H "Content-Type: application/json" -d '{"model":"qwen2.5:7b","stream":true,"stream_options":{"include_usage":true},"messages":[{"role":"user","content":"Hello"}]}' > stream.txt

Gelesen als ein /api/chat-Stream (ein JSON-Objekt pro Zeile).

Zusammenfassung

Modell
qwen2.5:7b
Stoppgrund
stop
Chunks
7
Generierte Tokens
7
Generierungsgeschwindigkeit
10.4 Tokens/s
Prompt-Tokens
35
Prompt-Geschwindigkeit (Tokens, die nicht im Cache waren)
64.1 Tokens/s
Ladezeit des Modells
4.923 s
Gesamtzeit
6.310 s
Vom ersten bis zum letzten Chunk
0.675 s

Text

Hello, nice to meet.

Assistant-Nachricht für die nächste Anfrage

Fügen Sie sie zu messages hinzu, gefolgt von den Ergebnissen der Tool Calls, falls es welche gibt.

{
  "role": "assistant",
  "content": "Hello, nice to meet."
}

eval_count zählt auch die Tokens von Tool Calls, die nicht als Text gestreamt werden. In unserem Test kam ein Tool Call in einem einzigen Chunk mit eval_count 20.

Die Dokumentation von Ollama sagt, dass prompt_eval_duration nur die Prompt-Tokens umfasst, die nicht im Cache waren. Die Prompt-Geschwindigkeit hier teilt nur diese Tokens. Alle Dauern sind in Nanosekunden; in der OpenAI-Form sind timings in ganzen Millisekunden angegeben.

In der OpenAI-kompatiblen Form werden Token-Zahlen nur mit stream_options.include_usage gesendet, in einem zusätzlichen Chunk vor data: [DONE]. Wird der Stream abgebrochen, kommt dieser Chunk nicht an.

Formate nach der Streaming- und Usage-Dokumentation von Ollama und seinem Quellcode (v0.40.15), geprüft an echten Streams von Ollama 0.40.11 am 2026-11-07. Ollama: Streaming

Alles geschieht in Ihrem Browser. Das Tool verbindet sich mit nichts.

Ollama streamt seine Antworten standardmäßig. /api/chat und /api/generate senden ein JSON-Objekt pro Zeile (newline-delimited JSON): Jede Zeile enthält ein paar Zeichen der Antwort, und die letzte Zeile hat done auf true gesetzt und enthält die Token-Zahlen und die Dauern in Nanosekunden. Das OpenAI-kompatible /v1/chat/completions streamt nur, wenn stream auf true steht. Es sendet dann server-sent events: Zeilen, die mit data: beginnen, einen eigenen Chunk mit einem leeren delta und dem finish_reason und am Ende data: [DONE]. Token-Zahlen kommen nur, wenn die Anfrage stream_options.include_usage setzt, in einem zusätzlichen Chunk mit einer leeren choices-Liste, und Ollama fügt ihm ein timings-Objekt hinzu. Dieses Tool liest alle drei Formen, auch die Ausgabe von curl -i mit den HTTP-Headern, setzt content, thinking (reasoning in der OpenAI-Form) und Tool Calls zusammen und listet auf, was nicht stimmt: Ein Stream ohne done-Zeile oder ohne [DONE] wurde abgebrochen; eine Zeile {"error": …} bedeutet, dass Ollama mit einem Fehler angehalten hat, nachdem es schon mit dem Senden begonnen hatte; done_reason length bedeutet, dass num_predict oder max_tokens erreicht wurde. Die Generierungsgeschwindigkeit ist eval_count geteilt durch eval_duration. Für den Prompt sagt die Dokumentation von Ollama, dass prompt_eval_duration nur die Prompt-Tokens umfasst, die nicht im Cache waren, daher teilt das Tool nur diese Tokens durch den Wert. In der OpenAI-Form teilt timings.prompt_per_second von Ollama selbst alle Prompt-Tokens, auch die aus dem Cache, durch diese Zeit. In unserem Test meldete es 360.8 Tokens pro Sekunde für einen Prompt, bei dem 34 von 35 Tokens aus dem Cache kamen und das eine übrige Token 97 ms brauchte. Tool Calls in der OpenAI-Form können in Teilen ankommen, die sich einen index teilen, daher setzt das Tool die Argumente nach index zusammen; Ollama selbst sendet jeden Tool Call vollständig in einem Chunk. Wir haben das Tool an echten Streams von Ollama 0.40.11 mit qwen2.5:7b geprüft und die Formate an der Dokumentation und am Quellcode von Ollama.

Die Kernlogik dieses Tools ist Open Source unter der MIT-Lizenz. github.com/seigo5555/toolkitbox-lib/src/ollama-stream.ts

Anwendungsfälle

  • Die ganze Antwort einer gestreamten Anfrage sehen, die Sie mit curl gestellt haben, statt sie Stück für Stück Zeile für Zeile zu lesen
  • Herausfinden, ob ein Stream abgebrochen wurde, an der Längengrenze endete oder mit einem Fehler aufhörte
  • Die Generierungs- und Prompt-Geschwindigkeit eines Modells auf Ihrem Rechner oder Server messen

Verwendung

  1. Führen Sie Ihre Anfrage mit curl -sN aus und speichern Sie die Ausgabe in einer Datei, oder kopieren Sie, was Ihr Programm empfangen hat.
  2. Fügen Sie den ganzen Stream ein. Das Tool erkennt, ob er von /api/chat, /api/generate oder /v1/chat/completions stammt.
  3. Lesen Sie die Probleme und die Zahlen und kopieren Sie den Text oder die Assistant-Nachricht für die nächste Anfrage.

FAQ

Warum gibt es keine Token-Zahlen für meinen /v1/chat/completions-Stream?

In der OpenAI-kompatiblen Form werden die Zahlen nur gesendet, wenn die Anfrage stream_options auf {"include_usage": true} setzt. Sie kommen dann in einem zusätzlichen Chunk mit einer leeren choices-Liste, kurz vor data: [DONE]. /api/chat und /api/generate setzen sie immer in die letzte Zeile.

Warum unterscheidet sich die Prompt-Geschwindigkeit so stark von timings.prompt_per_second?

Die Dokumentation von Ollama sagt, dass prompt_eval_duration nur die Prompt-Tokens umfasst, die nicht im Cache waren. timings.prompt_per_second von Ollama teilt alle Prompt-Tokens, auch die aus dem Cache, durch diese Zeit und wirkt daher viel schneller, wenn der Cache genutzt wurde. Das Tool teilt nur die Tokens, die nicht im Cache waren.

Das Modell hat ein Tool aufgerufen, aber eval_count ist 20. Wo sind diese Tokens?

Der Text eines Tool Calls wird nicht als content gestreamt; Ollama macht daraus tool_calls und sendet sie in einem Chunk. Die Tokens werden trotzdem generiert und gezählt. In unserem Test kam ein Tool Call mit einem Argument in einem einzigen Chunk mit eval_count 20.

Warum meldet /api/chat stop, wenn das Modell ein Tool aufgerufen hat?

/api/chat lässt done_reason auf stop. Der OpenAI-kompatible Endpunkt ändert stop in finish_reason zu tool_calls, wenn ein Tool Call gesendet wurde.

Was soll ich mit der Assistant-Nachricht tun?

Die Dokumentation von Ollama weist darauf hin, dass Sie die gestreamten Teile zusammensetzen müssen, um den Gesprächsverlauf zu behalten, was vor allem bei Tool Calls wichtig ist. Fügen Sie die Nachricht zu messages hinzu, fügen Sie das Ergebnis jedes Tool Calls als Nachricht mit der Rolle tool hinzu und senden Sie die nächste Anfrage.

Werden meine Daten irgendwohin gesendet?

Nein. Der Stream wird in Ihrem Browser gelesen. Die curl-Befehle sind nur Text, den Sie selbst ausführen.

Passende Artikel

Ähnliche Tools