Skip to content

Enter a model ID

GitHub

Releases

Language Version Released Package
Python 2.0.0 (stable) 2026-11-01 lm15 on PyPI
TypeScript 2.0.0 (stable) 2026-11-01 @lm15/lm15 on npm
Rust 2.0.0 (stable) 2026-11-01 lm15 on crates.io
Go v2.0.0 (stable) 2026-11-01 github.com/lm15-dev/lm15-go/v2
R 2.0.0 (stable) 2026-11-01 lm15-dev/lm15-r on GitHub (on its way to CRAN)

The examples on this site are written for these versions, and the playground runs them. Julia 2.0.0 (the package LanguageModel15) waits for Julia’s package registry; see Language and runtime support.

LM15 follows semantic versioning in every language. Within a major version, the core — requests and responses, streaming, tools, structured output, media inputs, reasoning, errors, credentials and model listing — keeps working as documented. Provisional features (files, batches, media generation, stored prompt caches, realtime sessions, reading OpenAI Chat Completions requests, and account sign-in) may change within a major version; such a change is announced in the release notes and in the contract’s change log.

The major version is the same in every language. It counts the generations of the contract that every language is graded against: a change that can break programs raises it in all of them together, so “LM15 2” means the same thing in Python and in Go. The numbers after it are each language’s own, because each is released on its own schedule, and each release’s notes name the contract version it passes.

Go writes the major version in the import path. From version 2, Go programs import github.com/lm15-dev/lm15-go/v2. Go’s 1.x releases were numbered from 1.1, because an early prototype was tagged v1.0.0 by mistake; Go’s module mirror keeps every version forever, so that tag is retracted.

LM15 for R 2.0.0 is now stable, with no code change: within version 2 the core keeps working as documented. Before this, R had been checked against recorded traffic and a local model server, but had made only one paid call. It has now made real calls to ten providers with API keys and five saved sign-ins (chat, streaming, structured output, tools, pictures, reasoning, prompt caching with exact token counts and costs), with no problem in R. R is still installed from GitHub; it is on its way to CRAN.

The first stable releases of LM15 for Rust and Go, the same code as that morning’s release candidates. LM15 is now stable in Python, TypeScript, Rust and Go (R followed the same day): within version 2 the core keeps working as documented (see Version numbers). Both pass all 1,968 checks of contract cfc3edc.

Version 2 in every language: Python 2.0.0, TypeScript 2.0.0, Rust 2.0.0-rc.1, Go v2.0.0-rc.1, R 2.0.0 — 2026-11-01

Section titled “Version 2 in every language: Python 2.0.0, TypeScript 2.0.0, Rust 2.0.0-rc.1, Go v2.0.0-rc.1, R 2.0.0 — 2026-11-01”

Released together; each passes all 1,968 checks of contract cfc3edc. This breaks programs that read token counts or estimate costs.

  • A token count means the same thing on every provider. The input count is every token the model read, cached tokens included; the output count is every token it wrote, reasoning included; the cache, reasoning and audio counts are parts of those two, and the total is their sum. Before, each count was the provider’s own, so the same field meant different things. Anthropic’s input now includes cache reads and writes; Gemini’s output now includes its thinking; xAI’s output now includes reasoning; OpenAI’s counts don’t change. The provider’s own numbers are still in provider_data.
  • A count is exact or empty. A count the provider didn’t fully report is left empty (None, undefined, NULL, nil), never a partial sum, and so is one whose numbers don’t add up.
  • Cost estimates are exact or empty, and price long prompts at the provider’s higher rate. The old estimate charged cached tokens twice on OpenAI, Gemini and xAI, and missed Gemini’s and xAI’s reasoning.
  • Go’s import path is now github.com/lm15-dev/lm15-go/v2 (see Version numbers).
  • Notes: Python, TypeScript, Rust, Go, R.

The first stable release of LM15 for TypeScript and JavaScript, after eleven release candidates. The code is 1.0.0-rc.11’s: judgments, pictures for Jev, bounding boxes, saved sign-ins. Within 1.x the core now keeps working as documented (see Version numbers). It passes all 1,921 checks of contract 6dc1c5c, the same as the other languages.

Python 1.5.0, TypeScript and Rust 1.0.0-rc.11, Go v1.1.0-rc.10, R 1.4.0 — 2026-10-15

