All notable changes to this project are documented in this file. Release notes are grouped by theme rather than listing every commit.
Compared to 0.3.1. A maintenance release focused on caching correctness and CI/test coverage. No breaking changes.
- Structured-output cache now keys entries by model identity — the model name and API
base_urlare folded into the cache key alongside the messages, schema, and generation params, so switching models or endpoints no longer returns another model's cached completion (#336). - Structured-output cache eager loading and eviction now treat each on-disk entry as a directory (the layout
PydanticModelDumperactually writes). The previousis_file()filter matched nothing and silently disabled eager cache loading; eviction now usesrmtreeinstead ofunlink(#331). - Offline embedding cache key is now stable: when
HF_HUB_OFFLINEis set, the commit SHA is read from the local Hugging Face ref file ($HF_HUB_CACHE/<repo>/refs/<rev>) so the key matches the online path instead of falling back to the bare revision string. The embedding cache key now also incorporates the model name, preventing cross-model cache collisions for non-local models (#337). - Augmentation console scripts
basic-augandevolution-augnow resolve to the correct module paths (autointent.generation.utterances._basic.cli/._evolution.cli); the entry points were left dangling by an earlier module rename (#330).
- Coverage regression floor: the combined coverage total is now gated against an 85% floor, so a drop below it fails CI (#333).
- Manual coverage dispatch workflow added and the broken coverage configuration fixed (#325).
- Windows test jobs restored — a bash-only shell step had been breaking them on Windows runners (#328).
- Added test coverage for the
Generatordump/loadround-trip and the async empty-response guard (#332), the basic/evolution augmentation CLIs (#330), and theJSONFormatterplus macro retrieval metrics (#329).
Compared to 0.3.0. A maintenance release focused on bug fixes, reproducibility of default Hugging Face downloads, and CI/test stability. No breaking changes.
- LLM description scorer now persists
generator_configacrossdump/load, so a reloadedLLMDescriptionScorerrebuilds itsGeneratorwith the original settings instead of defaults (#302). - Tunable decision threshold test fixture updated for Optuna 4.9 sampling order — confirms compatibility with
optuna>=4.9(#293). - faiss typing tweak for
IndexFlatIPto satisfy strictermypyruns (#292).
- New canonical SHA pin map
autointent.configs._pinned_revisions.DEFAULT_REVISIONS, applied automatically byHFModelConfigwhenrevisionis left unset. Default embedders, rerankers, and NLI models now resolve to fixed commit SHAs instead ofmain, making installs deterministic and avoiding Hub429rate limits under parallel CI load. To opt out, pass an explicitrevision(including"main") on the relevant config (#294).
- New
RetrievalMetricFnWithOOSandScoringMetricFnWithOOSprotocols (exported fromautointent.metrics) describing the OOS-aware metric callables returned by the existingignore_oosdecorators (#316).
- Full OS × Python matrix is now gated behind the
full-ciPR label anddevpushes; ordinary PRs run a faster default matrix (#318). mypy --strictis enforced ontests/to prevent type drift between fixtures and production code (#316).- Soft
mypyprofile added fordocs/anduser_guides/so tutorials and Sphinx helpers are type-checked without forcing them onto strict mode (#320). - Live-API tests (OpenAI, OpenSearch) are mocked in CI — no network calls or credentials required to run the suite locally (#301).
- HF cache prewarm workflow plus a
.ci/warm_hf_cache.pyhelper keyed offDEFAULT_REVISIONSremoves the long-standing Hub rate-limit flakes in the matrix (#294). - GitHub Actions runners bumped to Node 24 images (#300).
- Pipeline interruption tests restored after the sampler API removal in #296 (#303).
- Test layout cleanup: the legacy
setup_environmenthelper is gone — tests now use the standard pytesttmp_pathfixture (#317).
Compared to 0.2.0.
Heavy integrations are now optional and loaded lazily where possible. A plain pip install autointent pulls a smaller core set of dependencies; features that need transformers, OpenSearch, MCP, OpenAI, vLLM, and similar stacks require the matching optional dependency groups (see pyproject.toml). If you relied on everything being importable after a minimal install, pin extras explicitly in your environment.
- OpenAI embeddings path with safer batching and tokenizer fallbacks when the API does not expose
tokenizermetadata. - vLLM optional extra for serving-compatible embedding workflows.
- Embedder fine-tuning utilities and training-oriented improvements for custom embedding models.
- GCN-based scorer for graph-style intent scoring in the AutoML search.
- OpenSearch optional backend for vector index storage and retrieval alongside existing options.
- MCP (Model Context Protocol) interface plus HTTP serving pieces (FastAPI / related extras) for running AutoIntent behind an API or MCP host.
- Out-of-scope (OOS) intents are always kept separate in dataset splits so evaluation stays honest.
- Adversarial augmentation support for more robust pipelines under optimization.
OptimizationConfig.from_presetfor constructing optimization settings from named presets.- Split readiness checks (including multilabel-aware validation) so you catch bad label or split geometry before long runs.
- uv-centric developer workflow (dependency groups, reproducible installs).
- Python supported through below 3.15 (
requires-python = ">=3.10,<3.15"inpyproject.toml). - OpenAI Python SDK v2 (
openai>=2,<3) in theopenaiextra. datasetspinned below 5 (datasets>=3.2,<5) for compatibility with current loaders and tests.
See the v0.2.0 release on GitHub for earlier changes.