Roadmap¶
Where lm15-python is, and what is planned before and after the stable 1.0 release. Dates are intentions, not promises; everything here follows the same discipline as the code — see How lm15 is specified.
Where we are (September 2026)¶
- 1.0.0rc3 is the next release candidate in this checkout, not yet published by this source update and not the stable 1.0 release. The chat core — canonical types, serde, errors, request building, response parsing, streaming — is checked against the pinned language-neutral contract. Publishing this candidate does not ratify draft contract changes.
- Non-chat endpoints, stored-cache resources, live sessions and Chat Completions ingest ship as provisional. Contract tests cover recorded behavior; they do not promise that every provider/account works live. The stability boundary below applies even after the package reaches 1.0.
- The model-string router and tool derivation from functions are available. The contract's API-family playbook governs the shared public names; an older router-portability proposal is not the authority for the current implementation.
- Python, Rust and TypeScript pass the shared corpus at their recorded pins. That is evidence of agreement on the recorded cases, not a release approval or a claim about untested runtime behavior.
What ships in 1.0, and what is stable¶
Already decided: provisional features ship in 1.0, clearly labeled.
This follows the ratified contract's
spec/SCOPE.md,
not a new release-policy decision.
- Frozen: the canonical chat types, serialization, errors, request and response mapping, streaming, credential resolution and model listing. Removing or changing frozen behavior requires a major release and maintainer ratification. Additions follow the contract's change process.
- Provisional: non-chat endpoints (files, batches, image/speech/video
generation), stored-cache resources, live sessions and Chat Completions
ingest. These are included, but may change incompatibly during 1.x with
a contract
changes/entry. Additive changes are preferred, not guaranteed. Pin an exact package version and review change entries before upgrading applications that use them. - Out of scope: embeddings and canonical provider-executed computer use. The contract describes the limits of provider-specific passthrough; it is not a stability promise for those features.
The stability of a feature is separate from its test coverage. In particular, typed media inside chat belongs to the frozen chat model; the standalone media-generation endpoints are provisional.
Toward 1.0 stable¶
The release candidate lets users test the package and read the full documentation before the stable release. Remaining work includes:
- Complete documentation site (this site) — guides, cookbooks, API reference, specification pages, benchmarks.
- User-experience review pass — read the docs as a new user would; adjust library ergonomics where the docs reveal friction. Small, additive-only changes to the frozen chat core; provisional surfaces may still move.
- Check scope labeling — the scope is settled above. Keep the provisional notices on the relevant guides and release notes; do not advertise the entire exported package as a frozen API.
- Release engineering — tag-driven publishing via PyPI trusted
publishing (OIDC), CI across Python 3.10–3.14 and Linux/macOS/Windows,
a type-checking gate alongside the shipped
py.typed. - Stable release.
Provider coverage¶
Today, with identical canonical behavior and live-receipt fixtures:
- OpenAI (Responses API) and OpenAI Codex, including GA Realtime (live) sessions, Sora video, images, and speech
- Anthropic and Claude Code
- Google Gemini, including Live (WebSocket) sessions, Veo video, images, and speech
- xAI (Grok), including subscription OAuth, images, and grok-imagine video
- Any Chat Completions–compatible server through one dialect adapter with typed compatibility policies — Groq, OpenRouter, DeepSeek, vLLM, SGLang, Ollama
Azure, Bedrock and Vertex already have contract coverage; see cloud hosts for their distinct credentials and settings. Provider/model availability and live verification remain separate from passing recorded cases. Additional providers require evidence-backed fixtures before implementation.
Layers above the foundation¶
lm15 is deliberately low-level: no automatic tool loop, no retries, no cost ledger, no policy routing (the shipped router is a lookup table — no fallbacks, no ranking). Several companion pieces are under consideration once the foundation's user experience is validated — each as a separate package built on the frozen core, none of them contract-governed:
- An ergonomic layer — a concise
call()-style interface, automatic tool loops, retry/fallback patterns, for people who want three lines and sensible defaults. - A model catalog — maintained pricing, context-window, and capability metadata via the entry-point protocol already specified in model-hydration, enabling cost estimation and routing.
- Recipes — cookbook pages for everything the core deliberately omits (retries, fallback, budget caps, proxying), so each "lm15 doesn't do X" has a one-page answer.
Multi-language¶
- Keep Python, Rust and TypeScript aligned with their contract pins and runtime tests. Other ports must meet the same gates before claiming parity; the corpus grows, so use the current reports rather than a historical fixed check count.
- Publish them (crates.io, Go module, npm) once they pass the full corpus — never before.
- The promise stays the same in every language: byte-identical wire requests, identical canonical parses, one spec.
Ecosystem and community¶
- Integration examples: a FastAPI service, an agent loop, notebooks, and migration guides from other clients.
- A fixture-first "add a provider" contributor path (see CONTRIBUTING).
- Benchmarks stay machine-generated and re-run on a schedule — numbers in the README and on this site are never hand-edited.