llm releases 0.32a3 for command-line model access
Simon Willison released llm 0.32a3 on June 9, 2026, a pre-release alpha of the popular Python CLI and library for accessing large language models, per the project changelog at llm.datasette.io. The release focuses on human-in-the-loop tool-calling improvements, driven by Datasette Agent's ask_user() feature. Key additions: tools can declare an llm_tool_call parameter to receive the ToolCall object for the current invocation (including tool_call_id); every tool call now gets a guaranteed unique tool_call_id with a tc_-prefixed ULID synthesized for providers that do not supply one; a new llm.PauseChain exception cleanly pauses a tool chain mid-execution for human approval or external input; and chains can now resume from a messages= history ending in unresolved tool calls, executing pending calls through the normal before_call/after_call machinery before the first model call. A bug where the async tool executor silently dropped calls to tools not present in the tools= list is also fixed.
What happened
Simon Willison released llm 0.32a3 on June 9, 2026, per the project changelog. This is a pre-release alpha of the 0.32 series of llm, his open-source Python CLI and library for accessing large language models from the command line. The 0.32 series introduced a major backwards-compatible refactor of how prompt inputs and response outputs are represented; 0.32a3 extends that foundation with human-in-the-loop tool-calling capabilities, driven by the needs of Datasette Agent's ask_user() feature.
What changed in 0.32a3
Four improvements to tool-calling were added in this release, per the changelog:
- •Tools can now declare a parameter named llm_tool_call to receive the llm.ToolCall object for the current invocation. This gives the tool access to the current tool_call_id, useful for tracking calls in multi-step agent workflows.
- •Every tool call is now guaranteed a unique tool_call_id. For providers that do not supply one, the library synthesizes a tc_-prefixed ULID, ensuring consistent identification across providers.
- •A new llm.PauseChain exception can be raised by any tool to cleanly pause the tool chain. The exception propagates to the caller with the ToolCall and completed sibling results attached, without making a model call with a placeholder result. This enables workflows that gate on human approval before a chain continues.
- •Chains can now resume from a messages= history that ends in unresolved tool calls. The pending calls are executed through the normal before_call/after_call hooks before the first model call, and calls that already have results are skipped.
A bug was also fixed: the async tool executor previously silently dropped calls to tools not present in tools=; they now return an error result matching the behavior of the sync executor.
Context
The 0.32 series introduced Message objects containing typed Part objects (text, reasoning, tool calls, tool results, attachments) and support for the OpenAI Responses API in 0.32a2, enabling interleaved reasoning across tool calls for GPT-5 class models. llm is widely used by data practitioners and developers who need a scriptable, provider-agnostic interface to LLM APIs for automation, CI integration, and prompt prototyping. The 0.32a3 release is a pre-release alpha; the stable 0.32 release has not yet been published.
Scoring Rationale
A meaningful alpha release of a widely used practitioner CLI - the PauseChain and chain-resume additions are substantive improvements for agentic workflows requiring human-in-the-loop control. Rates as a solid tools update relevant to data/ML practitioners building with multi-step LLM pipelines, below mid-tier funding or model releases.
Practice with real Health & Insurance data
90 SQL & Python problems · 15 industry datasets
250 free problems · No credit card
See all Health & Insurance problems


