Changelog

2026-09-16

  • Tell odnoga when a stop is expected. Some stops are the job finishing rather than the job breaking — a backfill that has drained, a migration that has completed, a feature you retired. Mark the caller expected, from the alert or from the list, and it stops being reported. Not a mute: watching stays on, and by default the expectation lasts only until that caller calls again, so if the job ever runs and stops again you are still told. Give it a number of days instead when you are pausing something on purpose. Through MCP: traffic.expected.set / .clear.

  • Traffic health reads correctly on a new caller, and on longer windows. A caller's normal is the median of its own past windows, and windows from before that caller existed were being counted as silence — which dragged a young caller's normal towards zero and could report a busy new function as having too little traffic to judge, most visibly when comparing over a day rather than six hours. A caller's history now starts at its first call, and each one shows how many windows it has and when it was first seen, so "not judged yet" says when it will be. The last-call time is now the actual last call rather than the start of the window it fell in, and an alert carries the window it was judged at.

  • Traffic health — odnoga tells you when one of your callers stops. Every app and function you send through the gateway is measured against its own normal. If one stops calling, or suddenly calls far more than usual, you are told — with the number that is normal for it, how far off it is now, and, crucially, how many calls odnoga refused in the same window. When that number is zero we say so plainly: every request we received succeeded, so the change is on your side and you know where to look in the first minute. Under Workspace → Functions, organisation-wide under Tenant admin → Traffic health, and through MCP as traffic.health. Included on Extend and Enterprise; available as an add-on on Growth.

  • Tuned so it does not cry wolf: a caller is compared against the median of its own recent windows, must be under the threshold for two windows in a row before anyone is emailed, has a volume floor beneath which it is not judged at all, and a cooldown. You are told once when traffic recovers, so silence never has to be interpreted. Nothing is ever sent while an odnoga incident is open.

  • Concurrent sessions are now a thing you can see, size and buy. Tenant admin → Finance shows your pool, where each session came from (included with your plan, granted by odnoga, or purchased), what every workspace is using, and the busiest moment in the last 30 days — so you can tell "we need more" from "we peak at 5 of 100". Extra sessions go on your existing subscription, prorated; remove them the same way.

  • Going over your session pool no longer breaks your product. By default the call is served and the response carries x-odnoga-pool-exceeded plus a readable Warning header; nothing extra is charged. Your admins see it counted per day next to the smallest purchase that would have covered it. If you would rather be refused than served over your ceiling, ask support and we will enforce it for you.

  • A new error code, capacity_unavailable: odnoga itself is at capacity, not you. Retry after the Retry-After; nothing on your side will fix it and nothing you buy will either.

  • Batch traffic is now attributed. Jobs submitted with x-odnoga-app / x-odnoga-function carry that identity onto every request they produce, so batch work shows up in the functions list, in the request-log filters and in traffic health instead of pooling into "unattributed".

  • New doc: Concurrent sessions — what a session is, the two ceilings and which one bit, the 429 contract, and how to size a worker pool. Headers reference updated.

2026-08-21

  • Response shape is now a workspace choice: OpenAI-translated (default) or the raw vendor body, with a tenant-level default and lock. Every response carries x-airouter-response-format (openai | native); streamed responses are always OpenAI-shaped. Configure under Workspace → Models → Response format.
  • Token headers are the billing record: every non-streamed response carries x-airouter-prompt-tokens / x-airouter-completion-tokens / x-airouter-total-tokens alongside x-airouter-cost-usd — read usage from these, never by parsing the body (whose shape is now a setting).
  • Vendor batch routing: /v1/batches jobs are handed to the vendor's own Batch API at a genuine 50% discount — OpenAI, Anthropic and Google live. Honest billing semantics: billing_tier is what you are actually charged, fallback_reason says why a job lost the vendor route, fault + odnoga_note read the vendor's verdict for you, and per item billed_tier in the results is authoritative.
  • New Batch jobs page (Workspace → Batch jobs) showing status, execution mode, billed tier and fallback reason per job.
  • _odnoga echo hardened: adds vendor_model (the dated snapshot the vendor reports serving — provenance, never a pricing key). End-user token (eut_) responses are redacted: cost basis and vendor identity never reach your end-users.
  • Prepaid-always billing: usage is always debited from prepaid credits at your plan's margin (Free 6%, Growth 5%, Extend 4%); paid plans ($5/mo Growth, $49/mo Extend) are the base fee only and buy the lower margin. A lapsed base fee keeps plan rates for a 2-day grace window, then reverts to Free rates — credits never freeze.
  • Docs: headers reference, concepts, streaming and cost-control updated for all of the above.
  • xAI batch is live at the vendor's real 20% (grok-4.3 and the grok-4.20 family only — the discount is model-gated by xAI, not by odnoga; other models fall back to standard with the reason on the record). grok-4.3 (1M context) joined the catalogue.
  • New pricing APIGET /v1/pricing: the price list your workspace pays, margins included, with per-vendor service-tier multipliers and region uplifts. End-user tokens are refused; end users buy at your published plans.

2026-05-30

  • Docs rewrite: full restructure into Quickstart / Concepts / Best practices / SDKs / Ops / Headers / Errors / Troubleshooting.
  • New in-app Docs route at /workspace/:slug/odnoga/docs.
  • Promoted x-airouter-end-user to a first-class step.
  • Added callodnoga() shared-helper pattern.
  • Added per-SDK cookbooks for OpenAI Node/Python, Anthropic, LangChain, Vercel AI SDK, @odnoga/node.