Section titled “Python 1.5.0, TypeScript and Rust 1.0.0-rc.11, Go v1.1.0-rc.10, R 1.4.0 — 2026-10-15”

Released together; each passes all 1,921 checks of contract 6dc1c5c.

  • Bounding boxes: ask where something is in a picture. A new judgment (bounding_box; boundingBox in TypeScript, BoundingBox in Go) answers with four edges, each a fraction of the picture. On TypeSafe it is Jev 1.14’s Box question; on other models the same request becomes ordinary structured output, so one program runs everywhere. See Judgments.
  • Notes: Python, TypeScript, Rust, Go, R.

Python 1.4.1, TypeScript and Rust 1.0.0-rc.10, Go v1.1.0-rc.9, R 1.3.1 — 2026-10-15

Section titled “Python 1.4.1, TypeScript and Rust 1.0.0-rc.10, Go v1.1.0-rc.9, R 1.3.1 — 2026-10-15”
  • A saved cloud login’s settings are used. A Google Cloud login saved with its project and location now sends them; before, the router fell back to the environment and the defaults. Found and fixed by Rolf Fredheim (lm15-python#21).
  • settings accepts either spelling of a provider name (vertex_anthropic or vertex-anthropic).

Python 1.4.0, TypeScript and Rust 1.0.0-rc.9, Go v1.1.0-rc.8, R 1.3.0 — 2026-10-14

Section titled “Python 1.4.0, TypeScript and Rust 1.0.0-rc.9, Go v1.1.0-rc.8, R 1.3.0 — 2026-10-14”
  • Jev reads pictures. A PNG or JPEG in the message sent to TypeSafe’s Jev can be judged (“Is there a person in the image?”). TypeSafe calls images beta: check answers on pictures you know first.

Python 1.3.0, TypeScript and Rust 1.0.0-rc.8, Go v1.1.0-rc.7, R 1.2.0 — 2026-10-12

Section titled “Python 1.3.0, TypeScript and Rust 1.0.0-rc.8, Go v1.1.0-rc.7, R 1.2.0 — 2026-10-12”
  • The Meta sign-in reaches the Muse Code subscription, Muse Wonder Full included. It stays unverified: Meta’s terms reserve this key for Muse Code, so using it from LM15 puts the account at risk.
  • Python 1.3.0 and TypeScript 1.0.0-rc.8 were tagged but not published; the next versions include them.

Python 1.2.3, TypeScript and Rust 1.0.0-rc.7, Go v1.1.0-rc.6, R 1.1.2 — 2026-10-10

Section titled “Python 1.2.3, TypeScript and Rust 1.0.0-rc.7, Go v1.1.0-rc.6, R 1.1.2 — 2026-10-10”

Each includes the version tagged earlier that day (Python 1.2.2, TypeScript 1.0.0-rc.6, Go v1.1.0-rc.5, R 1.1.1).

  • A wrong or expired key is an authentication error on every provider (Gemini and xAI answer such a key with HTTP 400).
  • A structured answer reads through text when the reply came back as data (a schema with a yes/no or a fixed list of choices).
  • A thinking budget alone is enough: the effort level is filled in from it.
  • Error messages name the fix: effort="none" says LM15 spells it "off".

Python 1.2.1, TypeScript and Rust 1.0.0-rc.5, Go v1.1.0-rc.4, R 1.1.0 — 2026-10-06

Section titled “Python 1.2.1, TypeScript and Rust 1.0.0-rc.5, Go v1.1.0-rc.4, R 1.1.0 — 2026-10-06”
  • Long streamed replies no longer fail at the last moment. Streams take an event of any size; before, a long answer or system prompt could fail after it had been generated and billed.
  • A tool with no description works on every provider (Anthropic and Groq refused one).
  • R also gains provider_definition(), to use a provider LM15 doesn’t list.

Python 1.2.0, TypeScript and Rust 1.0.0-rc.4, Go v1.1.0-rc.3, R 1.0.1 — 2026-09-30

Section titled “Python 1.2.0, TypeScript and Rust 1.0.0-rc.4, Go v1.1.0-rc.3, R 1.0.1 — 2026-09-30”

Released together; each passes all 1,838 checks of the same contract version (57e33d1).

  • The Claude Code release is current and settable. Signing in with Claude Code, LM15 tells Anthropic which Claude Code release it is, and newer models refuse old ones: Claude Opus 5.5 refused the release LM15 named before (2.1.170). LM15 now names 2.1.285. When a model needs a newer release before LM15’s next one, set LM15_CLAUDE_CODE_VERSION (read by the router) or the client_version setting for claude-code; no code change or new LM15 release is needed. The Codex sign-in takes the same setting (LM15_CODEX_CLIENT_VERSION). The auth doctor shows the release in use and where it came from.
  • The refusal says what to change. Updating the claude program does not change what LM15 sends; the error now says so and names the setting.
  • Claude’s default max_tokens is the model’s own limit: 128,000 for current models, 64,000 for the 4.5 generation (it was 16,384, which replies with reasoning on often ran out of). Other models on Anthropic-style servers keep 16,384. The response records it as defaulted, as before.
  • A setting a provider doesn’t read is an error instead of being ignored.
  • Reading OpenAI Chat Completions requests accepts input_audio in ogg, opus, flac, aac, aiff, webm and mpeg.
  • Notes: Python, TypeScript, Rust, Go, R.

The first release of LM15 for R. It passes all 1,788 checks of the same contract version as the releases below, including judgments, the four open-model hosts, the Google Cloud pass and saved sign-ins, which it shares with the other languages: a login saved in R is used and renewed from Python, and the other way round. It runs in the browser through webR, and the playground runs it there.

  • Install from GitHub: remotes::install_github("lm15-dev/lm15-r"). It is on its way to CRAN; once accepted, install.packages("lm15").
  • complete() and stream() take the client first, as R’s functions do; a stream calls your function with each event.
  • Full notes

A fix for Amazon Bedrock. In 1.0.0-rc.2 and earlier, AWS refused the signature of every request through bedrock-mantle-chat and bedrock-anthropic: the Rust client sent the address of the server twice, and AWS then checked the signature against the wrong address. Nothing else changed. See Use AWS.

Python 1.1.0, TypeScript and Rust 1.0.0-rc.2, Go v1.1.0-rc.2 — 2026-09-26

Section titled “Python 1.1.0, TypeScript and Rust 1.0.0-rc.2, Go v1.1.0-rc.2 — 2026-09-26”

Released together; each passes all 1,788 checks of the same contract version.

  • Four new providers: DeepInfra, Together AI, Fireworks AI and Parasail, hosts that run open models from many vendors. Each rule LM15 applies to them was measured against the real service: for example, a model’s reasoning is sent back where the host reads it, and a request a host would silently ignore is refused with an error instead.
  • Google Cloud: LM15 finds your project where Google’s own tools do (gcloud’s configuration, the credential file, the machine it runs on), a Vertex API key works on the regular vertex door, and every Google sign-in failure says how to fix it. See Use Google Cloud.
  • TypeScript and Rust also ship saved sign-ins and the Gemini schema fields (below), which were in their source since 1.0.0-rc.1.
  • Notes: Python, TypeScript, Rust, Go.

The first release of LM15 for Go.

  • JSON objects keep their key order (lm15.JSONObject, built with lm15.KV). A structured-output schema reaches the model with its fields in the order you wrote them, which is the order the model fills them in.
  • Passes all 1,583 checks of the contract it pins (2026-09-26).
  • Full notes

Two changes, made in all four languages the same day. They are in Go v1.1.0-rc.1, and in Python 1.1.0 and TypeScript and Rust 1.0.0-rc.2.

  • Gemini schema fields. Gemini has two places for a JSON schema: one that reads only Google’s own schema format, and one that reads full JSON Schema. LM15 now sends each schema where it can be read, for tools as well as structured output, so a tool schema with "additionalProperties": false (which OpenAI’s strict mode requires) also works on Gemini. Schemas that worked before are sent as before.
  • Key order is checked. The contract now checks that the JSON you pass in (schemas, tool arguments, extra settings) reaches the provider with its keys in your order.

The first stable release of LM15. No --pre needed: pip install lm15. Notes

TypeScript and Rust 1.0.0-rc.1 — 2026-09-25

Section titled “TypeScript and Rust 1.0.0-rc.1 — 2026-09-25”

The first published versions, as release candidates.