Программный доступ к Ollama REST API

После установки Ollama предоставляет полный REST API на локальном порту 11434, охватывающий генерацию текста, чат, векторные эмбеддинги и управление моделями, а также два совместимых протокола: OpenAI и Anthropic.

В этой статье поочерёдно объясняются основные API: структура запроса, потоковая обработка, статистика использования и обработка ошибок, что позволяет любому языку интегрироваться с локальными моделями.


Два базовых URL и методы аутентификации

API Ollama имеет две конечные точки: локальную и облачную, с разными правилами аутентификации.

Ollama API 全景:调用方、服务端点、本地模型与 Cloud

Конечная точкаБазовый URLАутентификация
Локальный сервисhttp://localhost:11434/apiАутентификация не требуется
Локальный сервис (совместимый протокол)http://localhost:11434/v1Аутентификация не требуется, api_key можно заполнить произвольно
Ollama Cloudhttps://ollama.com/apiAuthorization: Bearer + API Key

Локальные сервисы по умолчанию не требуют аутентификации и работают сразу из коробки; при прямом подключении к облачному API Ollama по адресу ollama.com сначала создайте API-ключ на странице настроек официального сайта и укажите его в заголовке запроса.


Генерация текста: /api/generate

generate — самый базовый API генерации с одним ходом; достаточно передать имя модели и prompt:

Пример

curl http://localhost:11434/api/generate -d '{
  "model": "qwen3.5",
"prompt": "Introduce Python in one sentence",
  "stream": false
}'

Когда stream имеет значение false, возвращается один JSON-объект:

{
  "model": "qwen3.5",
  "created_at": "2026-08-29T03:20:00.499127Z",
  "response": "Example是一个面向编程初学者的免费中文教程网站。",
  "done": true,
  "total_duration": 10706818083,
  "load_duration": 6338219291,
  "prompt_eval_count": 26,
  "prompt_eval_duration": 130079000,
  "eval_count": 42,
  "eval_duration": 4232710000
}

Общие параметры следующие:

ПараметрОписание
modelОбязательный, имя модели
promptPrompt; можно оставить пустым, чтобы предзагрузить модель
streamПо умолчанию true возвращает потоковую передачу; при false возвращает полный результат сразу
systemВременно указать системный промпт, переопределив настройку в Modelfile
optionsОбъект параметров генерации, например, temperature, num_ctx (как в параметрах Modelfile)
format"json" или полная JSON Schema, принудительно задаёт структурированный вывод
keep_aliveПродолжительность, в течение которой модель остаётся в памяти после запроса, например, "10m", -1 для постоянного нахождения в памяти, 0 для немедленной выгрузки
rawКогда true, пропускает сборку шаблона и напрямую использует полный промпт, который вы предоставляете
suffixТекст, добавляемый после вывода модели, для сценариев дополнения текста
imagesМассив изображений в Base64, используется с мультимодальными моделями

Два практических совета: отправка пустого промпта может предварительно загрузить модель в память, устраняя ожидание загрузки при первом запросе; установка keep_alive в 0 вместе с пустым промптом может немедленно выгрузить модель и освободить VRAM.

Пример

# Предварительная загрузка модели (контент не генерируется)
curl http://localhost:11434/api/generate -d '{"model": "qwen3.5"}'

# Немедленно выгрузить модель, освободить VRAM
curl http://localhost:11434/api/generate -d '{"model": "qwen3.5", "keep_alive": 0}'

Генерация чата: /api/chat

chat — это API многоходового диалога; история сообщений поддерживается вызывающей стороной, что является ключевым отличием от generate.

Пример

curl http://localhost:11434/api/chat -d '{
  "model": "qwen3.5",
  "messages": [
{ "role": "user", "content": "Что такое Python?" },
{ "role": "assistant", "content": "Китайский учебный сайт для начинающих." },
{ "role": "user", "content": "Это бесплатно? Ответьте одним предложением" }
  ],
  "stream": false
}'

Поля, поддерживаемые объектом message:

