Changelog
Release history and notable changes for Nexus
All notable, user-facing changes to nexus are recorded here. The format follows
Keep a Changelog, and nexus uses
Semantic Versioning. While nexus is pre-1.0 (0.y.z), minor
(y) bumps may be breaking and patch (z) bumps are non-breaking.
Release notes are generated from the Conventional Commits
log per CONTRIBUTING.md; feat: and fix: entries with a non-empty
scope are grouped by scope. Each tagged release moves the entries below from
Unreleased into a dated, versioned section.
[Unreleased]
Section titled “[Unreleased]”- Workspace managers can define string reporting dimensions, assign one value per dimension to an API key, and group or filter monthly workspace reports by the frozen request value.
- The gateway can serve in-browser API clients: setting
NEXUS_GATEWAY_CORS_ALLOWED_ORIGINSmakes it answer CORS preflights on its API routes and returnAccess-Control-Allow-Originon responses. It is off by default. - Opening the console’s Billing page applies a due wallet auto-refill, so the balance shows the new allowance before the workspace’s next request.
- The dev stack’s Grafana is built locally with the ClickHouse data source installed, so it no longer downloads the plugin from grafana.com at startup.
- Workspace managers can turn full tracing on for a whole workspace, and
NEXUS_FORCE_TRACE_LOGGING=1turns it on platform-wide. The console shows a tracing toggle under a tracing parent as inherited and disabled.
Changed
Section titled “Changed”Model registry
Section titled “Model registry”-
Registry artifacts are now one signed JSON document per provider source — a human-readable
catalogtable (model, capabilities, aliases) and aratestable (per-meter prices in USD per million tokens, with context bands and effective intervals) — replacing the eight-file manifest/JSONL bundle. Each artifact is the complete catalog for its provider: applying it replaces that provider’s registry state, and every record it no longer carries is planned as an explicit, approval-gated retirement (tombstones are gone). -
nexus registry import <artifact.json>is now a single command: it validates the artifact, prints a plan-style summary (N to add, M to change, K to retire) with colored findings, asks for confirmation, and applies.--dry-runstops at the plan,--yesskips the prompt, and--checkvalidates offline without a database. The provider is read from the artifact, and unsigned artifacts no longer need an opt-in flag —--expected-key-idwith--verifying-key-pathrequires and verifies a signature instead. The separatevalidate,prepare,show,approve,reject, andapplysubcommands are gone; the change-set record, approval binding, and audit trail behind them are unchanged. -
The import plan no longer restates records that already match the registry: model rows are diffed against the baseline like every other dataset, and artifact source evidence (written with the change set, never registry state a reviewer decides on) is left out of the plan entirely. Re-importing an unchanged catalog now reports
up to dateinstead of several hundred no-op upserts. Two further sources of that noise are gone: alias and support classification rows are diffed on meaning only, so re-scraping unchanged content no longer replans every row just because the source digest moved, and a rate card that is already active with the same rates no longer reportsactivation_overlapagainst itself. A genuine reprice on the same effective interval still requires approval. -
An import for a provider that does not yet serve a canonical model now diffs against the shared model row another provider already created, instead of planning it as a new row and silently overwriting it. This matters most for Azure AI Foundry, which serves the same model ids as OpenAI: rewriting shared model metadata is now reported as a change, and the existing
shared_model_capability_changehard reject (previously unreachable for a provider’s first import of a model) refuses reasoning or modality changes that would follow another provider’s endpoints. -
The OpenAI collector now reads all three surfaces its pricing page states prices through, instead of only the server-rendered tables. Those tables publish just the newest chat models, so the o-series, the
gpt-4oandgpt-4.1families,gpt-5/mini/nano/pro, the embedding models, and the image models collected no rates at all and shipped disabled despite being supported. Their prices live in the pricing components’ props (every text model, including the ones the page renders client-side) and in the grouped props tables (per-modality image pricing, and the category tables covering embeddings, ChatGPT, and Codex). A generated OpenAI catalog now enables 37 models rather than 9. The rendered tables remain the only source of the computed long-context (>=272Kinput tokens) split, so they still define a model’s context bands; where two surfaces state the same band they must agree on the amount, and a disagreement fails generation rather than picking one. Figures the contract cannot express — per-minute audio, per-second video, per-call tools, fine-tuning training hours,Free— are left uncollected, so a model is never priced from a misread cell. -
The supported-pricing manifest no longer classifies a priced model as an alias of another model, taking a generated OpenAI catalog from 37 enabled models to 50. An alias is a second name for one endpoint, so it is removed from the catalog and attached to its target — and because rate collection keeps only rows whose model is a catalog entry, that also discarded the prices OpenAI publishes for the aliased name. Thirteen keys were classified that way on the strength of their prices matching their stated target’s:
gpt-5.1, the Codex models, each*-chat-latest, andchatgpt-image-latest. All are distinct models with published rates and are now served as such, on their own prices and with their own upstream model ids. Generation now fails listing any priced name the catalog does not carry, so declining to serve one is anunsupportedclassification with a reason rather than a silent omission. -
New
nexus-registry-generator from-csvturns two operator-authored CSVs (catalog + rates) into the same signed artifact form for isolated networks and custom provider sources;generatewrites one artifact per provider. -
New
nexus-registry-generator foundry-csv(just registry-foundry-csv) writes that CSV pair from a live Azure AI Foundry resource instead of by hand, usingAZURE_FOUNDRY_PROJECT_ENDPOINT(preferred, since it reports publisher and capabilities) orAZURE_FOUNDRY_OPENAI_ENDPOINTwithAZURE_FOUNDRY_API_KEY. Token limits and the capability flags the deployment listing never reports are left blank and named on exit;from-csvrefuses an incomplete pair by file, line, and column. -
foundry-csv --pricesfills the rates CSV from the Azure pricing pages, whose prices are server-rendered as per-region maps and so parse without a browser. A price is written only where the published model name and the deployment’s SKU scope match exactly (GlobalStandardagainst the page’sGlobalrow); a near name is reported as a miss rather than substituted. Only standard per-million-token meters are read, never provisioned, batch, priority, or fine-tuning columns, andCached Inputbecomes acache_read_tokenrate. The region defaults to the one the resource reports for itself and--regionoverrides it. Each filled price is printed with the row, section, region, and source page, andpricing-evidence.jsonrecords every price observed for every region plus the digest of each page as parsed. -
Corrected the documented Azure AI Foundry capabilities: the gateway has always streamed chat completions and forwarded the OpenAI tool fields for this provider, so the compatibility matrix and connection guide no longer claim otherwise. Tool support belongs to the deployment — a Foundry-hosted vLLM model such as
Phi-4-reasoningrefusestool_choice, and that upstream error reaches the caller unchanged — so catalog rows should carry what the deployment accepts instead of a blanket false. -
Rate cards, rates, and activations are now the single stored source of pricing truth. The legacy
model_registry_price_bandsandmodel_registry_price_versionstables and the flat price columns onmodel_registry_endpointswere dropped (migration 0007); every read surface projects flat rates and context bands from the endpoint’s active rate card, fixing tiered context-band pricing not appearing for endpoints imported through registry artifacts. -
The model endpoints API now returns the active rate card’s qualified rates, rate card id, source digest, and pricing status alongside the band/tier projections.
CI and release
Section titled “CI and release”- Documented the GitLab CI tiers, local reproduction commands, security gates, release-image signing, SBOM/provenance attestations, and consumer verification flow.
- Added a release-report step that uses an OpenAI-compatible LLM to turn verified release notes, image metadata, SBOMs, vulnerability scans, and provenance predicates into a human-readable GitLab Release report.
- An expired membership or registration invite no longer blocks a new invite for the same email and scope. Creating the replacement revokes the expired invite and records
membership_invitation.revokedin the audit log.
[0.1.0] - 2026-07-03
Section titled “[0.1.0] - 2026-07-03”Initial release of Vortex Nexus: a self-hostable, multi-tenant AI gateway and LLM observability platform — OpenAI-compatible and native Anthropic edges in front of your providers, with cost tracking, classification policy, tamper-evident audit, and agent tracing on a fully open-source data plane (Postgres, ClickHouse, S3-compatible object storage, NATS, Valkey).
Gateway
Section titled “Gateway”- OpenAI-compatible edge at
/v1: chat completions (JSON + SSE), Responses, embeddings, image generations/edits/variations, models, files, and vector stores with nexus-native pgvector search. - Native Anthropic Messages edge at
/anthropicwithcount_tokens, streaming, tool use, extended-thinking preservation, and prompt-cache token pricing; Claude Code works viaANTHROPIC_BASE_URL. - Provider/model routing grammar with caller-ordered fallbacks, retries, optional Redis-backed response cache, and per-key rate limits.
- BYOK-first attempt routing with opt-in escrow-backed pass-through billing
(
NEXUS_GATEWAY_PTB) and workspace/org/project spend caps.
Control plane and identity
Section titled “Control plane and identity”- Workspaces → organizations → projects with manager/auditor/user RBAC, invitations, registration codes, and deployment-wide OIDC.
- API keys, KMS-wrapped BYOK provider keys, operator platform keys, Stripe-backed wallet top-ups, and a live model registry with per-provider sync and price bands.
Observability and audit
Section titled “Observability and audit”- Request/session analytics in ClickHouse with usage rollups, HQL, feedback, and tenant exporters; OTLP agentic trace ingest under project-scoped keys with a console trace inspector.
- Per-tenant Merkle-chained audit events with signed batch roots, WORM archive
anchoring, inclusion proofs, and the
nexus-audit-verifyCLI. - Two-tier telemetry separation keeping tenant data out of operator OTLP, enforced by cardinality guards and collector processors.
Console and tooling
Section titled “Console and tooling”- Next.js console: onboarding, key management, storage, requests, sessions, traces, usage dashboard, limits, billing, and audit viewer.
nexusCLI for operator bootstrap, credentials, registry, and ops.- Compose dev stack with hot reload, Grafana LGTM stack, Helm chart,
justrecipes, and SDK certification suites for OpenAI and Anthropic.
Governance
Section titled “Governance”- ADR-tracked architecture decisions, STRIDE threat model, dependency license allowlist with cargo-deny/node enforcement, doc-lint in CI, DCO, CODEOWNERS security review gates, and a bounty program.
- Public changelog, security policy (
SECURITY.md), contributor governance templates (issue/MR templates, CODEOWNERS), and a published compatibility matrix.
