~/tools / Menjalankan LLM lokal di server Anda / Ollama Stream Reader

Ollama Stream Reader — Satukan stream Ollama dan lihat kecepatan serta alasan berhenti

Tempel respons streaming dari Ollama, dari /api/chat, /api/generate atau /v1/chat/completions yang kompatibel dengan OpenAI, dan alat ini menyatukan kembali potongan-potongannya menjadi teks lengkap, thinking, dan tool calls. Alat ini menunjukkan mengapa model berhenti, seberapa cepat model menghasilkan teks dan memproses prompt, serta apakah stream terputus, dan memberi Anda pesan assistant untuk ditambahkan ke permintaan berikutnya. Tidak ada yang keluar dari browser Anda.

Cara menyimpan stream dengan curl

-N mematikan buffering curl, dan > stream.txt menyimpan stream ke file. Ganti model dan pesannya dengan milik Anda.

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

Dibaca sebagai stream /api/chat (satu objek JSON per baris).

Ringkasan

Model
qwen2.5:7b
Alasan berhenti
stop
Chunk
7
Token yang dihasilkan
7
Kecepatan generasi
10.4 token/detik
Token prompt
35
Kecepatan prompt (token yang tidak ada di cache)
64.1 token/detik
Waktu pemuatan model
4.923 detik
Total waktu
6.310 detik
Dari chunk pertama sampai terakhir
0.675 detik

Teks

Hello, nice to meet.

Pesan assistant untuk permintaan berikutnya

Tambahkan ini ke messages, diikuti hasil tool calls, jika ada.

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

eval_count juga menghitung token tool calls, yang tidak di-stream sebagai teks. Dalam uji kami, satu tool call datang dalam satu chunk dengan eval_count 20.

Dokumentasi Ollama menyatakan bahwa prompt_eval_duration hanya mencakup token prompt yang tidak ada di cache. Kecepatan prompt di sini hanya membagi token tersebut. Semua durasi dalam nanodetik; pada bentuk OpenAI, timings dalam milidetik bulat.

Pada bentuk yang kompatibel dengan OpenAI, jumlah token hanya dikirim bersama stream_options.include_usage, dalam chunk tambahan sebelum data: [DONE]. Jika stream terputus, chunk itu tidak tiba.

Format berasal dari dokumentasi streaming dan usage Ollama serta kode sumbernya (v0.40.15), diperiksa dengan stream nyata dari Ollama 0.40.11 pada 2026-11-07. Ollama: Streaming

Semuanya dilakukan di browser Anda. Alat ini tidak terhubung ke mana pun.

Ollama men-stream jawabannya secara default. /api/chat dan /api/generate mengirim satu objek JSON per baris (newline-delimited JSON): setiap baris membawa beberapa karakter jawaban, dan baris terakhir memiliki done yang diatur ke true serta membawa jumlah token dan durasi, dalam nanodetik. /v1/chat/completions yang kompatibel dengan OpenAI hanya melakukan streaming jika stream bernilai true. Saat itu ia mengirim server-sent events: baris yang diawali data:, chunk terpisah dengan delta kosong dan finish_reason, serta data: [DONE] di akhir. Jumlah token hanya ada jika permintaan mengatur stream_options.include_usage, dalam chunk tambahan dengan daftar choices kosong, dan Ollama menambahkan objek timings ke dalamnya. Alat ini membaca ketiga bentuk tersebut, termasuk keluaran curl -i beserta header HTTP-nya, menyatukan content, thinking (reasoning pada bentuk OpenAI) dan tool calls, serta mendaftar apa yang salah: stream tanpa baris done atau tanpa [DONE] terputus; baris {"error": …} berarti Ollama berhenti dengan error setelah mulai mengirim; done_reason length berarti num_predict atau max_tokens tercapai. Kecepatan generasi adalah eval_count dibagi eval_duration. Untuk prompt, dokumentasi Ollama menyatakan bahwa prompt_eval_duration hanya mencakup token prompt yang tidak ada di cache, sehingga alat ini hanya membagi token tersebut dengan durasi itu. Pada bentuk OpenAI, timings.prompt_per_second milik Ollama sendiri membagi semua token prompt, termasuk yang berasal dari cache, dengan durasi tersebut. Dalam uji kami, nilainya dilaporkan 360.8 token per detik untuk prompt yang 34 dari 35 tokennya berasal dari cache dan satu token sisanya memakan 97 ms. Tool calls pada bentuk OpenAI dapat tiba dalam potongan yang berbagi index yang sama, sehingga alat ini menyatukan arguments berdasarkan index; Ollama sendiri mengirim setiap tool call utuh, dalam satu chunk. Kami memeriksa alat ini dengan stream nyata dari Ollama 0.40.11 dengan qwen2.5:7b, dan format-formatnya dengan dokumentasi serta kode sumber Ollama.

