Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/simonw/LLM/llms.txt

Use this file to discover all available pages before exploring further.

LLM follows a rolling release model — stable releases ship as numbered versions, and alpha releases (marked a0, a1, …) carry in-progress features. Below are the most recent releases with their full detail. For the complete release history, see the GitHub Releases page.

0.32a3 — 2026-06-09

Driven by the needs of Datasette Agent’s human-in-the-loop ask_user() feature, this release improves how tool calls work:
  • llm_tool_call parameter: Tool implementations can declare a parameter named llm_tool_call to receive the llm.ToolCall object for the current invocation, giving access to llm_tool_call.tool_call_id. (#1480)
  • Guaranteed unique tool_call_id: Providers that do not supply a tool call ID now receive a synthesized tc_-prefixed ULID. (#1481)
  • llm.PauseChain exception: Tools can raise llm.PauseChain to cleanly pause the tool chain — useful for human-in-the-loop approval flows. The exception propagates with .tool_call and .tool_results attached. (#1482)
  • Concurrent tool failure semantics: Async sibling tool calls always run to completion before a pause or hook exception propagates. (#1482)
  • Resume chains from unresolved tool calls: Chains can now resume from a messages= history ending in unresolved tool calls. execute_tool_calls() also accepts a new tool_calls_list= argument. (#1482)
  • Bug fix: The async tool executor no longer silently drops calls to tools not in tools= — they now return Error: tool "..." does not exist, matching the sync executor. (#1483)

0.32a2 — 2026-05-12

Support for the OpenAI Responses API

Most reasoning-capable OpenAI models now use the /v1/responses endpoint instead of /v1/chat/completions, enabling interleaved reasoning across tool calls for GPT-5 class models. (#1435)
  • New Responses and AsyncResponses model classes. The existing Chat and AsyncChat classes are unchanged.
  • Models now using the Responses API by default: o1, o3-mini, o3, o4-mini, gpt-5, gpt-5-mini, gpt-5-nano, gpt-5.1, gpt-5.2, gpt-5.4, gpt-5.4-mini, gpt-5.4-nano, gpt-5.5 (plus pinned date variants).
  • Use -o chat_completions 1 to fall back to /v1/chat/completions for any of these models.
  • Encrypted reasoning items are captured as provider_metadata and round-tripped on subsequent turns.
  • Reasoning summaries are requested with "summary": "auto" so visible reasoning text streams back unless --hide-reasoning is set.

CLI

  • New llm -m model --options flag to list the options supported by a given model. (#1441)
  • The -R/--no-reasoning option has been renamed to -R/--hide-reasoning.

Python API

  • New hide_reasoning=True keyword argument on model.prompt(), conversation.prompt(), model.chain(), and their async counterparts. (#1442)
  • New options= dict keyword argument on Model.prompt(), Conversation.prompt(), Response.reply(), and their async equivalents. (#1432)

Bug fix

  • add_tool_call() calls not recorded as stream events are now correctly emitted as ToolCallPart objects and survive response.to_dict() serialization. (#1433)

0.32a1 — 2026-04-29

  • Fixed a bug in 0.32a0 where tool-calling conversations were not correctly reinflated from SQLite. (#1426)

0.32a0 — 2026-04-28

A major backwards-compatible refactor introducing structured messages and streaming events. See the annotated release notes for full context.
  • New llm.Message value type and constructor helpers: llm.user(), llm.assistant(), llm.system(), llm.tool_message().
  • New messages= keyword argument on model.prompt(), conversation.prompt(), model.chain(), and their async counterparts.
  • New response.stream_events() and response.astream_events() yielding typed StreamEvent objects ("text", "reasoning", "tool_call_name", "tool_call_args", "tool_result").
  • New response.messages() / await response.messages() returning the assembled list[Message] produced by the model.
  • New response.reply(prompt=None, **kwargs) to continue a conversation from any Response.
  • New response.to_dict() and Response.from_dict(data, *, model=None) for full round-trip JSON serialization of a conversation turn.
  • New llm/serialization.py module with TypedDicts: MessageDict, PartDict, ResponseDict, PromptDict, UsageDict, AttachmentDict.
  • llm prompt and llm chat now display visible reasoning text to stderr in a dim style while streaming.
  • New -R/--hide-reasoning flag for llm prompt and llm chat.
  • llm logs now renders reasoning under a ## Reasoning heading above the response.
  • New reasoning column on the responses table in the logs database.

0.31 — 2026-04-24

  • New GPT-5.5 OpenAI model: llm -m gpt-5.5. (#1418)
  • New -o verbosity low option for setting the text verbosity level for GPT-5+ models. Values: low, medium, high.
  • New -o image_detail low option for image detail level for OpenAI vision models.
  • Models listed in extra-openai-models.yaml are now also registered as asynchronous. (#1395)

0.30 — 2026-03-31

  • The register_models() plugin hook now takes an optional model_aliases parameter listing all registered models and aliases so far. A plugin with @hookimpl(trylast=True) can use this to avoid conflicts. (#1389)
  • Added docstrings to public classes and methods, now included directly in the documentation.

0.29 — 2026-03-17

  • The -t/--template option now works correctly with -x/--extract and --xl/--extract-last.
  • llm logs now shows additional model options in its Markdown output. (#1322)
  • New OpenAI models: gpt-5.4, gpt-5.4-mini, gpt-5.4-nano. (#1376)

0.28 — 2025-12-12

  • New OpenAI models: gpt-5.1, gpt-5.1-chat-latest, gpt-5.2, gpt-5.2-chat-latest. (#1300, #1317)
  • LLM now requires Python 3.10 or higher. Python 3.14 is now covered by tests.
  • URL fragments (llm -f URL) now send a custom user-agent: llm/VERSION (https://llm.datasette.io/). (#1309)
  • Fixed a bug where fragments were not correctly registered with their source when using llm chat. (#1316)
  • Fixed some file descriptor leak warnings. (#1313)
  • Fixed a deprecation warning for asyncio.iscoroutinefunction.
  • Type annotations added for the OpenAI Chat, AsyncChat, and Completion execute() methods. (#1315)
  • The project now uses uv and dependency groups for development. (#1318)

0.27.1 — 2025-08-11

  • llm chat -t template now correctly loads tools included in that template. (#1239)
  • Fixed a bug where saving a template containing reasoning_effort produced invalid YAML. (#1237)
  • Fixed a bug where llm chat -t template could cause prompts to be duplicated. (#1240)
  • Less confusing error message if a requested toolbox class is unavailable. (#1238)

0.27 — 2025-08-11

This release adds support for the GPT-5 family of models and enhances tool calling, including allowing templates to bundle pre-configured tools.
  • New models: gpt-5, gpt-5-mini, gpt-5-nano. (#1229)
  • Templates can now include a list of tools — named tools from plugins or inline Python function blocks. (#1009)
  • Tools can now return attachments (e.g. images) for models that support vision input. (#1014)
  • New Toolbox methods: .add_tool(), .prepare(), .prepare_async(). (#1111)
  • New model.conversation(before_call=x, after_call=y) for registering tool call lifecycle callbacks. (#1088)
  • Plugins can record the resolved model ID via response.set_resolved_model(model_id). (#1117)
  • Raising llm.CancelToolCall now cancels only the current call and passes an error to the model. (#1148)
  • New -l/--latest option for llm logs -q searchterm to sort results by date. (#1177)
  • Fix for various streaming function response format bugs in OpenAI-compatible models. (#1218)
  • register_embedding_models hook is now documented. (#1049)
  • Show stack trace for llm templates show invalid-template-name. (#1053)
  • Handle invalid tool names more gracefully in llm chat. (#1104)
  • Add -h for --help for all llm CLI commands. (#1134)

0.26 — 2025-05-27

Tool support has arrived! LLM can now expose Python functions as tools that models can call while generating a response.
llm --functions '
def multiply(x: int, y: int) -> int:
    """Multiply two numbers."""
    return x * y
' 'what is 34234 * 213345'
  • Two built-in default tools: llm_version() and llm_time(). (#1096, #1103)
  • llm.get_key() is now a documented utility function. (#1094)
  • New tool_instances table in the database records details of Toolbox instances. (#1089)
  • Switched to monotonic ULIDs for response IDs. (#1099)

0.25 — 2025-05-04

  • Fragment loaders can now return a mixture of fragments and attachments. (#972)
  • New OpenAI models: gpt-4.1, gpt-4.1-mini, gpt-41-nano, o3, o4-mini.
  • New environment variables: LLM_MODEL and LLM_EMBEDDING_MODEL. (#932)
  • New llm fragments loaders command. (#941)
  • llm chat now includes a !edit in-session command. (#969)

0.24 — 2025-04-07

Major release adding fragments for long-context prompts and improved template support.
  • New fragments feature: assemble prompts from URLs, file paths, or stored fragments. Stored de-duplicated to avoid wasting space. (#617)
  • register_template_loaders() and register_fragment_loaders() plugin hooks. (#809, #886)
  • llm fragments family of commands for browsing stored fragments.
  • Templates can now store default model options, attachments, and use $URL as a source. (#845, #826, #856)
  • New llm models options family of commands for per-model default options. (#829)
  • LLM_RAISE_ERRORS=1 environment variable for dropping into a debugger on prompt errors. (#817)
  • OpenAI models now accept PDF attachments. (#834)

This page covers the most recent releases. For the complete version history going back to 0.1, visit the GitHub Releases page or view the full changelog on GitHub.

Build docs developers (and LLMs) love