~/tools / Eseguire un LLM locale sul tuo server / Ollama Stream Reader

Ollama Stream Reader — Ricomponi uno stream di Ollama e vedi velocità e motivo dell'arresto

Incolla una risposta in streaming di Ollama, da /api/chat, /api/generate o dal /v1/chat/completions compatibile con OpenAI, e lo strumento ricompone i pezzi nel testo completo, nel thinking e nelle chiamate agli strumenti. Mostra perché il modello si è fermato, con quale velocità ha generato e ha elaborato il prompt, e se lo stream è stato interrotto, e ti dà il messaggio dell'assistente da aggiungere alla richiesta successiva. Nulla lascia il tuo browser.

Come salvare uno stream con curl

-N disattiva il buffering di curl, e > stream.txt salva lo stream in un file. Sostituisci il modello e il messaggio con i tuoi.

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

Letto come uno stream /api/chat (un oggetto JSON per riga).

Riepilogo

Modello
qwen2.5:7b
Motivo dell'arresto
stop
Chunk
7
Token generati
7
Velocità di generazione
10.4 token/s
Token del prompt
35
Velocità del prompt (token non presenti nella cache)
64.1 token/s
Tempo di caricamento del modello
4.923 s
Tempo totale
6.310 s
Dal primo all'ultimo chunk
0.675 s

Testo

Hello, nice to meet.

Messaggio dell'assistente per la richiesta successiva

Aggiungilo a messages, seguito dai risultati delle chiamate agli strumenti, se ce ne sono.

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

eval_count conta anche i token delle chiamate agli strumenti, che non vengono inviati come testo. Nel nostro test, una chiamata a uno strumento è arrivata in un singolo chunk con eval_count 20.

La documentazione di Ollama dice che prompt_eval_duration copre solo i token del prompt che non erano nella cache. La velocità del prompt qui divide solo quei token. Tutte le durate sono in nanosecondi; nella forma OpenAI, i timings sono in millisecondi interi.

Nella forma compatibile con OpenAI, i conteggi dei token vengono inviati solo con stream_options.include_usage, in un chunk aggiuntivo prima di data: [DONE]. Se lo stream viene interrotto, quel chunk non arriva.

Formati dalla documentazione di Ollama su streaming e utilizzo e dal suo codice sorgente (v0.40.15), verificati con stream reali di Ollama 0.40.11 il 2026-11-07. Ollama: Streaming

Tutto avviene nel tuo browser. Lo strumento non si connette a nulla.

Ollama invia le sue risposte in streaming per impostazione predefinita. /api/chat e /api/generate inviano un oggetto JSON per riga (newline-delimited JSON): ogni riga porta pochi caratteri della risposta, e l'ultima riga ha done impostato a true e porta i conteggi dei token e le durate, in nanosecondi. Il /v1/chat/completions compatibile con OpenAI fa streaming solo quando stream è true. Allora invia server-sent events: righe che iniziano con data:, un chunk separato con un delta vuoto e il finish_reason, e data: [DONE] alla fine. I conteggi dei token arrivano solo se la richiesta imposta stream_options.include_usage, in un chunk aggiuntivo con una lista choices vuota, e Ollama vi aggiunge un oggetto timings. Questo strumento legge tutte e tre le forme, compreso l'output di curl -i con le sue intestazioni HTTP, unisce content, thinking (reasoning nella forma OpenAI) e le chiamate agli strumenti, ed elenca ciò che non va: uno stream senza riga done o senza [DONE] è stato interrotto; una riga {"error": …} significa che Ollama si è fermato con un errore dopo aver iniziato a inviare; done_reason length significa che è stato raggiunto num_predict o max_tokens. La velocità di generazione è eval_count diviso per eval_duration. Per il prompt, la documentazione di Ollama dice che prompt_eval_duration copre solo i token del prompt che non erano nella cache, quindi lo strumento divide per essa solo quei token. Nella forma OpenAI, il timings.prompt_per_second di Ollama divide per quel tempo tutti i token del prompt, compresi quelli della cache. Nel nostro test ha riportato 360.8 token al secondo per un prompt in cui 34 token su 35 venivano dalla cache e l'unico token rimanente ha impiegato 97 ms. Le chiamate agli strumenti nella forma OpenAI possono arrivare in pezzi che condividono un index, quindi lo strumento unisce gli argomenti per index; Ollama stesso invia ogni chiamata a uno strumento intera, in un solo chunk. Abbiamo verificato lo strumento con stream reali di Ollama 0.40.11 con qwen2.5:7b, e i formati con la documentazione e il codice sorgente di Ollama.

La logica principale di questo strumento è open source, con licenza MIT. github.com/seigo5555/toolkitbox-lib/src/ollama-stream.ts

Casi d'uso

  • Vedere l'intera risposta di una richiesta in streaming fatta con curl, invece di leggerla un pezzo per volta, uno per riga
  • Scoprire se uno stream è stato interrotto, si è fermato al limite di lunghezza o è terminato con un errore
  • Misurare la velocità di generazione e di elaborazione del prompt di un modello sulla tua macchina o sul tuo server

Utilizzo

  1. Esegui la tua richiesta con curl -sN e salva l'output in un file, oppure copia ciò che ha ricevuto il tuo programma.
  2. Incolla l'intero stream. Lo strumento rileva se proviene da /api/chat, /api/generate o /v1/chat/completions.
  3. Leggi i problemi e i numeri, e copia il testo o il messaggio dell'assistente per la richiesta successiva.

FAQ

Perché non ci sono conteggi dei token nel mio stream di /v1/chat/completions?

Nella forma compatibile con OpenAI, i conteggi vengono inviati solo quando la richiesta imposta stream_options a {"include_usage": true}. Arrivano poi in un chunk aggiuntivo con una lista choices vuota, subito prima di data: [DONE]. /api/chat e /api/generate li mettono sempre sull'ultima riga.

Perché la velocità del prompt è così diversa da timings.prompt_per_second?

La documentazione di Ollama dice che prompt_eval_duration copre solo i token del prompt che non erano nella cache. Il timings.prompt_per_second di Ollama divide per quel tempo tutti i token del prompt, compresi quelli della cache, quindi sembra molto più veloce quando è stata usata la cache. Lo strumento divide solo i token che non erano nella cache.

Il modello ha chiamato uno strumento ma eval_count è 20. Dove sono quei token?

Il testo di una chiamata a uno strumento non viene inviato come content; Ollama lo trasforma in tool_calls e lo invia in un solo chunk. I token vengono comunque generati e contati. Nel nostro test, una chiamata a uno strumento con un argomento è arrivata in un singolo chunk con eval_count 20.

Perché /api/chat dice stop quando il modello ha chiamato uno strumento?

/api/chat mantiene done_reason a stop. L'endpoint compatibile con OpenAI cambia stop in tool_calls in finish_reason quando è stata inviata una chiamata a uno strumento.

Che cosa devo fare con il messaggio dell'assistente?

La documentazione di Ollama osserva che bisogna unire i pezzi dello stream per conservare la cronologia della conversazione, il che conta soprattutto per le chiamate agli strumenti. Aggiungi il messaggio a messages, aggiungi il risultato di ogni chiamata a uno strumento come messaggio con il ruolo tool e invia la richiesta successiva.

I miei dati vengono inviati da qualche parte?

No. Lo stream viene letto nel tuo browser. I comandi curl sono solo testo da eseguire tu stesso.

Articoli correlati

Correlati