~/tools / Lokalny LLM na własnym serwerze / Ollama Stream Reader
Ollama Stream Reader — Złóż strumień odpowiedzi Ollamy i zobacz szybkość oraz powód zatrzymania
Wklej strumieniową odpowiedź z Ollamy, z /api/chat, /api/generate lub zgodnego z OpenAI /v1/chat/completions, a narzędzie złoży kawałki z powrotem w pełny tekst, thinking i wywołania narzędzi. Pokaże, dlaczego model się zatrzymał, jak szybko generował i przetwarzał prompt oraz czy strumień został przerwany, i poda wiadomość asystenta do następnego żądania. Nic nie opuszcza Twojej przeglądarki.
Jak zapisać strumień przez curl
-N wyłącza buforowanie curl, a > stream.txt zapisuje strumień do pliku. Zastąp model i wiadomość własnymi.
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.txtOdczytano jako strumień /api/chat (jeden obiekt JSON w wierszu).
Podsumowanie
- Model
- qwen2.5:7b
- Powód zatrzymania
- stop
- Fragmenty
- 7
- Wygenerowane tokeny
- 7
- Szybkość generowania
- 10.4 tokenów/s
- Tokeny promptu
- 35
- Szybkość promptu (tokeny spoza pamięci podręcznej)
- 64.1 tokenów/s
- Czas ładowania modelu
- 4.923 s
- Czas całkowity
- 6.310 s
- Od pierwszego do ostatniego fragmentu
- 0.675 s
Tekst
Hello, nice to meet.
Wiadomość asystenta do następnego żądania
Dodaj ją do messages, a po niej wyniki wywołań narzędzi, jeśli były.
{
"role": "assistant",
"content": "Hello, nice to meet."
}eval_count liczy także tokeny wywołań narzędzi, które nie są przesyłane jako tekst. W naszym teście jedno wywołanie narzędzia przyszło w jednym fragmencie z eval_count 20.
Dokumentacja Ollamy mówi, że prompt_eval_duration obejmuje tylko tokeny promptu, których nie było w pamięci podręcznej. Szybkość promptu tutaj dzieli tylko te tokeny. Wszystkie czasy są w nanosekundach; w postaci OpenAI timings są w pełnych milisekundach.
W postaci zgodnej z OpenAI liczby tokenów są wysyłane tylko z stream_options.include_usage, w dodatkowym fragmencie przed data: [DONE]. Jeśli strumień zostanie przerwany, ten fragment nie dociera.
Formaty według dokumentacji strumieniowania i usage Ollamy oraz jej kodu źródłowego (v0.40.15), sprawdzone na prawdziwych strumieniach z Ollamy 0.40.11 dnia 2026-11-07. Ollama: Streaming
Wszystko dzieje się w Twojej przeglądarce. Narzędzie z niczym się nie łączy.
Ollama domyślnie przesyła odpowiedzi strumieniowo. /api/chat i /api/generate wysyłają jeden obiekt JSON w wierszu (newline-delimited JSON): każdy wiersz zawiera kilka znaków odpowiedzi, a ostatni wiersz ma done ustawione na true i niesie liczby tokenów oraz czasy w nanosekundach. Zgodny z OpenAI /v1/chat/completions przesyła strumieniowo tylko wtedy, gdy stream ma wartość true. Wysyła wtedy server-sent events: wiersze zaczynające się od data:, osobny fragment z pustym delta i finish_reason oraz na końcu data: [DONE]. Liczby tokenów pojawiają się tylko wtedy, gdy żądanie ustawia stream_options.include_usage, w dodatkowym fragmencie z pustą listą choices, a Ollama dodaje do niego obiekt timings. To narzędzie czyta wszystkie trzy postaci, także wynik curl -i z nagłówkami HTTP, łączy content, thinking (reasoning w postaci OpenAI) i wywołania narzędzi oraz wymienia, co jest nie tak: strumień bez wiersza done lub bez [DONE] został przerwany; wiersz {"error": …} oznacza, że Ollama zatrzymała się z błędem po tym, jak zaczęła już wysyłać; done_reason length oznacza, że osiągnięto num_predict lub max_tokens. Szybkość generowania to eval_count podzielone przez eval_duration. W przypadku promptu dokumentacja Ollamy mówi, że prompt_eval_duration obejmuje tylko tokeny promptu, których nie było w pamięci podręcznej, dlatego narzędzie dzieli przez ten czas tylko te tokeny. W postaci OpenAI własne timings.prompt_per_second Ollamy dzieli przez ten czas wszystkie tokeny promptu, także te z pamięci podręcznej. W naszym teście podało 360.8 tokenów na sekundę dla promptu, w którym 34 z 35 tokenów pochodziło z pamięci podręcznej, a jeden pozostały token zajął 97 ms. Wywołania narzędzi w postaci OpenAI mogą przychodzić we fragmentach o wspólnym index, więc narzędzie łączy argumenty według index; sama Ollama wysyła każde wywołanie narzędzia w całości, w jednym fragmencie. Sprawdziliśmy narzędzie na prawdziwych strumieniach z Ollamy 0.40.11 z qwen2.5:7b, a formaty na podstawie dokumentacji i kodu źródłowego Ollamy.
Główna logika tego narzędzia jest otwartoźródłowa, na licencji MIT. github.com/seigo5555/toolkitbox-lib/src/ollama-stream.ts
Zastosowania
- Zobaczyć całą odpowiedź strumieniowego żądania wykonanego przez curl, zamiast czytać ją kawałek po kawałku w kolejnych wierszach
- Dowiedzieć się, czy strumień został przerwany, zatrzymał się na limicie długości, czy zakończył się błędem
- Zmierzyć szybkość generowania i przetwarzania promptu modelu na swoim komputerze lub serwerze
Jak używać
- Wykonaj żądanie przez curl -sN i zapisz wynik do pliku albo skopiuj to, co odebrał Twój program.
- Wklej cały strumień. Narzędzie rozpozna, czy pochodzi z /api/chat, /api/generate czy /v1/chat/completions.
- Przeczytaj problemy i liczby, a następnie skopiuj tekst lub wiadomość asystenta do następnego żądania.
FAQ
Dlaczego nie ma liczby tokenów w moim strumieniu /v1/chat/completions?
W postaci zgodnej z OpenAI liczby są wysyłane tylko wtedy, gdy żądanie ustawia stream_options na {"include_usage": true}. Przychodzą wtedy w dodatkowym fragmencie z pustą listą choices, tuż przed data: [DONE]. /api/chat i /api/generate zawsze umieszczają je w ostatnim wierszu.
Dlaczego szybkość promptu tak bardzo różni się od timings.prompt_per_second?
Dokumentacja Ollamy mówi, że prompt_eval_duration obejmuje tylko tokeny promptu, których nie było w pamięci podręcznej. timings.prompt_per_second z Ollamy dzieli przez ten czas wszystkie tokeny promptu, także te z pamięci podręcznej, więc wygląda na dużo szybsze, gdy pamięć podręczna była użyta. Narzędzie dzieli tylko tokeny, których nie było w pamięci podręcznej.
Model wywołał narzędzie, ale eval_count wynosi 20. Gdzie są te tokeny?
Tekst wywołania narzędzia nie jest przesyłany jako content; Ollama zamienia go na tool_calls i wysyła w jednym fragmencie. Tokeny są mimo to generowane i liczone. W naszym teście jedno wywołanie narzędzia z jednym argumentem przyszło w jednym fragmencie z eval_count 20.
Dlaczego /api/chat podaje stop, gdy model wywołał narzędzie?
/api/chat zostawia done_reason jako stop. Punkt końcowy zgodny z OpenAI zmienia stop na tool_calls w finish_reason, gdy zostało wysłane wywołanie narzędzia.
Co zrobić z wiadomością asystenta?
Dokumentacja Ollamy zauważa, że trzeba złożyć przesyłane strumieniowo kawałki, aby zachować historię rozmowy, co jest najważniejsze przy wywołaniach narzędzi. Dodaj wiadomość do messages, dodaj wynik każdego wywołania narzędzia jako wiadomość z rolą tool i wyślij następne żądanie.
Czy moje dane są dokądś wysyłane?
Nie. Strumień jest czytany w Twojej przeglądarce. Polecenia curl to tylko tekst do samodzielnego uruchomienia.
Powiązane artykuły
- Pamięć Ollamy na małym VPS-ie: jak ją obserwowaćZobacz, co Ollama trzyma w pamięci, jak długo i które ustawienia to zmieniają: ollama ps, keep_alive i limity, według oficjalnego FAQ.
- Połącz Dify z Ollamą na własnym VPSUruchom Dify na własnym VPS i użyj Ollamy jako jego modelu: instalacja, pola wtyczki, problem z adresem w Dockerze i embeddingi, na podstawie oficjalnej dokumentacji.
- Lokalny LLM bez drogiego komputera: poradnik dla początkujących, jak użyć VPSNie masz mocnego komputera? Wynajmij VPS i uruchom mały lokalny LLM z poziomu przeglądarki: sześć kroków od oszacowania pamięci po chroniony ekran czatu, z uczciwie opisanymi ograniczeniami.