Dev48
ЯЗЫК
  • О нас
  • Услуги
  • Индустрии
  • Технологии
  • Статьи
  • Контакты
Забронировать звонок
    Главная/Статьи/Chto novogo v localai 49
Dev48
info@dev48.org+375 29 320-40-96WhatsApp@isky_by

© 2026 · Все права защищены.

Что нового в LocalAI 4.9

Источник: LocalAI•27 сентября 2026 г. в 16:23

Что нового в LocalAI 4.9

LocalAI — это ИИ-движок с открытым исходным кодом. Запускайте любые модели (LLM, мультимодальные, аудио, изображения и видео) на любом оборудовании. GPU не требуется.

Вышла LocalAI 4.9.0 — спустя тринадцать дней и после слияния 146 пул-реквестов. Новых движков на этот раз нет. Работа была сосредоточена на том, что LocalAI уже умеет делать, и одно из изменений касается исправления безопасности, с которым стоит ознакомиться перед обновлением.

В полном списке изменений перечислены все пункты. В этом посте рассматриваются те части, которые меняют вашу повседневную работу, с указанием номеров пул-реквестов, чтобы вы могли изучить различия (diff).

Прочтите это перед обновлением: маршруты теперь по умолчанию заблокированы

До этого выпуска промежуточное ПО (middleware) аутентификации определяло, что защищать, сопоставляя префиксы путей. Маршрут, путь которого отсутствовал в этом списке, был общедоступным.

Это работает ровно до тех пор, пока у маршрута не появится псевдоним. /mcp/chat/completions, /moderations, /models, /backends и /import-model — все они существовали без префикса, который искал классификатор, поэтому глобальная аутентификация к ним не применялась. Любой маршрут, добавленный позже, по умолчанию наследовал ту же проблему, поскольку отсутствие в списке защищенных префиксов — это состояние, в котором легко оказаться.

