Гайд · TNWS AI
Как выгрузить модель из памяти через Ollama API и keep_alive: 0
Отправляем пустой /api/generate с keep_alive:0, проверяем done_reason:"unload" и подтверждаем освобождение модели через /api/ps.
Что вы настроите и когда это полезно
Практическая задача этого руководства — явно выгрузить конкретную модель из памяти Ollama и проверить результат отдельным запросом состояния. Сценарий полезен не сам по себе, а как часть проверяемого приложения: после выполнения должен существовать машинно проверяемый признак успеха. Мы не оцениваем результат «на глаз» и не подменяем тест красивым ответом модели.
Сведения и названия API сверены 12 сентября 2026 года по официальной документации Ollama API: первоисточник. В статье намеренно нет цен, региональных обещаний и неподтверждённых лимитов: они не требуются для этого сценария. Если ваша установленная версия расходится с документацией, сначала зафиксируйте версию и воспроизведите минимальный пример в отдельном окружении.
Подтверждённый контракт
- Для немедленной выгрузки официальный пример использует пустой
POST /api/generateсkeep_alive:0. - При
stream:falseклиент получает один JSON-объект вместо NDJSON-потока. - Успешный ответ выгрузки содержит
done:trueиdone_reason:"unload". - После операции модель не должна присутствовать среди
modelsответаGET /api/ps. - Выгрузка из памяти не удаляет локальные файлы модели и не равна DELETE модели.
Эти пункты — граница решения. Не расширяйте её предположениями. Например, успешный HTTP-код не всегда означает нужное бизнес-состояние, а наличие строки в ответе не доказывает, что сработал правильный обработчик. В следующих шагах для каждого утверждения есть отдельная проверка.
Что подготовить
- изолированное тестовое окружение, где можно безопасно вызвать описанный API;
- актуальную версию пакета или приложения и возможность посмотреть её локально;
- тестовые данные без секретов, персональных сведений и реальных платёжных реквизитов;
- лог или счётчик, позволяющий отличить модельный вызов, tool execution и локальную проверку;
- автоматический тест, который завершается ненулевым кодом при несовпадении ожидаемых полей.
Не помещайте API-ключи в код, prompt, traceback или публикуемый лог. В примерах, где ключ вообще требуется, он должен поступать из переменной окружения. Для локального Ollama ключ обычно не является частью показанного HTTP-контракта; не добавляйте фиктивную авторизацию.
Пошаговая настройка
- До операции вызовите
/api/psи зафиксируйте, была ли модель резидентна. Это делает тест интерпретируемым. - Отправьте пустой запрос
/api/generateс точнымmodel,keep_alive:0иstream:false. - Проверьте одновременно
done:trueиdone_reason:"unload"; одного HTTP 200 недостаточно. - Повторите
/api/psи убедитесь, что объект с точным именем отсутствует. Не используйте частичное совпадение строки.
После каждого шага сохраняйте не только финальный ответ, но и доказательство: класс ошибки, фактический список элементов, число обращений или поля JSON. Так вы отличите рабочую настройку от случайно удачного ответа.
Минимальный воспроизводимый пример
Скопируйте пример в отдельный файл. Он специально содержит проверки assert или явные throw: при нарушении контракта процесс не должен продолжать работу как будто всё успешно.
const base = "http://localhost:11434";
const model = "llama3.2";
const res = await fetch(base + "/api/generate", {
method: "POST",
headers: {"content-type": "application/json"},
body: JSON.stringify({model, keep_alive: 0, stream: false}),
});
if (!res.ok) throw new Error("unload HTTP " + res.status);
const data = await res.json();
if (data.done !== true || data.done_reason !== "unload") {
throw new Error("not confirmed: " + JSON.stringify(data));
}
const ps = await fetch(base + "/api/ps");
if (!ps.ok) throw new Error("ps HTTP " + ps.status);
const state = await ps.json();
if (state.models.some(item => item.name === model)) {
throw new Error(model + " is still resident");
}
console.log(model + " unloaded from memory, files were not deleted");
Если пример написан на JavaScript, сохраните его как .mjs и запустите современной версией Node.js с глобальным fetch. Python-пример запускайте в том же virtualenv, где установлен тестируемый SDK. Не смешивайте версии из глобального и проектного окружений.
Реалистичный вход и ожидаемый результат
Вход: модель llama3.2, предварительно подтверждённая в /api/ps как загруженная.
Ожидаемый результат: ответ операции содержит done:true, done_reason:"unload"; последующий /api/ps не содержит точного имени. Локальная запись модели при этом остаётся.
Зафиксируйте ожидаемый результат буквально в тесте. Не сравнивайте весь естественно-языковой ответ модели, если контракт выражается типом или отдельным полем. Для недетерминированного текста проверяйте структурный инвариант; для API — HTTP-код и обязательные JSON-поля; для последовательности — порядок событий.
Негативный тест
Уберите keep_alive:0 и отправьте обычный пустой запрос. Проверка done_reason должна не дать назвать его выгрузкой. Отдельно убедитесь, что код нигде не вызывает DELETE /api/delete.
Негативная проверка обязательна: без неё тест может проходить, даже когда нужная ветка ни разу не выполнялась. Один и тот же тестовый стенд должен уметь показать как успех, так и контролируемое нарушение. Не направляйте негативный сценарий на реальные инструменты с побочными эффектами.
Готовый prompt для ревью
Этот prompt не исполняет настройку вместо кода. Он помогает проверить пропущенные условия после того, как вы приложили конфигурацию и вывод тестов.
Проверь процедуру выгрузки Ollama: есть ли pre-check /api/ps, keep_alive:0, stream:false, проверка done_reason=unload и post-check точного имени. Убедись, что операция не описана как удаление файлов.
Ответ верни таблицей: условие, доказательство из кода или лога, статус PASS/FAIL, минимальное исправление. Не додумывай отсутствующие версии, поля или результаты. Если доказательства нет, ставь FAIL.
Как пользоваться prompt
Добавьте после него ваш минимальный пример и обезличенный лог. Удалите токены, cookie, пути к домашнему каталогу и пользовательские данные. Затем вручную подтвердите каждую ссылку на строку кода: языковая модель может ошибиться и назвать доказательством комментарий, который фактически ничего не проверяет.
Независимая проверка результата
Проверка должна выполняться на двух уровнях. Первый — локальный контракт: функция возвращает правильный тип, JSON содержит точные поля, callback сохраняет порядок. Второй — наблюдаемое состояние системы: модель не была вызвана до валидации, tool не исполнился до approval, либо модель появилась или исчезла в контрольном списке.
Запишите таблицу тестов с колонками «вход», «ожидаемая ветка», «наблюдаемый признак», «фактический результат». Минимум нужны успешный сценарий, намеренно ошибочный сценарий и пограничный ввод. Если есть side effects, используйте fake tool или sandbox. Повторный запуск теста не должен создавать заказ, платёж или удаление.
Не делайте вывод по одному скриншоту интерфейса: он не показывает порядок внутренних событий и быстро устаревает. Предпочтительны вывод unit-теста, сериализованный ответ API и счётчик обращений тестового provider-а.
Типичные ошибки и исправления
Проверяется только отсутствие исключения
Приложение может завершиться без исключения по неправильной ветке. Добавьте проверку точного результата: типа, ключа, done_reason, длины списка или нулевого счётчика вызовов.
Комментарий принимают за гарантию
Фраза «здесь tool не вызывается» ничего не доказывает. Подставьте fake tool, увеличивающий счётчик, и сравните его после запуска. То же относится к model stub и callback.
В тест попадают реальные побочные эффекты
Для approval, retry и восстановления ошибок используйте заглушки. Повторяемый модельный запрос и повторяемый платёжный tool — разные риски. Сначала докажите порядок локально, затем выполняйте ограниченную интеграционную проверку.
Версия молча отличается
Если импорт или поле отсутствует, не заменяйте его похожим названием из старой статьи. Запишите установленную версию, откройте документацию этой версии и либо адаптируйте код осознанно, либо обновите зависимость в отдельной ветке.
Чек-лист финальной проверки
- Задача сформулирована как наблюдаемый результат, а не как «получить хороший ответ».
- Имена классов, параметров, ключей и endpoint сверены с официальным первоисточником 12 сентября 2026 года.
- В коде нет токенов, персональных данных и реальных реквизитов.
- Успешный тест проверяет точный тип, поле, порядок или состояние.
- Негативный тест действительно активирует противоположную ветку.
- Model stub и fake tool считают обращения, если порядок имеет значение.
- Побочные эффекты не повторяются из-за retry или восстановления.
- Логи не используются как единственное доказательство, если доступна программная проверка.
- Ограничения и несовместимость версий описаны явно.
- Перед production-запуском тест повторён в том же окружении зависимостей.
Ограничения
Этот гайд подтверждает конкретный технический контракт, но не качество ответа нейросети, безопасность всей системы и не соответствие вашей организации нормативным требованиям. Настройки SDK и API меняются. Дата проверки указана выше; при обновлении зависимости снова откройте первоисточник и прогоните оба теста.
Также пример не задаёт универсальные таймауты, лимиты денег или объём памяти. Такие числа зависят от инфраструктуры и бизнес-риска. Используйте измерения собственного стенда, но не публикуйте их как свойства продукта без воспроизводимой методики.
FAQ
Нужно ли указывать цену или тариф?
Нет. Для этого сценария цена не меняет проверяемый контракт. Если вы добавляете стоимость в собственную документацию, сверяйте официальный pricing в день публикации и указывайте валюту, единицу тарификации и дату.
Почему нельзя ограничиться ручной проверкой?
Ручной результат легко принять за успех неправильной ветки. Автоматический assert или throw повторяем и обнаруживает регрессию после обновления SDK, модели или сервера.
Что сохранять в CI?
Сохраняйте статус теста, обезличенные обязательные поля и версии зависимостей. Не сохраняйте prompt с секретами, полный пользовательский диалог или токен авторизации.
Что делать при расхождении с документацией?
Сначала воспроизведите минимальный пример без фреймворка приложения. Зафиксируйте версию и полный текст ошибки без секретов. Затем проверьте документацию именно этой версии; не маскируйте расхождение универсальным try/except.
Первоисточник
- Официальная документация Ollama API — проверено 12 сентября 2026 года.
Читайте также
Как использовать raw mode в Ollama /api/generate без двойного шаблона
Передаём готовый шаблон prompt с raw:true, отключаем автоматическое форматирование и проверяем отсутствие context в ответе raw mode.
Как квантовать FP16-модель через Ollama API /api/create
Создаём отдельный q4_K_M-вариант из FP16-модели, проверяем progress, финальный success и не перезаписываем исходное имя.
Как подключить LoRA adapter при создании модели через Ollama API
Загружаем adapter как blob, передаём словарь adapters в /api/create, проверяем success и сохраняем базовую модель без изменений.
Комментарии
Пока тихо. Скажите первое слово