Logika utama alat ini bersifat sumber terbuka dengan lisensi MIT. github.com/seigo5555/toolkitbox-lib/src/ollama-stream.ts

Kapan dipakai

  • Melihat seluruh jawaban dari permintaan streaming yang Anda kirim dengan curl, alih-alih membacanya satu potongan per baris
  • Mencari tahu apakah sebuah stream terputus, berhenti di batas length, atau berakhir dengan error
  • Mengukur kecepatan generasi dan kecepatan prompt sebuah model di mesin atau server Anda

Cara pakai

  1. Jalankan permintaan Anda dengan curl -sN dan simpan keluarannya ke file, atau salin apa yang diterima program Anda.
  2. Tempel seluruh stream. Alat ini mendeteksi apakah berasal dari /api/chat, /api/generate atau /v1/chat/completions.
  3. Baca masalah dan angkanya, lalu salin teks atau pesan assistant untuk permintaan berikutnya.

Tanya jawab

Mengapa stream /v1/chat/completions saya tidak memiliki jumlah token?

Pada bentuk yang kompatibel dengan OpenAI, jumlahnya hanya dikirim jika permintaan mengatur stream_options ke {"include_usage": true}. Jumlah itu datang dalam chunk tambahan dengan daftar choices kosong, tepat sebelum data: [DONE]. /api/chat dan /api/generate selalu menaruhnya di baris terakhir.

Mengapa kecepatan prompt sangat berbeda dari timings.prompt_per_second?

Dokumentasi Ollama menyatakan bahwa prompt_eval_duration hanya mencakup token prompt yang tidak ada di cache. timings.prompt_per_second milik Ollama membagi semua token prompt, termasuk yang berasal dari cache, dengan durasi tersebut, sehingga terlihat jauh lebih cepat saat cache dipakai. Alat ini hanya membagi token yang tidak ada di cache.

Model memanggil sebuah tool tetapi eval_count-nya 20. Di mana token-token itu?

Teks sebuah tool call tidak di-stream sebagai content; Ollama mengubahnya menjadi tool_calls dan mengirimnya dalam satu chunk. Token-tokennya tetap dihasilkan dan dihitung. Dalam uji kami, satu tool call dengan satu argumen datang dalam satu chunk dengan eval_count 20.

Mengapa /api/chat menyebut stop padahal model memanggil sebuah tool?

/api/chat mempertahankan done_reason sebagai stop. Endpoint yang kompatibel dengan OpenAI mengubah stop menjadi tool_calls pada finish_reason ketika sebuah tool call dikirim.

Apa yang harus saya lakukan dengan pesan assistant?

Dokumentasi Ollama mencatat bahwa Anda perlu menyatukan potongan-potongan yang di-stream untuk menjaga riwayat percakapan, yang paling penting untuk tool calls. Tambahkan pesan itu ke messages, tambahkan hasil setiap tool call sebagai pesan dengan role tool, lalu kirim permintaan berikutnya.

Apakah data saya dikirim ke suatu tempat?

Tidak. Stream dibaca di browser Anda. Perintah curl hanyalah teks untuk Anda jalankan.

Artikel terkait

Terkait