Changelog
Notable changes to Aegis, newest first. Versions follow PEP 440 and every package in a release shares one version. The format follows Keep a Changelog.
Changes land under Unreleased as they merge; on release that section becomes the version's entry and its GitHub Release notes.
[Unreleased]
[2.0.0a1] - 2026-09-26
Everything since the first public alpha. Upgrading from 2.0.0a0? Read Breaking changes first.
Breaking changes
- License is now AGPL-3.0-or-later (was MIT). Self-hosting, modifying and commercial use are unaffected; if you distribute a modified Aegis, or let users reach a modified Aegis over a network, you must offer them its source. Plugins may use any AGPL-compatible license.
- PII masking is more selective by default. Only identifying entities are masked (names, contact details, account and government IDs).
DATE_TIME,URL,NRP,US_DRIVER_LICENSEand region-specific IDs are now opt-in viaentities:— addDATE_TIMEback if you relied on dates of birth being masked. - Streaming routes buffer when an egress node doesn't declare
stream_capability(e.g. PII unmasking, budget recording), so those nodes see the whole response. aegis serverefuses to start ifpipeline.tool_callorpipeline.tool_resultis set — those stages were never enforced. Govern MCP tools in Python withMcpExecuteNode.pip install aegis-gatewayno longer installs LLM Guard (or PyTorch). The pack is still included; install its model library withpip install "aegis-gateway-pack-llm-guard[llm-guard]". LLM Guard's pinned dependencies carry known advisories, so this keeps them out of default installs.- Budgets must be listed in both stages (
ingress: [budget],egress: [budget]) — the egress half is what records spend. - Chroma collections created by
ChromaVectorStore/aegis ragare now namedaegis-<namespace>; re-index documents stored by earlier versions. secret://references must include#key(e.g.secret://env/OPENAI_API_KEY#value); the key is ignored by theenvbackend.- Removed: the
aegis devcommand (useaegis serve --no-auth), the pluggy hooks inaegis_core.hooks(never called — use exporters), the TypeScript SDK (generate a client fromopenapi.jsoninstead), therag.chunking,rag.chroma_storeandrag.pgvector_storehelpers (useTextChunker,ChromaVectorStore,PgVectorStore), and the Prometheus/Grafana compose profile (/metricsis unchanged).
Security
- Dependencies upgraded across the board. Known advisories in a default install went from 115 (14 packages) to 7 accepted ones that don't reach Aegis (Chroma server endpoints; cryptography X.509/PKCS#7 APIs, pending a Presidio release). CI now fails on any new advisory (
scripts/audit-deps.sh), and Dependabot proposes weekly updates. - Docs toolchain: Vite upgraded to 7.x under VitePress (dev-server advisories).
- GitHub Actions moved to Node 24 releases; the dev image uses Node 24 LTS.
- Streamed
/v1/chat/completionsrequests on true-streaming routes skipped every ingress node (PII masking, residency, budgets) and were never recorded. Ingress now always runs first and streamed runs are recorded. - Tool-call and tool-result stages in
aegis.yamlwere silently ignored; the server now fails closed (see above).
Added
aegis servebuilds everything fromaegis.yaml— providers, packs (viaaegis.packsfactories), per-route pipelines, API-key auth — andGET /v1/healthreports the config digest.aegis explain— the verdict-by-verdict trail of any run.- Evidence ledger — hash-chained
model_inventoryandrun_evidencerecords in SQLite;aegis audit export | verify | inventory,GET /v1/audit/ledger, and a published record schema. - Compliance report —
GET /v1/audit/reportandaegis report summary(route inventory, run counts, chain length); routeowner,risk_ratingandreview_interval_daysinaegis.yaml. - Named approvers —
approverson runs,aegis runs create --approver, and residencyrequire_approval: trueto pause instead of block. - Exporters — forward every ledger record to other systems with
exporters:inaegis.yaml; built-injsonlandwebhook, plus anyaegis.exportersplugin. Delivery is ordered, non-blocking, and failures are counted inaegis_exporter_failures_total. - Plugin author path —
aegis plugin newscaffolds a guardrail, node, provider or exporter package with passing contract tests;aegis plugin testruns an independent conformance check. Public pack API inaegis_core.packs. - Provider plugins — any non-built-in provider
type:loads from theaegis.providersentry-point group. - PII detection controls —
entities,thresholdandallow_listoptions, a Luhn-checked Canadian SIN recognizer, and consistent placeholders (the same value keeps the same placeholder for the whole run). - Durable runs —
aegis serve --runs-db(SQLite) keeps runs, event logs and paused approvals across restarts. aegis serve --demo— per-visitor rate limiting for public demos.GET /v1/modelsfor OpenAI-compatible UIs such as Open WebUI.aegis policy lintchecks: unenforceable stages (AEG-POL-004), endpoint-region vs. declared residency (AEG-POL-005), and uninstalled exporter types (AEG-POL-006).- Release automation: tag-triggered PyPI publishing with Trusted Publishing, GitHub Releases from this changelog, and the Hugging Face demo deployed from
deploy/huggingface/. Every package has a PyPI description. - A new documentation site, with this changelog on it.
Fixed
anthropicandopenai_compatibleproviders could not be built fromaegis.yaml; self-hosted model names behindopenai_compatiblenow work.- Budgets never accumulated spend.
- Chat runs were always recorded as
completedwith no events; blocked and paused chats now returnfinish_reason: content_filter. - A paused run lost the verdict that paused it, so
aegis explainand the approvals UI couldn't show why it was waiting. ChromaVectorStore.query()ignored the query vector; short namespaces crashed Chroma.- Demo rate limiting died after 100 lifetime requests and shared one quota across all visitors behind a proxy.
- The showcase page only offered the
defaultroute and never listed paused runs for approval.
[2.0.0a0] - 2026-06-21
First public alpha on PyPI (tagged v0.1.0 in git).
- Kernel — typed
aegis.yamlconfiguration,secret://resolution, entry-point plugin discovery, and a LangGraph pipeline of ingress → execute → egress nodes compiled per route. - Four-verdict guardrails —
allow,sanitize,block,require_approval, with checkpointed pause/resume andaegis runs approve | deny. - APIs — OpenAI-compatible
/v1/chat/completions(with SSE streaming and capability negotiation) and the native/v1/runsAPI; API-key auth withaegis keys. - Providers — LiteLLM-backed providers, any OpenAI-compatible endpoint, and a
fakeprovider for zero-credential development. - Policy packs — PII masking (Presidio), LLM Guard, classification, residency and budgets.
- Tool and retrieval governance — MCP tool-call and tool-result guards, and a guarded RAG retrieval node with Chroma and pgvector stores.
- Observability — OpenTelemetry run spans and Prometheus metrics.
- Tooling — the
aegisCLI (init,serve,chat,doctor,policy lint | test,plugin,provider,rag), Python and TypeScript SDKs, an OpenAPI spec, contract test kits, and a showcase page with a Hugging Face demo.