ПолеОписание
roleЧетыре роли: system / user / assistant / tool
contentСодержимое сообщения
imagesНеобязательно, список изображений в base64 (мультимодальные модели)
thinkingНеобязательно, процесс рассуждения thinking-моделей (используется с параметром think)
tool_callsНеобязательно: список инструментов, которые модель запрашивает вызвать (см. раздел о вызове инструментов для практики)

Правильный способ многоходового диалога: добавляйте сообщение ассистента, возвращённое моделью на каждом раунде, обратно в массив messages, затем отправляйте его с новым вопросом; тогда модель сможет "запомнить" весь контекст.

Поскольку сообщения полностью управляются вами, историю можно сохранять в базе данных, сжимать с помощью суммаризации или восстанавливать между сессиями — проблема, упомянутая в части 5 "выход из командной строки теряет память", теперь имеет инженерное решение здесь.


Векторные эмбеддинги: /api/embed

API embed преобразует текст в векторы, служа мастерской сырья для RAG и семантического поиска.

Пример

# Одиночный текст
curl http://localhost:11434/api/embed -d '{
  "model": "embeddinggemma",
"input": "EXAMPLE — это сайт с уроками программирования"
}'


# Пакетно: передайте массив в input, возвращает несколько векторов сразу
curl http://localhost:11434/api/embed -d '{
  "model": "embeddinggemma",
"input": ["первый текст", "второй текст", "третий текст"]
}'

Эмбеддинги в ответе — это двумерный массив, каждый вектор в котором уже L2-нормализован (единичной длины), поэтому для сравнения можно напрямую использовать косинусное сходство.

Два параметра, заслуживающих внимания: dimensions может задавать размерность выходного вектора (когда это поддерживается моделью, уменьшение размерности экономит место при хранении); truncate по умолчанию имеет значение true и автоматически обрезает слишком длинный текст, а установка false вызовет ошибку, если текст слишком длинный.


Потоковая передача или без неё: как обрабатывать ответы

API генерации по умолчанию возвращают потоковый ответ в формате NDJSON: каждая строка — независимый объект JSON.

{"model":"qwen3.5","created_at":"...","response":"EXAMPLE","done":false}
{"model":"qwen3.5","created_at":"...","response":"(Example)","done":false}
{"model":"qwen3.5","created_at":"...","response":"是编程初学者的入门网站。","done":false}
{"model":"qwen3.5","created_at":"...","response":"","done":true,"done_reason":"stop"}

Клиент читает построчно и объединяет поля ответа, чтобы сформировать полный ответ; процесс объединения можно отображать в интерфейсе в реальном времени.

Плюсы и минусы двух режимов:

ModeПреимуществоСценарий использования
Потоковая передача (по умолчанию)Низкое время до первого токена, можно отображать в реальном времениИнтерфейсы чатов, генерация длинных текстов
Непотоковый режим stream:falseПолучить полный результат сразу, просто обрабатыватьПакетная обработка, структурированный вывод, вызовы из скриптов

В потоковом режиме ошибки могут возникнуть в середине вывода; в этот момент код состояния HTTP уже нельзя изменить. Ошибка появится в виде строки {"error": "..."} в конце потока данных, и клиент должен проверять эту строку при разборе.


Статистика использования и обработка ошибок

Каждый ответ генерации заканчивается полями статистики производительности, предоставляя первичные данные для оценки накладных расходов на инференс.

ПолеЗначение
total_durationОбщее время запроса (наносекунды)
load_durationВремя загрузки модели (заметно при первом запросе)
prompt_eval_countКоличество токенов, потреблённых входом
prompt_eval_durationВремя обработки входных данных
eval_countКоличество токенов, сгенерированных в выводе
eval_durationВремя генерации вывода

Формула скорости генерации (токенов/с): eval_count / eval_duration * 10^9; все единицы времени — наносекунды.

С точки зрения обработки ошибок API использует стандартные HTTP-коды состояния для представления результатов:

