~/tools / Yerel LLM'i kendi sunucunuzda çalıştırın / Ollama Stream Reader

Ollama Stream Reader — Akış halindeki Ollama yanıtını birleştirin, hızı ve durma nedenini görün

Ollama'dan gelen akış halindeki bir yanıtı, /api/chat, /api/generate ya da OpenAI uyumlu /v1/chat/completions çıktısını yapıştırın; araç parçaları yeniden tam metne, thinking'e ve araç çağrılarına birleştirir. Modelin neden durduğunu, ne kadar hızlı ürettiğini ve prompt'u ne kadar hızlı işlediğini, akışın kesilip kesilmediğini gösterir ve bir sonraki isteğe eklenecek assistant mesajını verir. Hiçbir veri tarayıcınızdan çıkmaz.

Bir akış curl ile nasıl kaydedilir

-N curl'ün arabelleğe almasını kapatır, > stream.txt ise akışı bir dosyaya kaydeder. Modeli ve mesajı kendinizinkilerle değiştirin.

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

bir /api/chat akışı (satır başına bir JSON nesnesi) olarak okundu.

Özet

Model
qwen2.5:7b
Durma nedeni
stop
Parçalar
7
Üretilen token'lar
7
Üretim hızı
10.4 token/sn
Prompt token'ları
35
Prompt hızı (önbellekte olmayan token'lar)
64.1 token/sn
Model yükleme süresi
4.923 sn
Toplam süre
6.310 sn
İlk parçadan sonuncuya
0.675 sn

Metin

Hello, nice to meet.

Sonraki istek için assistant mesajı

Bunu messages'a ekleyin, varsa ardından araç çağrılarının sonuçlarını ekleyin.

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

eval_count, metin olarak akıtılmayan araç çağrılarının token'larını da sayar. Testimizde bir araç çağrısı, eval_count 20 ile tek bir parçada geldi.

Ollama'nın belgeleri prompt_eval_duration değerinin yalnızca önbellekte olmayan prompt token'larını kapsadığını söyler. Buradaki prompt hızı yalnızca o token'ları böler. Tüm süreler nanosaniye cinsindendir; OpenAI biçiminde timings tam milisaniye cinsindendir.

OpenAI uyumlu biçimde token sayıları yalnızca stream_options.include_usage ile, data: [DONE]'dan önceki ek bir parçada gönderilir. Akış kesilirse bu parça gelmez.

Biçimler Ollama'nın akış ve usage belgelerinden ve kaynak kodundan (v0.40.15) alındı, 2026-11-07 tarihinde Ollama 0.40.11'in gerçek akışlarıyla denetlendi. Ollama: Streaming

Her şey tarayıcınızda yapılır. Araç hiçbir yere bağlanmaz.

Ollama yanıtlarını varsayılan olarak akış halinde gönderir. /api/chat ve /api/generate satır başına bir JSON nesnesi gönderir (newline-delimited JSON): her satır yanıtın birkaç karakterini taşır, son satırda done true olur ve token sayıları ile nanosaniye cinsinden süreler bulunur. OpenAI uyumlu /v1/chat/completions yalnızca stream true olduğunda akış yapar. O zaman server-sent events gönderir: data: ile başlayan satırlar, boş bir delta ve finish_reason içeren ayrı bir parça ve sonda data: [DONE]. Token sayıları yalnızca istek stream_options.include_usage ayarını yaparsa, boş bir choices listesi olan ek bir parçada gelir ve Ollama ona bir timings nesnesi ekler. Bu araç üç biçimi de okur, HTTP başlıklarıyla birlikte curl -i çıktısını da, content, thinking (OpenAI biçiminde reasoning) ve araç çağrılarını birleştirir ve neyin yanlış olduğunu listeler: done satırı ya da [DONE] olmayan akış kesilmiştir; {"error": …} satırı, Ollama'nın göndermeye başladıktan sonra bir hatayla durduğu anlamına gelir; done_reason length, num_predict ya da max_tokens sınırına ulaşıldığı anlamına gelir. Üretim hızı eval_count değerinin eval_duration değerine bölünmesidir. Prompt için Ollama'nın belgeleri prompt_eval_duration değerinin yalnızca önbellekte olmayan prompt token'larını kapsadığını söyler, bu yüzden araç bu süreye yalnızca o token'ları böler. OpenAI biçiminde Ollama'nın kendi timings.prompt_per_second değeri, önbellekten gelenler dahil tüm prompt token'larını bu süreye böler. Testimizde, 35 token'ın 34'ünün önbellekten geldiği ve kalan tek token'ın 97 ms sürdüğü bir prompt için saniyede 360.8 token bildirdi. OpenAI biçimindeki araç çağrıları aynı index'i paylaşan parçalar halinde gelebilir, bu yüzden araç argümanları index'e göre birleştirir; Ollama'nın kendisi her araç çağrısını tek parçada, bütün olarak gönderir. Aracı qwen2.5:7b ile Ollama 0.40.11'in gerçek akışlarında, biçimleri ise Ollama'nın belgeleri ve kaynak koduyla karşılaştırarak denetledik.

Bu aracın temel mantığı MIT lisansıyla açık kaynaktır. github.com/seigo5555/toolkitbox-lib/src/ollama-stream.ts

Kullanım örnekleri

  • curl ile yaptığınız akışlı bir isteğin tüm yanıtını satır satır parça parça okumak yerine bir arada görmek
  • Bir akışın kesilip kesilmediğini, uzunluk sınırında mı durduğunu yoksa bir hatayla mı bittiğini öğrenmek
  • Bir modelin makinenizdeki ya da sunucunuzdaki üretim ve prompt hızını ölçmek

Nasıl kullanılır

  1. İsteğinizi curl -sN ile çalıştırıp çıktıyı bir dosyaya kaydedin ya da programınızın aldığını kopyalayın.
  2. Akışın tamamını yapıştırın. Araç, akışın /api/chat, /api/generate ya da /v1/chat/completions'tan gelip gelmediğini algılar.
  3. Sorunları ve sayıları okuyun, metni ya da sonraki istek için assistant mesajını kopyalayın.

SSS

/v1/chat/completions akışımda neden token sayıları yok?

OpenAI uyumlu biçimde sayılar yalnızca istek stream_options değerini {"include_usage": true} olarak ayarlarsa gönderilir. O zaman boş bir choices listesi olan ek bir parçada, data: [DONE]'dan hemen önce gelirler. /api/chat ve /api/generate bunları her zaman son satıra koyar.

Prompt hızı neden timings.prompt_per_second'dan bu kadar farklı?

Ollama'nın belgeleri prompt_eval_duration değerinin yalnızca önbellekte olmayan prompt token'larını kapsadığını söyler. Ollama'nın timings.prompt_per_second değeri, önbellekten gelenler dahil tüm prompt token'larını bu süreye böler, bu yüzden önbellek kullanıldığında çok daha hızlı görünür. Araç yalnızca önbellekte olmayan token'ları böler.

Model bir araç çağırdı ama eval_count 20. Bu token'lar nerede?

Bir araç çağrısının metni content olarak akıtılmaz; Ollama onu tool_calls'a çevirir ve tek parçada gönderir. Token'lar yine de üretilir ve sayılır. Testimizde bir argümanlı tek bir araç çağrısı, eval_count 20 ile tek bir parçada geldi.

Model bir araç çağırdığında /api/chat neden stop diyor?

/api/chat done_reason değerini stop olarak bırakır. OpenAI uyumlu uç nokta, bir araç çağrısı gönderildiğinde finish_reason içindeki stop değerini tool_calls olarak değiştirir.

Assistant mesajıyla ne yapmalıyım?

Ollama'nın belgeleri, konuşma geçmişini korumak için akıtılan parçaları birleştirmeniz gerektiğini belirtir; bu en çok araç çağrıları için önemlidir. Mesajı messages'a ekleyin, her araç çağrısının sonucunu tool rolüyle bir mesaj olarak ekleyin ve sonraki isteği gönderin.

Verilerim bir yere gönderiliyor mu?

Hayır. Akış tarayıcınızda okunur. curl komutları yalnızca sizin çalıştırmanız için metindir.

İlgili makaleler

İlgili