Перейти к основному содержанию
Ollama — локальный runtime для LLM: он поднимает HTTP-сервер, раздаёт скачанные веса и отдаёт генерацию. Практически весь код, который вы пишете поверх Ollama, ходит в его OpenAI-совместимый слой — тот же самый протокол, что и у SpeShu.AI. Поэтому перенести такой код на облако сводится к двум значениям: адрес сервера и ключ. Модели, железо и локальный сервер больше не нужны.
От SpeShu.AI ollama-llm получает ровно две вещи: base_url = "https://speshu.ai/api/v1" и API-ключ. Больше ничего настраивать не нужно — ни allowlist моделей, ни параметров провайдера, ни плагинов. Любой клиент, умеющий говорить с OpenAI-совместимым адресом, подключается одним аргументом.
Совместимость у ollama-llm двухуровневая, и путать уровни — источник почти всех проблем на этой странице. Слой /v1 (OpenAI-совместимый) у Ollama есть, и именно он работает с SpeShu.AI. Родной протокол (POST /api/chat, POST /api/generate, GET /api/tags, POST /api/embed) — это совсем другой API, и на /api/v1 SpeShu.AI его не отдаёт: запрос уйдёт и вернёт 404. Если ваш код уходит в ollama.Client(host=...) — перепишите его на OpenAI-клиент, см. раздел «Конфигурация».

Установка

1

Установите пакеты

OpenAI-совместимый слой — это обычный OpenAI-клиент:
Родной клиент Ollama (pip install ollama, from ollama import Client) в код генерации не входит — он нужен только для варианта с локальными эмбеддингами из раздела «Эмбеддинги».
2

Задайте ключ

Ключ создаётся на speshu.ai/profile и показывается один раз. Подробности — в разделе Аутентификация.
3

Возьмите идентификатор модели из каталога

Идентификатор текстовой модели не зашивайте в код: состав каталога меняется, и зашитый в код идентификатор падает с 404 model_not_found. Возьмите его из GET /api/v1/models:
cURL
В коде ниже это переменная окружения SPESHU_MODEL. Формат ответа — в разделе Каталог моделей.

Конфигурация

Схема подключения зеркальна привычной для Ollama. Локально это OpenAI(base_url="http://localhost:11434/v1", api_key="ollama"), где api_key — заглушка, которую локальный сервер не проверяет. Через SpeShu.AI меняются два значения — base_url и api_key, и заглушка превращается в настоящий ключ:
Python
Слэша в конце адреса быть не должно. https://speshu.ai/api/v1/ — вариант хуже неправильного: часть клиентов склеивает его с путём и получает //chat/completions. И суффикс /v1 обязателен: без него клиент соберёт /api/chat/completions и вернёт 404, хотя ключ рабочий.
Если вы добавляли Ollama через обёртку LangChain, поменяйте обёртку, а не адрес. langchain_ollama.ChatOllama говорит с Ollama через его родной клиент, поэтому base_url там не переключает протокол — такая конфигурация уйдёт в /api/chat и вернёт 404. OpenAI-совместимый адрес SpeShu.AI принимает langchain_openai.ChatOpenAI с теми же двумя параметрами:
Python

Первый рабочий пример

Тот же вызов, что и локально, — с блоком system и печатью списания.
Python
usage.cost.total_cost — сумма в рублях, списанная с кошелька. У Ollama такого поля нет: там расход считает сам сервер и наружу не отдаёт. Разбор — в гайде Учёт средств.

Эмбеддинги

Эндпоинта эмбеддингов у SpeShu.AI нет: POST /api/v1/embeddings не существует, и запрос к нему вернёт 404. Это ограничение не обходится настройкой. Два честных варианта:(а) Рекомендуемый. Эмбеддинги считает локальный Ollama, генерацию — SpeShu.AI. Это как раз сильная сторона ollama-llm: POST /api/embed у него есть, работает локально и ничего не стоит. В коде ниже это два независимых конфига, и смена любого из них не затрагивает другой.(б) Без эмбеддингов вовсе. Локальный стек остаётся источником контекста, а отбор фрагментов делаете вы сами — по метаданным, по имени файла, по дате. Это обычный чат с документами, и он целиком работает на одном ключе SpeShu.AI.
Вариант (а): два клиента в одном процессе.
Python
Метод Client.embed и поле embeddings в ответе появились в ollama 0.3.x; в более ранних версиях был embeddings(model=..., prompt=...) с одиночной строкой. Проверьте версию, если поднимаете окружение с нуля.

Продвинутые сценарии

Потоковый ответ

stream=True на chat.completions.create — единственный способ обойти потолок запроса в 300 секунд: поток идёт до 15 минут. На OpenAI-совместимом слое приходит обычный SSE с data:-кадрами, поэтому клиент разбирает его сам, без участия Ollama:
Python
Разбор кадров, маркер [DONE] и кадр со списанием — в разделе Потоковая передача.

Вызов функций

tools и tool_choice уходят без изменений: схема инструмента та же. Один нюанс миграции — локально вы могли полагаться на то, что конкретная open-weight модель всегда поддерживает вызовы инструментов; в каталоге SpeShu.AI моделей много, и поддержка неодинаковая.
Python
Полный цикл вызова — в разделе Вызов функций.

Структурированный вывод

response_format с JSON Schema переезжает как есть. Локально строгий режим часто приходилось обходить парсингом текста — здесь этого не нужно.
Python
Поддержка json_schema зависит от модели — не все её принимают. Разбор и запасные варианты — в разделе Структурированный вывод.

Генерация изображений

У Ollama нет эндпоинта генерации изображений, поэтому в его API этот сценарий не появится. Медиа-задачи на SpeShu.AI создаются отдельным эндпоинтом и от вашего LLM-клиента не зависят: Создание задачи.
cURL
Оплата списывается при создании задачи, а не при успешном результате: повтор с тем же Idempotency-Key вернёт исходную задачу, с новым — создаст новую и спишет снова.

Частые проблемы

Проверьте адрес: должно быть https://speshu.ai/api/v1 — с /api в середине и /v1 на конце. Без суффикса /v1 клиент собирает путь /api/chat/completions и получает 404, хотя ключ при этом рабочий.
https://speshu.ai/api/v1/ — вариант хуже неправильного: часть клиентов склеивает его с путём и получает //chat/completions. Не пишите слэш в конце.
Родной протокол Ollama — /api/chat, /api/generate, /api/tags — на SpeShu.AI не отдаётся, и ответ всегда 404, независимо от ключа. Замените клиент на OpenAI-совместимый с base_url, как в разделе «Конфигурация».
Это остаток от локального сервера: в коде осталось api_key="ollama". У SpeShu.AI ключ проверяется — подставьте os.environ["SPESHU_API_KEY"] и убедитесь, что в переменной полное значение с префиксом sk-, без кавычек и переносов строк.
Идентификатор зашит в код и разошёлся с каталогом — состав меняется, и зашитое значение устаревает молча. Возьмите его заново из GET /api/v1/models и держите в SPESHU_MODEL.
Отдельного эндпоинта для потока нет: это параметр stream=True на chat.completions.create. Формат кадров и разбор — в разделе Потоковая передача.
Полная таблица кодов и три формата ошибок API — на странице Ошибки, таймауты и квоты — в разделе Лимиты.

Что дальше

Начало работы

Ключ, баланс и первый запрос целиком

Модели и цены

Как выбрать модель под задачу

Вызов функций

Полный цикл вызова инструмента

Медиаввод

Ссылки, base64 и хранилище