Ollama API streaming: как читать ответ по частям и не терять итоговые метрики
На странице · 4 разделов
Ollama API отдаёт ответ модели по частям: каждая строка — отдельный JSON-объект. Чтобы собрать текст, объедините поля `response` из промежуточных строк; последнюю строку с `done: true` сохраните отдельно, потому что в ней находятся счётчики и время. Ниже — один путь на Linux с локальной моделью; Modelium сверил его по документации, но не запускал модель.
Инструкция сверена с документацией Ollama на 8 октября 2026 года; Modelium не запускал модель. Один путь ниже рассчитан на Linux и знакомство с терминалом. Это инструкция по API, не обещание скорости или успешной работы на любом компьютере. s1 s4
Что получится из потока?
Вы попросите локальную модель решить маленький пример и увидите в терминале несколько строк вместо одного готового ответа. API — способ отправить запрос запущенной на вашем компьютере Ollama из другой программы. Ответ приходит как NDJSON: каждая строка содержит самостоятельный объект в формате JSON — текст с названиями полей. Из полей response собирается ответ, а последний объект с done: true хранит статистику запроса. Проверяйте не только получившийся текст, но и признак завершения: при обрыве сети или ошибке HTTP-ответ сам по себе может не гарантировать успешную генерацию. s1 s2 s3
Что подготовить на Linux?
Установите Ollama по инструкции для запуска и откройте терминал Linux. Нужны также curl, tee и Python 3 для чтения строк; это команды терминала, а не кнопки приложения. Если сервер не работает, запустите ollama serve в отдельном терминале. Проверьте доступность локального API командой curl -fS http://localhost:11434/api/tags: ожидается JSON со списком локальных моделей, а не ошибка соединения. Тег localhost означает ваш компьютер, не облачный адрес. s1 s4
Для одного конкретного примера скачайте ollama pull gemma4:e2b и убедитесь, что этот тег виден в ollama list. Официальный quickstart называет загрузку примерно 7,2 ГБ и рекомендует 8 ГБ доступной видеопамяти (или объединённой памяти Mac); это не минимальная RAM и не гарантия скорости на CPU. Если места или памяти не хватает, не обещайте запуск этой модели на слабом ПК: выберите другой документированный локальный тег и замените имя модели в запросе. Интернет нужен для установки и загрузки весов; запрос ниже идёт к локальному серверу без API-ключа. Редакция не проводила сетевой аудит и не проверяла работу офлайн после скачивания. s4
Как увидеть поток и собрать текст?
- В терминале Linux выполните
set -o pipefail: оболочка Bash тогда сообщит об ошибкеcurl, даже когда вывод проходит черезtee. Если ваша оболочка не Bash, откройте Bash перед этим шагом. 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 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 s2
done: false означает промежуточный кусочек, а done: true — завершение. При потоковой выдаче поле response в финальном объекте обычно пустое: если читать только последнюю строку, вы потеряете сам ответ; если отбросить последнюю, потеряете счётчики prompt_eval_count и eval_count. total_duration и другие поля времени в Ollama выражены в наносекундах, не в миллисекундах. s1 s2
Что делать, если результата нет?
Если curl пишет о соединении, проверьте, что ollama serve работает, а адрес ровно localhost:11434; затем откройте проверку готовности. Если указанный тег не найден, проверьте ollama list и повторите загрузку. Если финального done: true нет или в строке присутствует error, считайте ответ неполным, даже когда начало текста уже показалось: после начала потока HTTP-статус может остаться прежним. Исправьте причину, затем повторите короткий запрос, а не склеивайте две разные попытки. s1 s3 s4
Если вам не нужен постепенный вывод, задайте "stream":false: тогда /api/generate возвращает один объект с целым ответом. Это другой режим, не требующий сборки фрагментов. Для проверки сервера и выбранного тега перед работой с приложением откройте диагностику Ollama. s1
Источники
- Ollama API: /api/generate, потоковые строки и финальный объект — revision e3cddc3e897d8414a60a46e23f5ef3a99be2eb81. Получено 08.10.2026.
- Ollama API usage: поля и единицы метрик в финальном фрагменте — revision e3cddc3e897d8414a60a46e23f5ef3a99be2eb81. Получено 08.10.2026.
- Ollama API errors: ошибка после начала потока — revision e3cddc3e897d8414a60a46e23f5ef3a99be2eb81. Получено 08.10.2026.
- Ollama quickstart: локальная установка и gemma4:e2b — revision e3cddc3e897d8414a60a46e23f5ef3a99be2eb81. Получено 08.10.2026.