A route is never a black box.
Every request keeps a structured record — grade, chosen model, provider, latency, token counts, cost, and why it failed if it did.
- Filter by key, model, group, request ID or type, and copy any request back out as a runnable cURL.
- Failures split into upstream and request-parameter errors, so the ones you can act on are separated from the ones you cannot.
- Turn on payload capture and the request body is retained apart from the log line, so you can prove exactly what was sent.
What broke, and whether it mattered
Errors are split into two buckets: upstream failures, and the request-parameter errors that are yours to fix. The parameter bucket breaks down per reason so you can go straight to the malformed field; the upstream bucket stays a count, because a provider’s bad afternoon is not a list you can action.
Every call, on the record.
Grade. Model. Provider. Latency. Tokens in, tokens out, tokens served from cache. What it cost. And when something failed, what failed and what picked it up. Not a sample — every request.
From a log line to a reproduction.
Find the request, copy it out as a runnable cURL, and you are debugging the actual call rather than your memory of it. Switch payload capture on and the body is kept apart from the log line, so you can prove what was sent long after the argument started.