Ollama API: как подключить локальную модель к приложению
Первый запрос к Ollama API на Python: выбор установленной модели, обработка ответа, streaming и диагностика ошибок подключения.
Ollama API позволяет обращаться к модели из своего скрипта: отправить сообщение по HTTP, получить ответ и использовать его в приложении. Начать можно без веб-интерфейса и дополнительных Python-библиотек. Здесь соберём небольшой клиент, который превращает заметку о продукте в краткое описание.
В инструкции используется локальный сервер Ollama на твоём компьютере. Это важно: приложение на Vercel не сможет обратиться к нему через собственный localhost. Сначала проверим запрос локально, а затем разберём, что меняется при переносе в веб-приложение.
Мой подход. Я бы сначала добился одного понятного ответа в терминале. Чат, история сообщений и красивый интерфейс имеют смысл после этого. Так проще понять, где ошибка: в модели, запросе или приложении.
1. Подготовь локальную модель
Установи и запусти Ollama по официальной инструкции. Для примера нужны Python 3 и хотя бы одна загруженная текстовая модель. Если модель ещё не выбрана, начни с разбора памяти и размеров моделей: скачивание самой большой модели редко помогает быстрее проверить интеграцию.
В терминале выполни:
ollama list
curl --fail --silent --show-error http://localhost:11434/api/tags
Первая команда показывает модели через CLI, вторая проверяет HTTP-интерфейс. В JSON должен быть массив models. Пустой массив означает, что сервер доступен, но выбирать пока не из чего. Используй команду загрузки со страницы выбранной модели в каталоге Ollama, затем повтори проверку. Схема ответа описана в List models.
Не меняй сетевые настройки ради этого упражнения. Для запроса с того же компьютера достаточно локального адреса. Ollama по умолчанию слушает 127.0.0.1:11434; режимы локального и облачного запуска различаются. Настройки Ollama.
2. Отправь первый запрос из Python
Скачай готовый клиент, распакуй архив и запусти python3 ollama_chat.py. Он покажет установленные модели и попросит выбрать номер. Название не нужно вписывать в код, поэтому пример не зависит от конкретного тега модели.
Основная часть клиента выглядит так:
import json
from urllib.request import Request, urlopen
with urlopen("http://localhost:11434/api/tags", timeout=10) as response:
models = json.load(response)["models"]
if not models:
raise SystemExit("Сначала загрузи текстовую модель в Ollama.")
for index, item in enumerate(models, start=1):
print(index, item["name"])
choice = input("Номер модели: ").strip()
if not choice.isdigit() or not 1 <= int(choice) <= len(models):
raise SystemExit("Выбери номер из списка.")
model = models[int(choice) - 1]["name"]
payload = {
"model": model,
"messages": [{
"role": "user",
"content": "Сократи до одного предложения: приложение собирает идеи "
"для статей, хранит их локально и позволяет удалить ненужные."
}],
"stream": False
}
request = Request(
"http://localhost:11434/api/chat",
data=json.dumps(payload).encode("utf-8"),
headers={"Content-Type": "application/json"},
method="POST"
)
with urlopen(request, timeout=180) as response:
result = json.load(response)
print(result["message"]["content"])
Полная версия в архиве дополнительно обрабатывает сетевые ошибки и пустой текст. Она не отправляет данные в сторонний сервис сама: назначение запроса задано локальным URL. Если выберешь облачную модель внутри Ollama, вычисление уже будет облачным — локальный адрес клиента сам по себе этого не исключает.
В /api/chat передаём название модели и массив сообщений. Ответ читаем из message.content. Не путай этот формат с /api/generate, где используются другие поля. Описание chat endpoint.
3. Проверь ответ и разберись со streaming
Для нашего текста полезный ответ должен сохранить три свойства: идеи для статей, локальное хранение, удаление. Например, описание с «синхронизацией между устройствами» будет ошибкой: такой возможности во входе нет. Формулировка может меняться; сверять её посимвольно бессмысленно.
Здесь stream: false выбран специально: клиент получает один JSON. При потоковом режиме ответ приходит частями, и чтение всего потока через json.load не подходит. Нужен разбор отдельных JSON-строк и сборка фрагментов. Это описано в руководстве по streaming.
На что я бы смотрел. HTTP 200 подтверждает работу соединения, но ничего не говорит о точности описания. Для первой интеграции я бы сохранил пять исходных заметок и отдельно проверил, не добавляет ли модель несуществующие функции.
4. Найди причину ошибки
| Симптом | Что проверить первым |
|---|---|
| Connection refused | Запущен ли Ollama на том же компьютере |
| Модель не найдена | Совпадает ли имя с ollama list, включая тег |
| Долгое ожидание | Загружается ли модель и хватает ли памяти |
| Ошибка чтения JSON | Не включён ли streaming в запросе |
| Ответ пустой | Есть ли текст в message.content, не возвращён ли другой тип результата |
Если сервер недоступен, сначала добейся ответа от /api/tags, затем повторяй генерацию. Если список моделей читается, переустанавливать весь стек обычно преждевременно: проверяй конкретный запрос и модель. Не запускай бесконечный цикл повторов — при нехватке памяти он только добавит нагрузки.
5. Перенеси рабочий запрос в приложение
В локальной утилите оставь таймаут, понятное сообщение об ошибке и ограничение на размер текста. Для диалога приложение должно само передавать нужную историю в messages; не рассчитывай, что каждый отдельный HTTP-запрос автоматически помнит предыдущий.
Если интерфейс размещён на Vercel, у него другой компьютер и другой localhost. Для серверной интеграции понадобится доступный backend с Ollama и контролем доступа либо облачный API. Не открывай порт без аутентификации только ради демонстрации. Для автоматизации на своей машине можно продолжить со связкой n8n и Ollama.
Готовность этого этапа проста: клиент получает список моделей, выполняет одну задачу и объясняет ошибку при недоступном сервере. После этого уже можно измерять задержку и сравнивать качество моделей на своих текстах.
Собери своего ИИ-агента и проверь результат
«AI Agents: от vibe coding к AI-команде»: desktop agents, MCP, skills, evals и harness. Отдельные воркшопы — от подключения инструментов до контроля качества.
7 практических воркшопов · записи · вопросы автору в чате
Посмотреть программу курса ↗