# Ollama API streaming: как читать ответ по частям и не терять итоговые метрики

Источник: https://modelium.tech/zhurnal/ollama-api-streaming/

Ollama API отдаёт ответ модели по частям: каждая строка — отдельный JSON-объект. Чтобы собрать текст, объедините поля `response` из промежуточных строк; последнюю строку с `done: true` сохраните отдельно, потому что в ней находятся счётчики и время. Ниже — один путь на Linux с локальной моделью; Modelium сверил его по документации, но не запускал модель.

**Инструкция сверена с документацией Ollama на 8 октября 2026 года; Modelium не запускал модель.** Один путь ниже рассчитан на Linux и знакомство с терминалом. Это инструкция по API, не обещание скорости или успешной работы на любом компьютере. [s1](#src-s1) [s4](#src-s4)

## Что получится из потока?

Вы попросите локальную модель решить маленький пример и увидите в терминале несколько строк вместо одного готового ответа. API — способ отправить запрос запущенной на вашем компьютере Ollama из другой программы. Ответ приходит как **NDJSON**: каждая строка содержит самостоятельный объект в формате JSON — текст с названиями полей. Из полей `response` собирается ответ, а последний объект с `done: true` хранит статистику запроса. Проверяйте не только получившийся текст, но и признак завершения: при обрыве сети или ошибке HTTP-ответ сам по себе может не гарантировать успешную генерацию. [s1](#src-s1) [s2](#src-s2) [s3](#src-s3)

## Что подготовить на Linux?

Установите Ollama по [инструкции для запуска](/zapusk/ollama/) и откройте терминал Linux. Нужны также `curl`, `tee` и Python 3 для чтения строк; это команды терминала, а не кнопки приложения. Если сервер не работает, запустите `ollama serve` в отдельном терминале. Проверьте доступность локального API командой `curl -fS http://localhost:11434/api/tags`: ожидается JSON со списком локальных моделей, а не ошибка соединения. Тег `localhost` означает ваш компьютер, не облачный адрес. [s1](#src-s1) [s4](#src-s4)

Для одного конкретного примера скачайте `ollama pull gemma4:e2b` и убедитесь, что этот тег виден в `ollama list`. Официальный quickstart называет загрузку примерно 7,2 ГБ и **рекомендует** 8 ГБ доступной видеопамяти (или объединённой памяти Mac); это не минимальная RAM и не гарантия скорости на CPU. Если места или памяти не хватает, не обещайте запуск этой модели на слабом ПК: выберите другой документированный локальный тег и замените имя модели в запросе. Интернет нужен для установки и загрузки весов; запрос ниже идёт к локальному серверу без API-ключа. Редакция не проводила сетевой аудит и не проверяла работу офлайн после скачивания. [s4](#src-s4)

## Как увидеть поток и собрать текст?

- В терминале Linux выполните `set -o pipefail`: оболочка Bash тогда сообщит об ошибке `curl`, даже когда вывод проходит через `tee`. Если ваша оболочка не Bash, откройте Bash перед этим шагом. [s3](#src-s3)

- Запустите `curl --fail-with-body --silent --show-error --no-buffer -H 'Content-Type: application/json' http://localhost:11434/api/generate -d '{"model":"gemma4:e2b","prompt":"Сколько будет 2 плюс 2? Ответь одной цифрой.","stream":true}' | tee answer.ndjson`. После начала генерации в терминале должны появляться отдельные JSON-строки; одновременно они записываются в файл `answer.ndjson` текущей папки. Команда не загружает документы в интернет, но убедитесь, что вводите тестовый, а не чужой секретный текст. Не запускайте этот пример против облачного URL. [s1](#src-s1) [s4](#src-s4)

- После завершения выполните `python3 -c 'import json,pathlib; rows=[json.loads(s) for s in pathlib.Path("answer.ndjson").read_text().splitlines() if s.strip()]; assert rows and not any("error" in r for r in rows) and rows[-1].get("done") is True, "ошибка или поток оборвался"; print("Ответ:", "".join(r.get("response", "") for r in rows)); print("Входных токенов:", rows[-1].get("prompt_eval_count"), "выходных:", rows[-1].get("eval_count"))'`. Вы должны увидеть собранный ответ и два счётчика из **последней** строки. Сравните математический ответ с `4` сами: это ожидаемый критерий для учебного входа, а не якобы записанный результат запуска Modelium. [s1](#src-s1) [s2](#src-s2)

`done: false` означает промежуточный кусочек, а `done: true` — завершение. При потоковой выдаче поле `response` в финальном объекте обычно пустое: если читать только последнюю строку, вы потеряете сам ответ; если отбросить последнюю, потеряете счётчики `prompt_eval_count` и `eval_count`. `total_duration` и другие поля времени в Ollama выражены в **наносекундах**, не в миллисекундах. [s1](#src-s1) [s2](#src-s2)

## Что делать, если результата нет?

Если `curl` пишет о соединении, проверьте, что `ollama serve` работает, а адрес ровно `localhost:11434`; затем откройте [проверку готовности](/zhurnal/ollama-healthcheck/). Если указанный тег не найден, проверьте `ollama list` и повторите загрузку. Если финального `done: true` нет или в строке присутствует `error`, считайте ответ неполным, даже когда начало текста уже показалось: после начала потока HTTP-статус может остаться прежним. Исправьте причину, затем повторите короткий запрос, а не склеивайте две разные попытки. [s1](#src-s1) [s3](#src-s3) [s4](#src-s4)

Если вам не нужен постепенный вывод, задайте `"stream":false`: тогда `/api/generate` возвращает один объект с целым ответом. Это другой режим, не требующий сборки фрагментов. Для проверки сервера и выбранного тега перед работой с приложением откройте [диагностику Ollama](/zhurnal/ollama-healthcheck/). [s1](#src-s1)

## Источники

1. [Ollama API: /api/generate, потоковые строки и финальный объект](https://github.com/ollama/ollama/blob/e3cddc3e897d8414a60a46e23f5ef3a99be2eb81/docs/api.md) — получено 2026-10-08
2. [Ollama API usage: поля и единицы метрик в финальном фрагменте](https://github.com/ollama/ollama/blob/e3cddc3e897d8414a60a46e23f5ef3a99be2eb81/docs/api/usage.mdx) — получено 2026-10-08
3. [Ollama API errors: ошибка после начала потока](https://github.com/ollama/ollama/blob/e3cddc3e897d8414a60a46e23f5ef3a99be2eb81/docs/api/errors.mdx) — получено 2026-10-08
4. [Ollama quickstart: локальная установка и gemma4:e2b](https://github.com/ollama/ollama/blob/e3cddc3e897d8414a60a46e23f5ef3a99be2eb81/docs/quickstart.mdx) — получено 2026-10-08
