This release candidate for 0.32 introduces a new database schema for logging prompts and responses that captures full details of the interaction with the underlying LLM, and de-duplicates those records using a content-addressed message store.
Upgrading to this RC will create those new tables and start logging to them. Existing data in the responses table will be left unaffected, and the logs command will read from both old and new tables. New interactions will only be written to the new tables.
You can create a backup of your logs database prior to upgrading using:
llm logs backup logs-backup.db
Changes to SQLite logging
- See the message store documentation for details of the new logging schema.
llm promptlogs are now written to a new set of tables, not the legacy tables.- New documented Response.log_to_db() Python API for writing to a SQLite logs database.
llm logsnow reads both generations of log tables: history recorded by older versions of LLM in the legacyresponsestable is merged into the output alongside new turns, with rows from the dual-write era deduplicated by id. The-m,-c,-f,-T,--toolsand--schemafilters work across both. #1562- Raw provider payloads (the old
prompt_jsonandresponse_jsoncolumns) are no longer persisted - the stored message chain is the record of what was sent and returned. This means data that only ever lived in those raw payloads is no longer stored, notably the log probabilities returned by OpenAI completion models with-o logprobs. llm logs -qfull-text search works against the new log tables. Search covers the prompt text you typed and the model's text responses - system prompts, fragment contents, tool activity and reasoning traces are excluded from the index. See Searching the logs.llm logsnow shows which configured toolbox instance provided each tool - in the tools list for a prompt and on each tool result, so aSQLite_queryresult records that it ran againstSQLite("mydb.db").- New message_tree SQL view that renders each conversation thread as an indented text outline, for exploring the message store directly with SQL. #1562
Other changes
- New OpenAI models:
gpt-5.6-sol,gpt-5.6-terraandgpt-5.6-luna. - Removed OpenAI models that are no longer available via the OpenAI API:
chatgpt-4o-latest, thegpt-4oandgpt-4o-miniaudio preview models,gpt-4-32k,gpt-4-1106-preview,gpt-4-0125-preview, thegpt-4.5preview models,o1-preview,o1-miniandgpt-5.1-chat-latest. #1553 - Continuing a conversation that used a configured toolbox now works:
llm -candllm chat -creconstruct each toolbox instance from its recorded configuration, so a conversation started with-T 'Datasette("https://datasette.io/content")'can be continued without repeating the-Toption. - New
llm prompt --jsonoption which outputs a JSON array describing the prompt and the response, in the same format asllm logs --json. This works even with--no-logor logging turned off, in which case the response is logged to a temporary in-memory database to build the JSON. #1566 - New
response.execute_tool_call(tool_call)method (awaitable on async responses) that executes a single tool call and returns itsToolResult. This is designed for plugins wrapping provider SDKs that orchestrate the tool loop themselves, described in the advanced model plugins documentation. - Documentation for the
responses: truesetting inextra-openai-models.yaml, which opts a custom OpenAI model into the Responses API instead of Chat Completions. See Adding more OpenAI models. - Fixed a bug where the system prompt was omitted from the pre-computed
prompt.messageson the first turn of a conversation, so models that build their request from that message list never received it. Thanks, Niall Smart. #1478 - Fixed a bug on Windows where a fragment argument holding an absolute path such as
C:\Users\demo\notes.txtwas mistaken for a reference to ac:fragment loader plugin. Fragment arguments that match an existing file path now always resolve as files. #1563 - LLM now requires sqlite-utils 4.0 or higher.