AI.Product ClubБлог Михаила Карпова
← Все материалы
HOW-TOПамять и локальный ИИ8 мин чтения

Ollama API: как подключить локальную модель к приложению

Первый запрос к Ollama API на Python: выбор установленной модели, обработка ответа, streaming и диагностика ошибок подключения.

Ollama API позволяет обращаться к модели из своего скрипта: отправить сообщение по HTTP, получить ответ и использовать его в приложении. Начать можно без веб-интерфейса и дополнительных Python-библиотек. Здесь соберём небольшой клиент, который превращает заметку о продукте в краткое описание.

В инструкции используется локальный сервер Ollama на твоём компьютере. Это важно: приложение на Vercel не сможет обратиться к нему через собственный localhost. Сначала проверим запрос локально, а затем разберём, что меняется при переносе в веб-приложение.

Скрипт отправляет сообщения в локальный Ollama, модель возвращает ответ, приложение проверяет результат
Путь локального запроса. Проверка результата остаётся отдельным шагом приложения.

Мой подход. Я бы сначала добился одного понятного ответа в терминале. Чат, история сообщений и красивый интерфейс имеют смысл после этого. Так проще понять, где ошибка: в модели, запросе или приложении.

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.

Готовность этого этапа проста: клиент получает список моделей, выполняет одну задачу и объясняет ошибку при недоступном сервере. После этого уже можно измерять задержку и сравнивать качество моделей на своих текстах.

Todo: попробуй на своей задачеПрогресс сохраняется в этом браузере.
ПРАКТИКА НА КУРСЕ / AI PRODUCT CLUB

Собери своего ИИ-агента и проверь результат

«AI Agents: от vibe coding к AI-команде»: desktop agents, MCP, skills, evals и harness. Отдельные воркшопы — от подключения инструментов до контроля качества.

7 практических воркшопов · записи · вопросы автору в чате

Посмотреть программу курса ↗

Автор: — практик автоматизации и автор курсов AI Product Club.