LLM 0.32: как консольный инструмент Саймона Уиллисона превратился в агентный фреймворк
Simon Willison выпустил LLM 0.32 с reasoning traces, server-side тулами OpenAI и Anthropic, новым Python API и content-addressable логами. Как обновиться и что попробовать.

Саймон Уиллисон выпустил LLM 0.32 — самое крупное обновление своей CLI-утилиты для работы с языковыми моделями с момента запуска проекта. Если вы гоняете промпты через llm в терминале или используете его как Python-библиотеку, в этом релизе появилось достаточно причин обновиться прямо сегодня: видимые reasoning traces, серверные тулы от OpenAI и Anthropic, новый способ работать с историей сообщений и полностью переработанное логирование.
Разберём, что конкретно изменилось и как этим пользоваться, без пересказа всего changelog.
Что видно сразу: reasoning traces в терминале
Когда вы запускаете llm против reasoning-модели (той, что умеет "думать" перед ответом), теперь весь процесс рассуждения выводится в stderr. Это удобно: вы видите, что модель "думает", но этот текст не попадает в stdout, который вы, возможно, пайпите дальше в другой инструмент.
Если reasoning trace мешает — например, при отладке пайплайна — отключить его можно флагом:
``bash llm "объясни теорему Байеса" -R ``
или через полную форму --hide-reasoning.
Заодно в LLM из коробки добавили поддержку семейства моделей GPT-5.6, и модель по умолчанию для llm "prompt" теперь — GPT-5.6 Luna, дешёвая, но достаточно способная модель.
Server-side тулы: код, поиск и MCP без своей инфраструктуры
Главная фича релиза — доступ к инструментам, которые выполняются на стороне провайдера, а не локально. OpenAI, например, даёт среду для выполнения кода прямо как server-side tool:
``bash llm --tool CodeInterpreter 'Show current python and SQLite versions' ``
Модель сама решает, когда вызвать интерпретатор, выполняет код на серверах OpenAI и возвращает результат — вам не нужно поднимать sandbox локально. У OpenAI также появился WebSearch-тул для запросов к актуальной информации в вебе.
Отдельно вышло обновление плагина llm-anthropic (версия 0.26) с поддержкой семейства моделей Claude 5 и четырёх server-side тулов: WebSearch, WebFetch, CodeExecution и AnthropicMCP. Последний особенно интересен — он позволяет Claude выполнять вызовы к произвольному MCP-серверу (Model Context Protocol) прямо внутри одного запроса к API:
``bash llm -m claude-sonnet-5 -T 'AnthropicMCP("https://datasette.simonwillison.net/-/mcp")' \ 'how many rows in the blog_blogmark table?' ``
Здесь Anthropic сам обращается к MCP-серверу автора (плагин datasette-mcp) и получает нужные данные без промежуточных шагов на вашей стороне.
Новая команда для любых OpenAI-совместимых эндпоинтов
В релизе появилась команда llm openai endpoint — одностроковый способ отправить промпт на любой сервер, который говорит на языке OpenAI API. Такие запросы не логируются, что делает команду удобной для разовых экспериментов.
Пример: прогнать промпт через локальную модель Gemma 4 12B в LM Studio, используя uvx (без установки LLM) и подключив тул-плагин llm-tools-quickjs:
``bash uvx --with llm-tools-quickjs \ llm openai endpoint http://localhost:1234/v1 -m google/gemma-4-12b \ -T QuickJS 'Use QuickJS to multiply 3434 * 2434' --td ``
Это удобно проверять локальные модели или любые OpenAI-совместимые сервисы без постоянной установки LLM в проект.
Python API: сообщения списком и потоковые события
Раньше Python API LLM заставлял создавать conversation-объект и по одному отправлять в него сообщения — абстракция, которая скрывала реальную природу LLM: каждый запрос несёт полную историю переписки. В сложных сценариях это начало мешать.
В 0.32 появился параметр messages у model.prompt():
```python import llm from llm import user, assistant, system
model = llm.get_model("gpt-5.6-luna") response = model.prompt(messages=[ system("You are a helpful pirate."), user("What is the capital of France?"), assistant("Paris, matey."), user("And Germany?"), ]) print(response.text()) ```
Второе изменение важнее. Раньше prompt() возвращал просто поток строк — это работало, пока модели отвечали чистым текстом. Сегодня многие модели вперемешку отдают reasoning-текст, обычный текст, вызовы тулов и даже изображения. Для этого добавили stream_events():
``python for event in model.prompt("Explain cats").stream_events(): if event.type == "reasoning": print(f"[thinking] {event.chunk}", end="", flush=True) elif event.type == "text": print(event.chunk, end="", flush=True) else: print(f"Other event: {event}") ``
Такая структура событий легла в основу нового плагина llm-chat-completions-server, который реализует полноценный OpenAI chat completions API поверх LLM:
```bash llm install llm-chat-completions-server llm chat-completions-server --port 9000
Сервер поднимается на http://127.0.0.1:9000/v1
```
После этого можно слать запросы обратно через llm openai endpoint:
``bash llm openai endpoint http://127.0.0.1:9000/v1 'hello' -m gpt-5.4-mini ``
Логи по образцу Git
Паттерн, где каждый следующий запрос дописывает всю историю сообщений, создаёт проблему логирования: дублировать одинаковый JSON на каждом ходу — расточительно. Решение — content-addressable message store, устроенный по аналогии с Git: сообщения хранятся по хэшу содержимого, а не копируются заново.
Команды llm logs и llm logs --json умеют разворачивать эту структуру обратно в привычный, читаемый формат, так что для повседневного использования ничего не меняется — экономия происходит "под капотом".
Где ломается и на что обратить внимание
Существующие плагины продолжат работать без правок. Но если плагин добавляет собственные модели, его придётся обновить до версии, совместимой с 0.32, чтобы он участвовал в новой системе потоковых событий — иначе reasoning traces и структурированные ответы из таких моделей корректно не отобразятся.
Не все плагины успели обновиться одновременно с релизом ядра: llm-gemini, llm-openrouter и llm-mistral автор описывает как "почти готовые", релизы на подходе. Если вы завязаны на эти провайдеры, стоит проверить версии перед апгрейдом продакшен-пайплайнов.
Что попробовать дальше
Начните с малого: обновите LLM, запустите любимый промпт с -R и без него, чтобы увидеть разницу в reasoning traces. Затем попробуйте --tool CodeInterpreter на задаче, где раньше приходилось поднимать локальный sandbox. Если работаете с Python API — перепишите один существующий скрипт на stream_events(), это откроет доступ к структурированным ответам моделей, которые раньше приходилось парсить руками.
Автор прямо признаёт: LLM постепенно превращается в агентный фреймворк. Многие низкоуровневые изменения в этом релизе продиктованы нуждами его же проекта Datasette Agent — цепочки тулов теперь умеют приостанавливаться для одобрения человеком и возобновляться из сохранённой истории сообщений. Если вы собираете собственных агентов поверх LLM, это тот релиз, который стоит изучить внимательно.
Источники
Читайте также
Комментарии
Пока никто не написал. Будьте первым.


