~/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.txtLetto 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
- Esegui la tua richiesta con curl -sN e salva l'output in un file, oppure copia ciò che ha ricevuto il tuo programma.
- Incolla l'intero stream. Lo strumento rileva se proviene da /api/chat, /api/generate o /v1/chat/completions.
- 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
- Tenere d'occhio la memoria di Ollama su una piccola VPSScopri cosa Ollama tiene in memoria, per quanto tempo e quali impostazioni lo cambiano: ollama ps, keep_alive e i limiti, dalle FAQ ufficiali.
- Collegare Dify a Ollama sul proprio VPSEsegui Dify sul tuo VPS e usa Ollama come modello: installazione, campi del plugin, il problema dell'indirizzo in Docker e gli embedding, dalla documentazione ufficiale.
- Avviare un LLM locale senza un PC costoso: guida per principianti all'uso di una VPSNon hai un PC potente? Affitta una VPS ed esegui un piccolo LLM locale dal browser: sei passaggi, dalla stima della memoria a una chat protetta, con i limiti dichiarati con onestà.