Код состоянияЗначение
200Успех
400Ошибка запроса (отсутствующие параметры, неверный JSON и т. д.)
404Модель не существует (сначала выполните ollama pull или проверьте имя)
429Ограничение скорости из-за слишком частых запросов
500Внутренняя ошибка сервера
502Ошибка шлюза (например, облачная модель недоступна)

Тело ответа с ошибкой имеет фиксированную структуру {"error": "error description"}; клиенты могут просто единообразно извлекать поле error.


Обзор API управления моделями

API предоставляет аналог для каждой операции управления моделями, доступной в командной строке, что подходит для создания административных панелей или сценариев автоматизации.

Конечная точкаМетодНазначение
/api/tagsGETСписок локальных моделей (включая количество параметров, уровень квантования)
/api/showPOSTПросмотр сведений о модели, возможностей, шаблона
/api/pullPOSTЗагрузка модели, возвращает потоковый прогресс загрузки
/api/pushPOSTОтправить модель в библиотеку моделей
/api/copyPOSTКопировать модель (источник / назначение)
/api/deleteDELETEУдалить модель
/api/createPOSTСоздать модель (включая квантование, соответствующее возможностям Modelfile)
/api/psGETПросмотр текущих загруженных моделей и использования VRAM
/api/versionGETЗапрос версии Ollama

На примере /api/tags ответ содержит сведения о спецификации для каждой модели:

{
  "models": [
    {
      "name": "qwen3.5:latest",
      "size": 6600000000,
      "details": {
        "family": "qwen3.5",
        "parameter_size": "9B",
        "quantization_level": "Q4_K_M"
      }
    }
  ]
}

Такие поля, как quantization_level и parameter_size, можно напрямую использовать для создания интерфейса выбора модели.


Интерфейс, совместимый с OpenAI

Чтобы существующие приложения OpenAI переключились на локальные модели, обычно достаточно изменить только base_url.

Пример

curl http://localhost:11434/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "qwen3.5",
"messages": [{ "role": "user", "content": "Cuir Python in aithne in aon abairt amháin" }]
  }'

Clúdaíonn an chomhoiriúnacht cúig chríochphointe:

Конечная точкаОписание
/v1/chat/completionsComhlántaí comhrá, ag tacú le sruthú, fís, uirlisí, agus mód JSON
/v1/completionsComhlántaí téacs
/v1/responsesAPI Freagraí (mód neamhstáit)
/v1/embeddingsLeabuithe veicteora
/v1/modelsСписок моделей

Обратите внимание на два распространённых различия:

Во-первых, в протоколе OpenAI нет понятия num_ctx. Когда нужно изменить контекст, сначала создайте модель с PARAMETER num_ctx, а затем вызывайте её под новым именем (можно использовать Modelfile из части 7 или позаимствовать имя с помощью cp).

Во-вторых, некоторые поля пока не поддерживаются: tool_choice, logit_bias, n, logprobs и т. д. Перед миграцией рекомендуется проверить список поддержки в руководстве.


Интерфейс, совместимый с Anthropic

Ollama также предоставляет слой совместимости с Anthropic Messages API, позволяющий таким инструментам, как Claude Code, напрямую использовать локальные модели.

Пример

curl http://localhost:11434/v1/messages \
  -H "Content-Type: application/json" \
  -H "anthropic-version: 2023-06-01" \
  -d '{
    "model": "qwen3.5",
    "max_tokens": 1024,
"messages": [{ "role": "user", "content": "Cuir Python in aithne in aon abairt amháin" }]
  }'

При интеграции таких инструментов, как Claude Code, достаточно задать две переменные окружения:

Пример

export ANTHROPIC_AUTH_TOKEN=ollama
export ANTHROPIC_BASE_URL=http://localhost:11434
claude --model qwen3.5

Обратите внимание на границы возможностей: такие функции Anthropic, как принудительный tool_choice, кэширование промптов, пакетный интерфейс и ввод PDF, пока не поддерживаются; количество токенов приблизительно.

Другие расширения