The post has been translated automatically. Original language: Russian
LlamaIndex 0.14.25, a Python framework for RAG systems and AI agents, was released on September 21. There are almost no major new features in it, but there is a fix that is important for everyone who gives agents tools with side effects, the return of broken streaming output and a large-scale dependency cleanup: more than one and a half hundred ecosystem packages have been updated.
The agent's tool is no longer called twice.
The main kernel edit concerns the call_tool and acall_tool methods. Previously, with any exception, they repeated the FunctionTool call — in fact, they went over the ways of passing arguments: first in one way, in case of an error in another. The developers explicitly describe the risk: the tool can perform an irreversible action (debit money, send an email, write a string to the database), and then crash with a business error or network error - and then the action will be performed a second time.
Now the method of passing arguments is determined in advance, by the signature of the wrapped function, before the call. Functions with named parameters only still receive named arguments, functions with positional parameters only receive a single positional value, and the behavior for other tool implementations has not changed. A dropped tool simply returns an error, without repeating it.
Streaming output and other kernel fixes
- The Refine and CompactAndRefine response synthesis modes return the response in a stream. Starting with version 0.14.22, their stream collapsed into one fragment, and the user saw the entire answer only at the very end.
- StructuredLLMRerank has received native asynchronous support.
- Metadata replacement is correctly rolled back to the original value if the target value is None.
- Outdated ipex-llm and optimum-intel IPEX integrations have been removed from the kernel.
Integration edits
- AG-UI protocol (package version 0.5.0): The results of frontend tools are no longer stored on the server. In the 0.3.x branch, the server recorded them in the chat history, the client received a tool call with the result already attached and, according to the protocol contract, did not execute it — the handlers on the frontend simply did not work.
- OpenAI (0.8.1): Images and files in the tool results via the Responses API are no longer lost.
- Google GenAI (0.11.2): Fixed Gemini tool call IDs, images in function responses are preserved.
Vulnerable dependencies and Python 3.10
Most of the release is working with dependencies. Dozens of packages have been updated as part of the general "close a lot of security warnings" edit, 93 manifests have been re-fixed due to hung Dependabot warnings. The four manifests have the minimum Python version raised from 3.9 to 3.10: while 3.9 was supported, the uv package manager kept separate dependency resolution branches with old vulnerable versions nltk, pillow, aiohttp, urllib3 and cryptography. This edit alone removed 165 warnings, and their total number in the repository decreased from 528 to 363.
What does this mean in practice?
If your agents have tools that change something in the outside world — payments, orders, notifications, database entries —updating should be a priority. Check the logs for suspicious duplicates of operations. And regardless of the version of the framework, make such tools idempotent — with an operation key or an "already completed" check, because repetitions happen at other levels: the network, the queue, the model itself.
When updating, keep in mind that many integration packages have received a new minor version. If the versions are fixed in the project, you will have to rebuild the lock file and run the tests. For those who are still on Python 3.9, it's time to plan the transition: some packages no longer support it. If you used ipex-llm or optimum-intel IPEX via LlamaIndex, these integrations have been removed. And if the Refine streaming response in the interface came in one piece, it wasn't your code — after the update, the stream should return.
The draft text was prepared with the participation of AI, the facts were checked against the original source — the official release notes and the LlamaIndex project changelog on GitHub
21 сентября вышел LlamaIndex 0.14.25 — релиз Python-фреймворка для RAG-систем и ИИ-агентов. Новых крупных функций в нём почти нет, зато есть исправление, важное для всех, кто даёт агентам инструменты с побочными эффектами, возврат сломанного потокового вывода и масштабная чистка зависимостей: обновлено больше полутора сотен пакетов экосистемы.
Инструмент агента больше не вызывается дважды
Главная правка ядра касается методов call_tool и acall_tool. Раньше при любом исключении они повторяли вызов FunctionTool — по сути, перебирали способы передачи аргументов: сначала одним способом, при ошибке другим. Разработчики прямо описывают риск: инструмент может выполнить необратимое действие (списать деньги, отправить письмо, записать строку в базу), а потом упасть с бизнес-ошибкой или ошибкой сети — и тогда действие выполнится второй раз.
Теперь способ передачи аргументов определяется заранее, по сигнатуре обёрнутой функции, до вызова. Функции только с именованными параметрами по-прежнему получают именованные аргументы, функции только с позиционными — одно позиционное значение, поведение для остальных реализаций инструментов не изменилось. Упавший инструмент просто возвращает ошибку, без повтора.
Потоковый вывод и другие исправления ядра
- Режимы синтеза ответа Refine и CompactAndRefine снова отдают ответ потоком. Начиная с версии 0.14.22 поток у них схлопывался в один фрагмент, и пользователь видел ответ целиком только в самом конце.
- StructuredLLMRerank получил нативную асинхронную поддержку.
- Замена метаданных корректно откатывается к исходному значению, если целевое значение равно None.
- Из ядра удалены устаревшие интеграции ipex-llm и optimum-intel IPEX.
Правки интеграций
- Протокол AG-UI (версия пакета 0.5.0): результаты фронтенд-инструментов больше не сохраняются на сервере. В ветке 0.3.x сервер записывал их в историю чата, клиент получал вызов инструмента с уже прикреплённым результатом и, по контракту протокола, не исполнял его — обработчики на фронтенде просто не срабатывали.
- OpenAI (0.8.1): изображения и файлы в результатах инструментов через Responses API больше не теряются.
- Google GenAI (0.11.2): исправлены идентификаторы вызовов инструментов Gemini, изображения в ответах функций сохраняются.
Уязвимые зависимости и Python 3.10
Большая часть релиза — работа с зависимостями. Десятки пакетов обновлены в рамках общей правки «закрыть массу предупреждений безопасности», 93 манифеста перезафиксированы из-за зависших предупреждений Dependabot. У четырёх манифестов минимальная версия Python поднята с 3.9 до 3.10: пока поддерживалась 3.9, менеджер пакетов uv держал отдельные ветки разрешения зависимостей со старыми уязвимыми версиями nltk, pillow, aiohttp, urllib3 и cryptography. Только эта правка сняла 165 предупреждений, а их общее число в репозитории снизилось с 528 до 363.
Что это значит на практике
Если у ваших агентов есть инструменты, которые что-то меняют во внешнем мире — платежи, заказы, уведомления, записи в базу, — обновление стоит поставить в приоритет. Проверьте логи на подозрительные дубли операций. И независимо от версии фреймворка делайте такие инструменты идемпотентными — с ключом операции или проверкой «уже выполнено», потому что повторы случаются и на других уровнях: сеть, очередь, сама модель.
При обновлении учтите, что многие пакеты интеграций получили новую минорную версию. Если в проекте версии зафиксированы жёстко, придётся пересобрать lock-файл и прогнать тесты. Тем, кто ещё на Python 3.9, пора планировать переход: часть пакетов его уже не поддерживает. Если вы пользовались ipex-llm или optimum-intel IPEX через LlamaIndex, эти интеграции удалены. А если потоковый ответ Refine в интерфейсе приходил одним куском, это был не ваш код — после обновления поток должен вернуться.
Черновик текста подготовлен с участием ИИ, факты сверены с первоисточником — официальные release notes и журнал изменений проекта LlamaIndex на GitHub