Skip to content

Releases: simonw/llm

0.24a0

01 Mar 06:48
Compare
Choose a tag to compare
0.24a0 Pre-release
Pre-release
  • Alpha release with experimental register_template_loaders() plugin hook. #809

0.23

28 Feb 16:57
Compare
Choose a tag to compare

Support for schemas, for getting supported models to output JSON that matches a specified JSON schema. See also Structured data extraction from unstructured content using LLM schemas for background on this feature. #776

  • New llm prompt --schema '{JSON schema goes here} option for specifying a schema that should be used for the output from the model. The schemas documentation has more details and a tutorial.
  • Schemas can also be defined using a concise schema specification, for example llm prompt --schema 'name, bio, age int'. #790
  • Schemas can also be specified by passing a filename and through several other methods. #780
  • New llm schemas family of commands: llm schemas list, llm schemas show, and llm schemas dsl for debugging the new concise schema language. #781
  • Schemas can now be saved to templates using llm --schema X --save template-name or through modifying the template YAML. #778
  • The llm logs command now has new options for extracting data collected using schemas: --data, --data-key, --data-array, --data-ids. #782
  • New llm logs --id-gt X and --id-gte X options. #801
  • New llm models --schemas option for listing models that support schemas. #797
  • model.prompt(..., schema={...}) parameter for specifying a schema from Python. This accepts either a dictionary JSON schema definition or a Pydantic BaseModel subclass, see schemas in the Python API docs.
  • The default OpenAI plugin now enables schemas across all supported models. Run llm models --schemas for a list of these.
  • The llm-anthropic and llm-gemini plugins have been upgraded to add schema support for those models. Here's documentation on how to add schema support to a model plugin.

Other smaller changes:

  • GPT-4.5 preview is now a supported model: llm -m gpt-4.5 'a joke about a pelican and a wolf' #795
  • The prompt string is now optional when calling model.prompt() from the Python API, so model.prompt(attachments=llm.Attachment(url=url))) now works. #784
  • extra-openai-models.yaml now supports a reasoning: true option. Thanks, Kasper Primdal Lauritzen. #766
  • LLM now depends on Pydantic v2 or higher. Pydantic v1 is no longer supported. #520

0.23a0

27 Feb 01:09
Compare
Choose a tag to compare
0.23a0 Pre-release
Pre-release

Alpha release adding support for schemas, for getting supported models to output JSON that matches a specified JSON schema. #776

  • llm prompt --schema '{JSON schema goes here} option for specifying a schema that should be used for the output from the model, see schemas in the CLI docs.
  • model.prompt(..., schema={...}) parameter for specifying a schema from Python. This accepts either a dictionary JSON schema definition of a Pydantic BaseModel subclass, see schemas in the Python API docs.
  • The default OpenAI plugin now supports schemas across all models.
  • Documentation on how to add schema support to a model plugin.
  • LLM now depends on Pydantic v2 or higher. Pydantic v1 is no longer supported. #520

0.22

17 Feb 04:37
Compare
Choose a tag to compare

See also LLM 0.22, the annotated release notes.

  • Plugins that provide models that use API keys can now subclass the new llm.KeyModel and llm.AsyncKeyModel classes. This results in the API key being passed as a new key parameter to their .execute() methods, and means that Python users can pass a key as the model.prompt(..., key=) - see Passing an API key. Plugin developers should consult the new documentation on writing Models that accept API keys. #744
  • New OpenAI model: chatgpt-4o-latest. This model ID accesses the current model being used to power ChatGPT, which can change without warning. #752
  • New llm logs -s/--short flag, which returns a greatly shortened version of the matching log entries in YAML format with a truncated prompt and without including the response. #737
  • Both llm models and llm embed-models now take multiple -q search fragments. You can now search for all models matching "gemini" and "exp" using llm models -q gemini -q exp. #748
  • New llm embed-multi --prepend X option for prepending a string to each value before it is embedded - useful for models such as nomic-embed-text-v2-moe that require passages to start with a string like "search_document: ". #745
  • The response.json() and response.usage() methods are now documented.
  • Fixed a bug where conversations that were loaded from the database could not be continued using asyncio prompts. #742
  • New plugin for macOS users: llm-mlx, which provides extremely high performance access to a wide range of local models using Apple's MLX framework.
  • The llm-claude-3 plugin has been renamed to llm-anthropic.

0.21

31 Jan 20:36
Compare
Choose a tag to compare
  • New model: o3-mini. #728
  • The o3-mini and o1 models now support a reasoning_effort option which can be set to low, medium or high.
  • llm prompt and llm logs now have a --xl/--extract-last option for extracting the last fenced code block in the response - a complement to the existing --x/--extract option. #717

0.20

23 Jan 04:47
Compare
Choose a tag to compare
  • New model, o1. This model does not yet support streaming. #676
  • o1-preview and o1-mini models now support streaming.
  • New models, gpt-4o-audio-preview and gpt-4o-mini-audio-preview. #677
  • llm prompt -x/--extract option, which returns just the content of the first fenced code block in the response. Try llm prompt -x 'Python function to reverse a string'. #681
    • Creating a template using llm ... --save x now supports the -x/--extract option, which is saved to the template. YAML templates can set this option using extract: true.
    • New llm logs -x/--extract option extracts the first fenced code block from matching logged responses.
  • New llm models -q 'search' option returning models that case-insensitively match the search query. #700
  • Installation documentation now also includes uv. Thanks, Ariel Marcus. #690 and #702
  • llm models command now shows the current default model at the bottom of the listing. Thanks, Amjith Ramanujam. #688
  • Plugin directory now includes llm-venice, llm-bedrock, llm-deepseek and llm-cmd-comp.
  • Fixed bug where some dependency version combinations could cause a Client.__init__() got an unexpected keyword argument 'proxies' error. #709
  • OpenAI embedding models are now available using their full names of text-embedding-ada-002, text-embedding-3-small and text-embedding-3-large - the previous names are still supported as aliases. Thanks, web-sst. #654

0.19.1

05 Dec 21:47
Compare
Choose a tag to compare
  • FIxed bug where llm.get_models() and llm.get_async_models() returned the same model multiple times. #667

0.19

01 Dec 23:59
Compare
Choose a tag to compare
  • Tokens used by a response are now logged to new input_tokens and output_tokens integer columns and a token_details JSON string column, for the default OpenAI models and models from other plugins that implement this feature. #610
  • llm prompt now takes a -u/--usage flag to display token usage at the end of the response.
  • llm logs -u/--usage shows token usage information for logged responses.
  • llm prompt ... --async responses are now logged to the database. #641
  • llm.get_models() and llm.get_async_models() functions, documented here. #640
  • response.usage() and async response await response.usage() methods, returning a Usage(input=2, output=1, details=None) dataclass. #644
  • response.on_done(callback) and await response.on_done(callback) methods for specifying a callback to be executed when a response has completed, documented here. #653
  • Fix for bug running llm chat on Windows 11. Thanks, Sukhbinder Singh. #495

0.19a2

21 Nov 04:13
Compare
Choose a tag to compare
0.19a2 Pre-release
Pre-release

0.19a1

20 Nov 05:28
Compare
Choose a tag to compare
0.19a1 Pre-release
Pre-release
  • response.usage() and async response await response.usage() methods, returning a Usage(input=2, output=1, details=None) dataclass. #644