Ollama Python — это официальная библиотека ollama: после установки командой pip install ollama скрипт вызывает локальный сервер функциями chat и generate либо через объект Client с адресом сервера. Библиотека отправляет запрос и возвращает ответ, а таймаут, разбор сбоев и проверку содержимого пишет автор скрипта. Схема годится для внутренних задач, где модель работает на вашем сервере, а результат читает человек или сверяет код.
Клиент и адрес
Для вызова хватает пакета ollama и объекта Client(host=...): адрес сервера, таймаут и заголовки задаются при создании клиента, а текст ответа читается из response.message.content.
Допустим, скрипт раз в сутки берёт переписку с поставщиком по одному заказу и просит модель написать пересказ на пять строк: что согласовано, что ждёт ответа, какие даты названы. Письма скрипт собирает из почтовой копии, модель пересказывает, менеджер по закупкам читает пересказ рядом с оригиналами и решает, что делать дальше. Запись в учётную систему идёт отдельным шагом, и делает её код после подтверждения менеджера.
Функции верхнего уровня, такие как ollama.chat, обращаются к серверу на том же компьютере. Когда Ollama стоит на другой машине, создайте Client(host='http://адрес:11434'): по описанию библиотеки все дополнительные именованные аргументы уходят в httpx.Client, так что таймаут и заголовки настраиваются там же. Для асинхронной очереди есть AsyncClient с теми же параметрами. Маршруты самого сервера разобраны в статье про Ollama API для своих сервисов, а здесь речь о Python-клиенте.
Начинайте скрипт с проверки окружения. Вызов ollama.list() возвращает установленные модели, ollama.ps() показывает загруженные в память. Если нужной модели на сервере нет, запуск прекращается с понятным сообщением, а загрузку делает администратор. Из ответа чата читайте только нужные атрибуты, прежде всего message.content: остальные поля зависят от версий библиотеки и сервера.
Таймаут и прогрев
Первый запрос после паузы идёт дольше остальных, потому что модель сначала загружается в память. В разделе FAQ документации Ollama сказано, что по умолчанию модель остаётся в памяти пять минут и затем выгружается. Параметр запроса keep_alive принимает секунды или строку длительности: значение -1 оставляет модель загруженной, а 0 выгружает сразу. На весь сервер правило задаёт переменная OLLAMA_KEEP_ALIVE, параметр запроса её перекрывает.
Отсюда расчёт таймаута. Холодный запуск и тёплый вызов — две разные величины, и одним числом на оба случая обойтись нельзя. Замерьте их на своём оборудовании по десяти запускам каждого вида и запишите максимумы. Таймаут чтения ставьте выше холодного максимума, а в журнал добавляйте пометку о режиме вызова: так по записи видно, сбой случился на прогреве или на обычной работе.
- Холодный старт: ночной скрипт прогревает модель пустым вызовом перед основной пачкой либо держит
keep_aliveдольше паузы между пачками. - Размер пачки: сколько писем уходит подряд, пока тот же сервер отвечает коллегам.
- Очередь сервера: по документации число параллельных запросов на модель по умолчанию равно одному (
OLLAMA_NUM_PARALLEL), лишние ждут в очереди (OLLAMA_MAX_QUEUE), поэтому длинная пачка занимает чужое время. - Повтор: сколько попыток делает скрипт при таймауте и какая пауза между ними.
Повторять запрос без предела нельзя: зависший вызов, перезапущенный несколькими потоками, только удлиняет очередь. Ограничьте число попыток, а после последней оставьте письмо в очереди с пометкой, чтобы менеджер увидел необработанный заказ. Если нагрузка растёт и на сервере работают несколько команд, сравните варианты в разборе vLLM и Ollama.
Запрос и ответ
Запрос состоит из имени модели, списка сообщений и необязательных параметров. Температуру и прочие настройки передают в options, формат ответа — в format; структурный вывод подробно описан в статье про JSON-ответы Ollama. Для первого прогона удобен короткий порядок действий.
- Установите пакет командой
pip install ollamaв окружение скрипта и создайтеClientс адресом сервера. - На старте вызовите
list()и сверьте имя модели; при отсутствии остановите запуск. - Отправьте через
chatтри вымышленных письма поставщика с известными датами и одной суммой. - Проверьте ответ кодом: текст непустой, каждая дата и сумма из пересказа есть во входных письмах, длина укладывается в пять строк.
- Сохраните вход, ответ и причину отказа проверки в журнал, исключив реальные персональные данные.
Пересказ читается гладко, но уверенный тон о точности молчит. Эту разницу закрывает код: он извлекает даты и суммы из исходных писем регулярным выражением и сравнивает с названными в пересказе. Лишняя дата отправляет письмо на ручную проверку, а арифметику модель вообще оставляет коду.
Вторая проверка касается формы. Ответ без кириллицы, пустой или длиннее заданного скрипт считает браком и повторяет вызов в пределах лимита. Всё остальное решает менеджер, у которого пересказ лежит рядом с оригиналами.
Какую переписку вы хотели бы пересказывать таким скриптом?
Ошибки и сбои
Сбои делятся на два класса: ответ сервера с кодом ошибки и обрыв соединения. Для первого README описывает исключение ollama.ResponseError с атрибутами error и status_code; ошибки поднимаются, если запрос вернул код ошибки или сбой обнаружен посреди потока. В документации API тело ошибки имеет вид {"error": "..."}, а среди кодов названы 400, 404, 429, 500 и 502.
| Ситуация | Что видит скрипт | Реакция |
|---|---|---|
| Модели нет на сервере | ResponseError, код 404 | Остановить пачку и сообщить администратору; загрузку модели выполняет человек |
| Ошибка в запросе или параметре | ResponseError, код 400 | Записать запрос в журнал и исправить код; повтор бесполезен |
| Лимит или сбой на стороне сервера | Коды 429, 500, 502 | Повторить с паузой в пределах лимита, затем оставить письмо в очереди |
| Сервер выключен или адрес ошибочен | Исключение соединения до получения ответа | Проверить службу и адрес, затем ограниченный повтор |
| Обрыв посреди потока | Исключение при чтении, частичный текст | Выбросить частичный ответ целиком и повторить запрос |
| Пустой или бракованный ответ | Исключения нет | Отклонить проверкой содержимого |
Последняя строка важнее остальных. По README исключения поднимаются при коде ошибки и при сбое посреди потока; пустую строку в content библиотека отдаёт как обычный ответ. Поэтому проверка содержимого идёт после каждого успешного вызова, а исключения служат лишь первой линией.
Журнал собирайте так, чтобы по нему были видны тип сбоя, номер попытки, режим вызова (холодный или тёплый) и идентификатор письма. Текст переписки и полный ответ модели кладите в журнал только при отладке на вымышленных данных; в рабочем журнале хватает идентификаторов и причины отказа.
Допуск в работу
Скрипт переводят из тестового режима в рабочий, когда на сохранённом наборе обезличенных переписок видны три вещи: доля пересказов, прошедших проверку с первой попытки, перечень случаев, где менеджер поправил текст, и поведение скрипта при выключенном сервере. Порог доли задаёт владелец процесса до запуска; задним числом цифра подгоняется под результат.
Права скрипта ограничивают отдельно. Учётная запись, под которой он работает, читает почтовые копии и пишет в очередь пересказов, а менять заказы в учётной системе она лишена возможности. Тогда ошибка модели остаётся черновиком. Если скрипту предстоит вырасти до агента с действиями, начните со страницы про ИИ-агентов для бизнеса, а условия локального сервера описаны в статье про Ollama в Docker.
После обновления библиотеки или сервера прогоните тот же набор заново: поля ответа и поведение таймаутов зависят от версий, и изменение заметно только на сохранённых примерах.
Начните с проверки дат и сумм в пересказе: она ловит выдумку быстрее любой оценки на глаз. Новые проверки добавляйте только под те сбои, которые уже попали в журнал.