Skip to content

Changelog

Notable user-facing changes per release.

Unreleased

Media plane parity/v1/images/* and /v1/audio/* now run on the same accounting, enforcement, and reliability machinery as chat. See Media backends.

Two behavior changes to read before upgrading

1. Media requests can now be refused by a budget. They previously cost $0 to the budget engine, so no image or audio request could exceed any cap no matter how many it generated. They are now priced from a media rate card and reserved before the upstream call, which means a request that would breach a hard cap gets a 402 instead of being served. If you run tight budgets, check your caps before upgrading.

2. Image and audio spend now appears in cost reports and the Advisor, where it previously read $0. Historical rows are unaffected — only new requests carry cost — so totals will step up from the upgrade date rather than being restated.

Budget enforcement changes in this release

Temporary budget increases are now bounded to 90 days by default. POST /api/budgets/{id}/increase rejects an expires_at further out than MERIDO_MAX_BUDGET_INCREASE_DAYS (default 90) with a 400, because an unbounded increase permanently defeated max_key_budget_usd. Set it to 0 to restore the old unlimited behavior.

Budgets now enforce end-to-end where they previously leaked. Multi-call virtual-model strategies (fusion, pipeline) settle their budget reservation to the real multi-call total instead of one call's; a pipeline that fails mid-chain still books the completed steps' spend; /v1/audio/* and /v1/embeddings reserve and settle budgets like chat; and a shared (Redis) counter reserves atomically across instances. Orgs running close to a hard cap may see 402s where spend previously slipped past the counter.

  • Media pricing. A rate card priced per image, per second of audio, and per character of synthesized speech, resolved operator override → synced snapshot → built-in, exactly like the token card. Set overrides under Pricing, or via PUT /api/pricing/overrides with per_image_usd / per_second_usd / per_character_usd. Transcription is the one gap: Whisper-shaped upstreams do not report audio duration, so those rows record $0 rather than an invented estimate.
  • Media requests appear in Logs. Provider, model, latency, cost, every fallback attempt, and the reason a request was refused before it reached a provider. Uploaded media and generated image data are never stored — an image response is logged as a summary ({"images": 2, "format": "b64_json"}). Usage rows are now written for failed requests too, with the status the caller got.
  • Virtual models for images. A virtual model can now route /v1/images/* with the same strategies and automatic failover as chat. Set Routes for → Image in the editor, or pass "modality": "image". Existing virtual models are all text and are unchanged; a text route is no longer resolvable from /v1/images/* and vice versa.
  • Bare model ids resolve. {"model": "gpt-image-2"} now works when exactly one enabled backend serves that model — which is what OpenAI-compatible clients actually send, since they strip the provider prefix on their side. Ambiguity is refused with a 400 naming the candidates rather than guessed at.
  • Codex image generation rotates accounts. It previously took the first signed-in account and stopped, so a throttled account took image generation down for the org. It now honors the account's allowed_models, model locks, the circuit breaker, and max_inflight, and falls over to the next account on a retryable failure.
  • Audio fails over across connections. /v1/audio/* walks the org's connections in priority order instead of taking the first one, matching chat and /v1/images/*.
  • GET /v1/models/image lists your image virtual models alongside concrete models.

v0.1.0

The first documented release. merido is a local-first, OpenAI-compatible AI gateway in Rust that ships as a single binary serving the API, the dashboard, a landing page, and these docs on one port.

Gateway & request path

  • OpenAI-compatible data plane: /v1/chat/completions, /v1/messages (Anthropic), /v1/responses, /v1/embeddings, /v1/images/generations, /v1/audio/*, /v1/models, and more — all translated through one canonical representation.
  • Routing to 40+ upstream providers via API key or OAuth, with encryption at rest.

Routing & reliability

  • Virtual models with failover, load_balance, weighted, cost_optimized, and latency_based strategies.
  • Cost/latency/health-aware target selection, fallback across accounts → targets → tiers, and a circuit breaker with cooldowns.

Token saving & caching

  • Automatic tool_result compression filters and opt-in Caveman output-compression mode.
  • A savings ledger (/api/savings, merido gain).
  • Exact request dedup and an opt-in semantic cache with a precision guard and revalidation sampling.

The Token-Optimization Advisor

  • Usage analysis with recommendations (merido advise / discover, /api/advisor).
  • An apply engine with a probation window and auto-rollback.

Deploy & operate

  • Profiles: local (SQLite, single-user) and cloud (Postgres, multi-tenant).
  • Docker and Fly.io deployment; production hardening via a dashboard password hash and required API keys.
  • Opt-in self-serve multi-tenancy and Redis-backed high availability.
  • merido migrate to move data between SQLite and Postgres; Helicone import.

© merido. All rights reserved.