Skip to content
↑↓Navigate↵SelectescClose

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.

  • 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_ORIGINS makes it answer CORS preflights on its API routes and return Access-Control-Allow-Origin on 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=1 turns it on platform-wide. The console shows a tracing toggle under a tracing parent as inherited and disabled.
  • Registry artifacts are now one signed JSON document per provider source — a human-readable catalog table (model, capabilities, aliases) and a rates table (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-run stops at the plan, --yes skips the prompt, and --check validates offline without a database. The provider is read from the artifact, and unsigned artifacts no longer need an opt-in flag — --expected-key-id with --verifying-key-path requires and verifies a signature instead. The separate validate, prepare, show, approve, reject, and apply subcommands 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 date instead 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 reports activation_overlap against 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_change hard 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-4o and gpt-4.1 families, 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 (>=272K input 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, and chatgpt-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 an unsupported classification with a reason rather than a silent omission.

  • New nexus-registry-generator from-csv turns two operator-authored CSVs (catalog + rates) into the same signed artifact form for isolated networks and custom provider sources; generate writes 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, using AZURE_FOUNDRY_PROJECT_ENDPOINT (preferred, since it reports publisher and capabilities) or AZURE_FOUNDRY_OPENAI_ENDPOINT with AZURE_FOUNDRY_API_KEY. Token limits and the capability flags the deployment listing never reports are left blank and named on exit; from-csv refuses an incomplete pair by file, line, and column.

  • foundry-csv --prices fills 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 (GlobalStandard against the page’s Global row); 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, and Cached Input becomes a cache_read_token rate. The region defaults to the one the resource reports for itself and --region overrides it. Each filled price is printed with the row, section, region, and source page, and pricing-evidence.json records 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-reasoning refuses tool_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_bands and model_registry_price_versions tables and the flat price columns on model_registry_endpoints were 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.

  • 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.revoked in the audit log.

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).

  • 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 /anthropic with count_tokens, streaming, tool use, extended-thinking preservation, and prompt-cache token pricing; Claude Code works via ANTHROPIC_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.
  • 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.
  • 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-verify CLI.
  • Two-tier telemetry separation keeping tenant data out of operator OTLP, enforced by cardinality guards and collector processors.
  • Next.js console: onboarding, key management, storage, requests, sessions, traces, usage dashboard, limits, billing, and audit viewer.
  • nexus CLI for operator bootstrap, credentials, registry, and ops.
  • Compose dev stack with hot reload, Grafana LGTM stack, Helm chart, just recipes, and SDK certification suites for OpenAI and Anthropic.
  • 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.