Теперь middleware учитывает методы и блокирует доступ по умолчанию. Маршрут является общедоступным только в том случае, если его метод и путь указаны в явном реестре. Общедоступным остается только то, что должно им быть: инструкции API, GET-маршруты Swagger, хорошо известный документ (well-known document) LocalAI, а также потоки инициализации состояния здоровья (health), входа в систему, OAuth, SPA, ассетов, брендинга и токена регистрации нод. Покрытие для всего роутера проверяется в тестах, поэтому новый маршрут не сможет стать публичным из-за того, что о нем забыли (#11602).

Если вы используете аутентификацию через базу данных или настроенные устаревшие API-ключи, меняются две вещи. Для /version теперь требуются учетные данные. То же самое относится и к URL-адресам, которые LocalAI возвращает для сгенерированных аудио-, изображений, видео- и 3D-ассетов, что означает, что клиенту, запрашивавшему эти URL-адреса анонимно, теперь нужно отправлять ключ. Встроенные развертывания по-прежнему могут открывать узкие префиксы через ApplicationConfig.PathWithoutAuth, а устаревшие флаги исключений GET остаются на месте в качестве явных переопределений совместимости.

Спасибо Наору Яакову (Naor Yaacov) за сообщение об этом типе обхода защиты.

Чат может сжимать собственную историю

Длинный разговор со временем перестает помещаться в контекстное окно, и стандартным решением является отбрасывание самых старых сообщений. В этом выпуске их можно вместо этого сжимать.

Сжатие включается опционально для каждой модели с помощью блока сжатия в конфигурации модели. Когда оно включено, более старые полные диалоги прогоняются через выбранную вами модель LocalAI и заменяются результатом перед инференсом. По умолчанию оно отключено, и для моделей без соответствующей конфигурации ничего не меняется (#11556).

Несколько вещей намеренно оставлено без изменений. Начальные системные промпты и промпты разработчика сохраняются, поэтому промпт безопасности не будет сокращен. Самые свежие сообщения сохраняются. Пары вызовов инструментов и их результатов поддерживаются в целости, поэтому сжатая история никогда не содержит вызов, результат которого пропал. Сжатие запускается после фильтрации PII, а также после инъекций промптов Ассистента и MCP, в том числе на более поздних итерациях MCP, поэтому сжатие видит тот промпт, который фактически был бы отправлен. Схемы инструментов и объем памяти, необходимый для завершения, учитываются с помощью консервативного офлайн-ограничения токенов.

Ответы без потоковой передачи (non-streaming) содержат метаданные сжатия, потоковые ответы передают их в блоке usage, а события сжатия, коэффициенты и длительность экспортируются в виде метрик. Конфигурация прокси-шлюза облака отклоняет сжатие, поскольку LocalAI не может безопасно перезаписывать непрозрачный полезный груз провайдера; режим трансляции (translate mode) работает. Если сжатие завершается с ошибкой в середине уже начавшегося потока, вы получаете встроенную ошибку SSE, за которой следует [DONE], а не усеченный ответ.

У моделей и бэкендов теперь по одной странице

У моделей была галерея и отдельная панель управления в разделе Host. У бэкендов был вложенный вид Host для установленных бинарных файлов. Это означало, что расположение ресурса зависело от того, ищете ли вы его или управляете им, а основные действия находились на уровень глубже, чем нужно.

Теперь /app/models отвечает за «Обзор» (Explore) и «Установленные» (Installed), а /app/backends — за «Каталог» (Catalog) и «Установленные» (Installed). И то и другое сохраняет поиск, состояние фильтров и выбор в URL-адресе, поэтому отфильтрованное представление можно отправить кому-то в виде ссылки. Бэкенды сохраняют свои варианты, сборки для разработки и область целевой ноды. Раздел Explore предлагает действия по установке Open и Manage с учетом возможностей, в то время как деструктивные элементы управления остаются в Installed, где вы уже работаете с тем, что вам принадлежит. Обзор управления (Operate Overview) считывает емкость хоста из общего опроса сводок, который у него уже был, а вложенный пункт назначения Host удален (#11548).

API не изменился. Существующие закладки /app/manage по-прежнему работают благодаря перенаправлению замен, которое сохраняет состояние запросов моделей и бэкендов, содержащееся в них.

Форма импорта скрывала ответ за стрелочкой

Страница импорта получила новую палитру, но сохранила старую компоновку: колонку шириной 760 пикселей, содержащую поле URI, руководство по форматам, десять чипов модальности, девять полей настроек, повторитель пар ключ-значение и редактор YAML, причем кнопка отправки была отделена от формы, которую она отправляла.

Две из ее проблем были простыми багами. Кнопка «Импорт» вообще не имела className, поэтому она обрабатывалась как стандартная кнопка браузера и отображалась в системном стиле с неправильным шрифтом и без рамки фокуса. Рядом с ней класс class="btn btn-primary fas fa-save fa-upload" задавал Font Awesome в качестве собственного семейства шрифтов кнопки, которое текст метки наследовал, в то время как два класса иконок боролись за один псевдоэлемент ::before.

Новая сборка переходит к более широкой компоновке и помещает справочник по форматам рядом с рабочей колонкой. Этот справочник отвечает на единственный вопрос администратора-новичка: что вам разрешено вставлять, и раньше он находился за стрелочкой (chevron), которая по умолчанию была закрыта. При разрешении менее 1024 пикселей он сворачивается в раскрывающийся блок и остается доступным. Поле источника является главным элементом и содержит собственную кнопку «Импорт», что позволило удалить скрытую от ридеров (aria-hidden) кнопку отправки, которая существовала только потому, что реальное действие находилось вне тега <form>. Простой и расширенный режимы исчезли: они совпадали примерно на 80%, и их сохранение означало переключение режимов, ключ в localStorage и диалог «Сохранить/Отбросить/Отменить», единственной задачей которого было защита состояния, которое переключение скрыло бы. На самом деле отличается тип ввода, поэтому теперь это две вкладки: источник или YAML (#11461).

Ошибка со строкой классов не была единичным случаем. Последующая проверка выровила восемь элементов управления в заголовках на семи страницах, где классы двух или трех элементов были объединены в одну строку (#11462).

Модель объемом 35 ГБ, которая казалась сломанной навсегда

На фронтенде с двумя репликами загрузка GGUF-файла размером 35,7 ГБ на недавно добавленный воркер Jetson Thor делала модель недоступной для загрузки из панели оператора. Каждая повторная попытка в интерфейсе воспроизводила эту проблему. Подготовка (staging) при этом все время продвигалась нормально.

Реплика А захватила рекомендательную блокировку (advisory lock) для конкретной модели и начала передачу, которая длилась около двадцати минут. Реплика B получила запрос на ту же модель, заблокировалась на pg_advisory_lock и была завершена через шестьдесят секунд из-за statement_timeout для роли localai:

Здесь объединились две ошибки. Route обернул всю холодную загрузку в advisorylock.WithLockCtx, поэтому блокировка удерживалась во время установки бэкенда, многогигабайтного стейджинга и загрузки чекпоинта. Блокировка существует для того, чтобы две реплики не загружали одну и ту же модель одновременно, и это решение занимает миллисекунды. При этом WithLockCtx переопределял lock_timeout, но не statement_timeout, хотя оба прерывают один и тот же блокирующий вызов. Из-за этого шестидесятисекундный тайм-аут смерти стал скрытым для каждой advisory-блокировки в кодовой базе, а не только для этой.

Теперь холодные загрузки выполняются как долговечные задания, поэтому блокировка захватывается и освобождается вокруг проверки на дедупликацию вместо передачи (#11514).

vllm-cpp теперь собирается для карт, отличных от Blackwell

CUDA-образы vllm-cpp собирались для 120a;121a на amd64 и только для 121a на arm64 из десяти архитектур, для которых собирается собственный релизный архив vllm.cpp.

Неуказанная в списке карта не работает медленнее — она падает при первом запросе с сообщением об отсутствии образа ядра для выполнения на устройстве, спустя долгое время после того, как установка бэкендов local-ai через vllm-cpp отчиталась об успехе. Это было обнаружено на ноде Jetson Thor, на которой был установлен бэкенд, но которая ничего не могла обслуживать.

Разделение зависит от наличия кремния. Jetson — только arm64, 87 для Orin и 110 для Thor. Десктопный 120a — только amd64. 90a и 100a присутствуют на обеих платформах из-за компонентов SBSA. Это добавляет A100, A10 и 3090, L4, 4090 и RTX 6000 Ada, H100 и H200, B200, B300, Jetson Orin и Jetson Thor. Защита CUDA 13 теперь охватывает и ветку arm64, а Triton-AOT остается на месте (#11512).

Видео со звуком и синтез речи (TTS) в матрице llama.cpp

В vllm-cpp добавлена поддержка видеомодальности. В C ABI vllm.cpp на версии v12 появился видеокомпонент, и когда конфигурация модели объявляет набор чекпоинтов MiniMax-H3, Load открывает видеодвижок вместо текстового, а GenerateVideo обслуживает существующий в LocalAI эндпоинт /video. Видео и аудио генерируются совместно, поэтому MP4 возвращается с настоящей дорожкой AAC вместо тишины, и если вы запрашиваете речь в промпте, модель синхронизирует ее с губами (#11424).

Есть две детали, о которых стоит знать, если вы будете их искать. H3 — это не каталог моделей: DiT, текстовый энкодер и два VAE являются отдельными артефактами, поэтому parameters.model — это DiT, а остальная часть набора указана в options:. При этом раздел DiT должен быть явно объявлен, а не определяться автоматически, так как комьюнити-квантования удаляют метаданные релиза, а DiT-модели FL2VA и Ref2VA имеют идентичную структуру на диске. Передача эталонного кондиционирования в FL2VA DiT приводит к рендерингу в течение нескольких часов и возврату цветной решетки, поэтому такая комбинация отклоняется до вызова движка. Элементы галереи minimax-h3-fl2va-q4 и minimax-h3-ref2va-q4 устанавливают оба набора.

Отдельно отметим, что Qwen3-TTS теперь работает через бэкенд llama-cpp, что переносит синтез речи на ту же матрицу ускорителей, которая уже поставляется для генерации текста: CUDA, ROCm, SYCL, Vulkan, Metal и L4T, с использованием собственной конвертации GGUF из апстрима. Это реализовано как слотовая задача SERVER_TASK_TYPE_TTS, а не как gRPC-обработчик, управляющий циклом генерации, поскольку server_context владеет llama_context и запускает планировщик слотов в своем собственном потоке, а обработчик, запускающий собственный цикл, создал бы состояние гонки. Серверная обвязка в апстриме пока находится в статусе драфта, поэтому она поставляется в виде патча, который будет удален при слиянии ggml-org/llama.cpp#26603. Элементы галереи: qwen3-tts-llamacpp и qwen3-tts-llamacpp-q4. Существующий бэкенд qwen3-tts-cpp не затронут, так что они работают бок о бок (#11392).

Остальное, вкратце

Контроль доступа по протоколу HTTP теперь осуществляется в масштабе всего процесса, а не для каждого бэкенда по отдельности, что также останавливает рост списка трасс до бесконечности, а работающие операции бэкенда во время их выполнения отображаются со ссылками прямо на их логи (#11560).

PII-мидлвар теперь может восстанавливать то, что он замаскировал. При включенном параметре pii.reverse_in_response замаскированное значение становится уникальным детерминированным псевдонимом внутри запроса, поэтому два адреса читаются как EMAIL_001 и EMAIL_002 там, где раньше они были двумя одинаковыми маркерами [REDACTED:EMAIL], и каждый из них восстанавливается, если бэкенд возвращает его. Восстановление обрабатывает SSE-токены, разделенные между записями ответов. Карта подстановки локальна для запроса и никогда не записывается на диск, а необратимая маскировка по-прежнему остается поведением по умолчанию (#11272).

Материализация снимков Hugging Face теперь скачивает файлы параллельно до заданного лимита, поэтому репозиторий со множеством шардов больше не обрабатывается по одному файлу за раз. Параллельно выполняются только целые файлы, но никогда — их части, поэтому возобновление скачивания (.partial) и проверка SHA для каждого файла работают точно так же, как и раньше, а два вызывающих кода за пределами пути артефактов сохраняют свой последовательный порядок через обертку с лимитом в единицу (#11162).

KNN стал полноценным роутером запросов, а не кэшем для классификатора. classifier: knn голосует на основе сходства по размеченным примерам промптов, поэтому ему не нужна модель классификатора, а знания о метках хранятся в корпусе, который вы наполняете через административный API. Записи ниже knn.similarity_threshold не могут голосовать, и если ни одна из них не преодолевает порог, роутер возвращается к резервному варианту и не занимается угадыванием, при этом nearest_similarity фиксируется в решении в любом случае. Корпус сохраняется в виде одного файла JSONL на каждый роутер в директории <data path>/router-corpus, а записи, сделанные с использованием другой модели встраивания, пересчитывают эмбеддинги при загрузке (#10652).

Реальное время WebRTC теперь можно привязать к одному UDP-порту с помощью LOCALAI_WEBRTC_UDP_PORT, поэтому для контейнера или файрвола требуется одно правило вместо диапазона (#11436). Последующее исправление устранило проблему взаимодействия между этими двумя настройками. LOCALAI_WEBRTC_ICE_INTERFACES молча игнорировался всякий раз, когда был задан порт, поскольку мультиплексор с подстановочными знаками заставляет pion самостоятельно перечислять интерфейсы без фильтра. На хосте с мостами Docker браузеру передавались адреса вроде 172.18.0.1 и подобные, происходило подключение по удачной паре, а затем происходил обрыв, когда проверки согласия ICE завершались неудачей на остальных интерфейсах (#11466).

В двух бэкендах для macOS отсутствовала поддержка Metal. stablediffusion-ggml привязывала свои флаги Metal к переменной OS=Darwin, которую раннер Darwin не определяет, поэтому BUILD_TYPE=metal приводил к сборке без встроенной библиотеки (#11531). parakeet-cpp вообще никогда не передавал BUILD_TYPE=metal в PARAKEET_GGML_METAL; на M1 Air тот же пятиминутный семпл стал обрабатываться за 50,18 секунды вместо 82,57 секунды при идентичном побайтово выводе (#11492).

Когда бэкенд падает, вам теперь сообщают причину. Неожиданный выход из среды выполнения раньше записывал свой stderr только на уровне debug, поэтому при уровне логирования по умолчанию операторы видели код выхода и ничего более; теперь последняя непустая строка stderr добавляется к предупреждению (#11532), а неудачная проверка готовности gRPC сохраняет код выхода процесса вместе с последними 4 КБ диагностических данных (#11447). MCP-серверы уровня моделей больше не исчезают из Чата при сбое обнаружения, из-за чего ранее скрывались проблемы с доступностью DNS контейнера и VPN; они остаются в списке в виде строк с ошибками и прикрепленной причиной (#11495). Несоответствие контрольных сумм после скачивания обрабатывается как временный сбой передачи и повторяется, поэтому устаревший ответ CDN больше не приводит к сбою установки, при этом не проверенные байты по-прежнему отклоняются (#11536).

Веб-интерфейс теперь поддерживает еще два языка: бразильский португальский (полный перевод во всех 14 пространствах имен #11427) и индонезийский для строк административной панели, медиа и навигации (#11493).

Количество записей в галерее увеличилось с 1622 до 1707. Появились модели Qwen3.8 в версиях 9B, 27B, Ridge и малых вариантах, а также Gemma 4 agentic и Scotoma 2, DeepSeek V4 Pro 0813, Ling 3.0 Flash, Nemotron 3.5 Lightning 30B, Tess 4 27B, Ornith 1.0 и 1.5, LFM2.5 в версиях 230M и VL 1.6B, HunyuanOCR, OvisOCR2, Higgs Audio v3 и первое семейство моделей для геномики. В создании этого релиза приняли участие десять человек, трое из них — впервые.

Чтобы обновиться, подтяните localai/localai:latest или перезапустите установочный скрипт, а если вы используете ключи API, сначала ознакомьтесь с разделом аутентификации выше. В полном списке изменений есть все, что не вошло в эту публикацию.

← Все статьи

О чём эта статья

Ещё в разделе «Разработка ПО»

Все →
GDIT запускает новую систему электронных медицинских карт для Индийской службы здравоохранения
General Dynamics

GDIT запускает новую систему электронных медицинских карт для Индийской службы здравоохранения

Как проверить и исправить ваш образ QNX Quick Start Target Image
QNX (BlackBerry)

Как проверить и исправить ваш образ QNX Quick Start Target Image

Доля голоса: что это такое и как ее измерить в 2026 году
Hootsuite

Доля голоса: что это такое и как ее измерить в 2026 году

Как выявление ошибок ИИ-агентов делает их более надежными
Microsoft

Как выявление ошибок ИИ-агентов делает их более надежными

ChatGPT-плагин Brevo: 25 промптов для ваших кампаний
Sendinblue

ChatGPT-плагин Brevo: 25 промптов для ваших кампаний

Мелочи, появившиеся в октябре
Comfy Org

Мелочи, появившиеся в октябре

Ещё от LocalAI

Запуск моделей принятия решений в LocalAI
LocalAI

Запуск моделей принятия решений в LocalAI

parakeet.cpp: тот же транскрипт NeMo, но без Python
LocalAI

parakeet.cpp: тот же транскрипт NeMo, но без Python

Почему мы пишем собственные движки на C и C++
LocalAI

Почему мы пишем собственные движки на C и C++

LocalAI, с марта 2023 года по настоящее время
LocalAI

LocalAI, с марта 2023 года по настоящее время

Что нового в LocalAI 4.8
LocalAI

Что нового в LocalAI 4.8

LocalAI: с марта 2023 года по настоящее время
LocalAI

LocalAI: с марта 2023 года по настоящее время