Simon Willison ships llm 0.33 with combinable templates
Simon Willison released version 0.33 of his llm command line tool and Python library on 22nd August 2026. The release builds on a quick 0.32.1 fix shipped the day before for the same issue, and 0.33 is described as the more comprehensive version of that fix. The main change is that llm embed and llm embed-multi now accept a --key option, and the corresponding Python methods, EmbeddingModel.embed(), EmbeddingModel.embed_multi(), Collection.embed() and Collection.embed_multi(), accept a key= argument too. The resolved per-call key is passed to embedding plugins without changing shared model state, so the embedding models now follow the same key-handling pattern that regular LLM models already use. Existing plugins that read self.key keep working through a compatibility fallback. Willison credited a contributor named ChrisJr404 for this change, referencing GitHub issue and PR numbers 757 and 1620. Separately, the -t/--template flag for llm prompt can now be repeated to combine multiple templates in one command, applied in the order given. This lets a template that packages a model choice with default options be combined with a separate template that supplies the actual prompt text. Willison's example: saving a template called lhigh that sets the model to gpt-5.6-luna with reasoning_effort set to high, saving a second template called pelican that holds the prompt "Generate an SVG of a pelican riding a bicycle," then running llm -t lhigh -t pelican to combine both in a single call. Third, reasoning-capable Responses API models now support a reasoning_summary option with auto, concise and detailed values, usable via llm openai endpoint --responses (issue 1600). Willison notes this is particularly useful for exercising different models that provide their own imitation of the OpenAI Responses API.
Key facts
- llm 0.33 lets llm embed and llm embed-multi (and their Python equivalents) accept a --key argument, passing a per-call key to embedding plugins without touching shared model state.
- Existing plugins that read self.key keep working via a compatibility fallback; the change follows issues 757 and 1620 and credits contributor ChrisJr404.
- The -t/--template flag can now be repeated, so a template holding model configuration and options can be combined with a separate template holding the prompt.
- Responses API models now support a reasoning_summary option (auto, concise, detailed values) through llm openai endpoint --responses, tracked as issue 1600.
- 0.33 supersedes a narrower 0.32.1 fix Willison shipped the day before for the same --key issue.
Why it matters
llm is Simon Willison's widely used command line tool and Python library for working with large language models from many providers. This release closes a gap in its embeddings support: embedding commands previously lacked the same clean per-call key handling that regular prompting already had, which meant a script had to fall back on shared model state to supply a key. Bringing embeddings in line with the rest of the tool removes an inconsistency rather than adding a new capability.
Who it affects
Anyone scripting llm for embeddings work benefits directly from the --key option, especially through plugins that previously depended on reading self.key. Users who build reusable llm templates gain the most from repeatable -t/--template, since it lets a model-and-options template be kept separate from prompt templates and recombined freely. Developers testing Responses-API-compatible models against OpenAI's own API shape can use the new reasoning_summary values to compare how different models report their reasoning.
How to use it
Pass --key to llm embed or llm embed-multi, or key= to the Python EmbeddingModel and Collection methods, to supply a per-call key without altering shared state. To combine templates, save one template with a model and options (for example llm -m gpt-5.6-luna -o reasoning_effort high --save lhigh) and another with just a prompt (llm "..." --save pelican), then run llm -t lhigh -t pelican to apply both together. For Responses API models, add reasoning_summary with a value of auto, concise or detailed when calling llm openai endpoint --responses.
How solid is it
This is a first-party release note from Simon Willison, the tool's author, published the same day as the release, so the description of the changes is a primary source. The 0.32.1 predecessor fix and this 0.33 follow-up both address the same underlying --key issue, with 0.33 described as the more thorough fix; the release note does not specify what exactly 0.32.1 left unresolved.
Risks and caveats
The release note does not explain what the auto, concise and detailed values of reasoning_summary each produce, so users will need to test them directly. It also does not state when 0.33 was tagged or published to PyPI beyond the article's own publish date of 22nd August 2026.
“This allows model configuration and options from one template to be used with a prompt from another.”
— Simon Willison, llm 0.33 release notes