Request records

Column definitions.

The account page offers one gzipped CSV per UTC day with a row for every request you sent through Kottos AI, exactly as the tape recorded it. This page explains the columns in order they appear in the file.

How to read the values

Basic definitions

Request and identity

For each row, what identifies each request, who sent it, and where it went.

#ColumnUnit or typeMeaning
1t0_utcdate-time, UTCWhen the gateway had your whole request, as YYYY-MM-DD HH:MM:SS in UTC, to the second.
2gateway_ididThe Kottos AI gateway node that served the request.
6tenantidYour account's numeric id; every row in your file carries the same one.
7statusHTTP statusThe HTTP status your client received; 0 on a hedge leg that was cut because another leg won.
8venue_ididThe venue that served the request: a provider and, where it has several, a region (for example a Bedrock region).
9product_ididThe listing that was bought at that venue, which names the model and its grade.
10steptextThe step your request named in the x-kottos-step header, empty when it named none.
11run_idtextThe run id your client sent, stored exactly, so you can sum cost and time per run.
43request_bytesbytesThe size of your request as it reached the gateway, headers and body; empty on rows that did not record it.
54venue_req_ididThe venue's own id for the request; quote it in a support ticket with that provider. Empty when the venue sent none.

Tokens and usage

We store the usage venues report. Counts are tokens by default unless the name says requests or calls.

#ColumnUnit or typeMeaning
12tokens_intokensInput tokens the venue reported, including the cached and cache-write parts below; 0 when the venue stated no count (flags2 bit 8).
13tokens_outtokensOutput tokens the venue reported, including reasoning tokens.
14cachedtokensThe part of tokens_in served from the venue's prompt cache, billed at the cheaper cache-read rate.
15cache_writetokensThe part of tokens_in written to the venue's prompt cache.
16cache_write_5mtokensOf cache_write, the tokens written with a five-minute lifetime.
17cache_write_1htokensOf cache_write, the tokens written with a one-hour lifetime, which venues price higher.
18cache_write_unsplitflag 0/11 when the venue gave a cache-write total without the lifetime split, so the two columns before it are 0 because nothing measured them.
56reasoning_tokenstokensReasoning tokens the venue reported, part of tokens_out; empty when the venue stated none of these details.
57audio_in_tokenstokensAudio input tokens, priced at their own rate; empty when the venue stated no details.
58audio_out_tokenstokensAudio output tokens, priced at their own rate; empty when the venue stated no details.
59accepted_prediction_tokenstokensOpenAI predicted-output tokens that were accepted; empty when the venue stated no details.
60rejected_prediction_tokenstokensOpenAI predicted-output tokens that were rejected, billed but never shown; empty when the venue stated no details.
61tool_prompt_tokenstokensTokens Gemini added to the prompt for its server tools; empty when the venue stated no details.
84image_in_tokenstokensImage input tokens, part of tokens_in. Empty on rows written before 0.95.0 recorded the venue's extra usage.
85web_search_requestsrequestsServer-side web searches the venue billed per call; in actual_cost_udollars, not in the fee. Empty on rows written before 0.95.0 recorded the venue's extra usage.
86web_fetch_requestsrequestsServer-side web fetches the venue billed per call. Empty on rows written before 0.95.0 recorded the venue's extra usage.
87code_exec_requestsrequestsServer-side code executions the venue billed per call. Empty on rows written before 0.95.0 recorded the venue's extra usage.
88file_search_callscallsFile search calls counted from a Responses API reply. Empty on rows written before 0.95.0 recorded the venue's extra usage.
90compaction_in_tokenstokensInput tokens of Anthropic context-compaction passes, billed by the venue beside the main counts and included in actual_cost_udollars; the Kottos AI fee does not charge them. Empty on rows written before 0.95.0 recorded the venue's extra usage.
91compaction_out_tokenstokensOutput tokens of those compaction passes. Empty on rows written before 0.95.0 recorded the venue's extra usage.
92compaction_cached_tokenstokensCached input tokens of those compaction passes. Empty on rows written before 0.95.0 recorded the venue's extra usage.
93prior_in_tokenstokensInput tokens of attempts the venue declined before a fallback model ran (see prior_model); not in actual_cost_udollars. Empty on rows written before 0.95.0 recorded the venue's extra usage.
94prior_out_tokenstokensOutput tokens of those declined attempts. Empty on rows written before 0.95.0 recorded the venue's extra usage.
95prior_cached_tokenstokensCached input tokens of those declined attempts. Empty on rows written before 0.95.0 recorded the venue's extra usage.
96prior_cache_write_tokenstokensCache-write tokens of those declined attempts. Empty on rows written before 0.95.0 recorded the venue's extra usage.
97prior_attemptscountHow many attempts the venue declined before the fallback. Empty on rows written before 0.95.0 recorded the venue's extra usage.
114tokens_out_unknownflag 0/11 when the venue stated the input count and left only the output count unstated; 0 on rows before 0.110.0.

Price and cost

Quoted prices, request cost at quoted prices, and Kottos AI fee.

#ColumnUnit or typeMeaning
19quote_in_utokmicro-dollars per million tokensThe listing's input price when the request was routed; divide by 1,000,000 for dollars per million tokens.
20quote_out_utokmicro-dollars per million tokensThe listing's output price when the request was routed, in the same unit.
53actual_cost_udollarsmicro-dollarsWhat the request cost at the listing's list prices, every token class at its own rate, the same prices the estimate used; empty when it could not be priced.
76kottos_fee_pdollarspicodollarsThe Kottos AI fee for this request, final, in picodollars (divide by 1e12 for dollars); 0 on a refused or failed request, empty where not recorded.
89venue_cost_pdollarspicodollarsThe venue's own stated price for the request (DeepInfra states one), a check on actual_cost_udollars; empty where the venue stated none.

Timing

Durations are in microseconds unless stated differently (1,000 µs is one millisecond).

#ColumnUnit or typeMeaning
21client_upload_usµsHow long your request took to arrive, from its first byte to its last; 0 when it arrived in one read, as small requests do.
22gateway_usµsThe gateway's own work on the request, excluding the connection handshake and the provider; on a streamed body much of it overlaps your upload, so read added_us for the wait we added.
23connect_usµsThe TCP and TLS handshake to the venue; 0 when a pooled connection was reused.
24upwrite_usµsWriting the request to the venue's connection, part of gateway_us; it grows with request_bytes.
25ttfb_usµsFrom the end of your request body to the venue's first response byte; 0 unless the request was streamed.
26ttft_usµsFrom the end of your request body to the first visible content token.
27first_thinking_usµsFrom the end of your request body to the first reasoning token; 0 when the model did not reason. ttft_us minus this is time spent reasoning.
28max_chunk_gap_usµsThe longest silence between two chunks after the first visible token; 0 without two chunks to measure.
34upstream_usµsFrom the last byte of your request reaching the venue to the venue's response head.
35total_usµsFrom the gateway having your whole request to the end of its reply.
62upstream_min_rtt_usµsThe lowest network round trip to the venue the kernel had measured on the connection; empty when not recorded.
63upstream_srtt_usµsThe smoothed network round trip to the venue at its response; empty when not recorded.
64body_streamedflag 0/11 when the gateway forwarded your request body to the venue while it was still arriving, instead of waiting for its last byte.
65body_cut_shortflag 0/11 when the venue answered before your whole body was in or sent; the rest was read and dropped.
66body_end_usµsWhen your body's last byte arrived, counted from the request start; 0 for a held body and for one cut short.
67body_sent_usµsWhen your body's last byte was handed to the venue's connection, counted from the request start; the venue's wait starts here.
68body_work_usµsGateway work on a streamed body after the request was framed, part of gateway_us; 0 for a held body.
83added_usµsThe wait the gateway added to your request: our time after your last byte, not work done while you were still uploading. On rows before 0.91.0 it repeats gateway_us.

Errors and limits

We track what failed, and what a venue says about its own limits.

#ColumnUnit or typeMeaning
29quota_exhaustedcodeWhich venue limit was exhausted: 0 none, 1 requests, 2 input tokens, 3 output tokens, 4 tokens.
30retry_after_ssecondsThe venue's Retry-After value, 0 when it sent none.
31upstream_errornameHow the venue described a failure, empty when it did not fail (names below).
32gateway_replyflag 0/11 when the gateway wrote the reply itself (for example a refusal) and no venue produced it.
39attemptcount0 on the first upstream attempt; higher when earlier attempts failed and the request was retried or failed over.
69stream_truncatedflag 0/11 when a stream ended without its clean finish (a timeout, a reset or a cut from the venue); its token counts may be incomplete.
70client_encodedflag 0/11 when your client sent a compressed request body, which the gateway refuses; this is why.

upstream_error names: unnamed (the venue failed and its body named nothing readable), other, invalid_request, context_length, authentication, permission, not_found, request_too_large, rate_limit, quota (billing, not pacing), api (the venue's own 5xx), overloaded, timeout.

Routing decision

We store the values that let us understand the routing decisions for each request.

#ColumnUnit or typeMeaning
44prefix_hashhash, 16 hex digitsA hash of the request's leading bytes; rows sharing one are turns of the same conversation. Empty when no route asked for it.
45predictedflag 0/11 when the cost-aware router estimated this request, which fills the expected_* columns.
46expected_cost_udollarsmicro-dollarsThe estimated cost at the venue that was picked. Empty when the cost estimate did not run (see predicted).
47expected_cost_best_udollarsmicro-dollarsThe estimated cost at the cheapest candidate venue. Empty when the cost estimate did not run (see predicted).
48expected_tokens_intokensThe input tokens the estimate assumed; compare with tokens_in. Empty when the cost estimate did not run (see predicted).
49expected_cached_tokenstokensThe cached tokens the estimate assumed; compare with cached. Empty when the cost estimate did not run (see predicted).
50warm_guesscodeThe router's guess about the venue's cache: 0 cold, 1 warm, 2 no cache for this request. Empty when the cost estimate did not run (see predicted).
51route_switchflag 0/11 when the pick moved this conversation to a different venue from its previous turn. Empty when the cost estimate did not run (see predicted).
52expected_tokens_outtokensThe output tokens the estimate priced; compare with tokens_out. Empty when the cost estimate did not run (see predicted).
73decided_on_headflag 0/11 when the router chose the venue from the start of your body, before it had all arrived.
74confirm_outcomenameWhat the check at the body's last byte made of that early choice: none, kept, redone (sent again under a new decision) or refused.
75wasted_uploadflag 0/11 when an early choice was redone or refused after a venue had already received part of the body.
78step_fell_backflag 0/11 when your request named a step your account does not configure, so the default route served it; empty when unknown, including rows before 0.89.0.
79step_cutflag 0/11 when the step value was longer than 48 characters and the step column holds only its start; empty on rows before 0.89.0.
107decisionnameThe route's objective: ordered, expected_cost, escalate or hedge. Empty when no routing decision was recorded for the row (a refusal before routing, or rows before 0.110.0).
108decision_whynameWhy the rule decided as it did, read with decision (names below); empty when the rule had nothing to add.
109predicted_venuenumberThe position in the venue table of the venue the decision picked; when it differs from the serving venue, failed_over is 1. Empty when no routing decision was recorded for the row (a refusal before routing, or rows before 0.110.0).
110failed_overflag 0/11 when the request was served by another venue than the decision picked, after a failure. Empty when no routing decision was recorded for the row (a refusal before routing, or rows before 0.110.0).
111escalate_signaltokensThe number the rule compared: prompt tokens for an escalation on context or a hedge cap, the last reply's reasoning tokens for an escalation on thinking; 0 when none. Empty when no routing decision was recorded for the row (a refusal before routing, or rows before 0.110.0).
112expected_cost_current_udollarsmicro-dollarsThe estimated cost at the conversation's current venue, the one the switch threshold compared the cheapest against; 0 when the conversation had none. Empty when the cost estimate did not run (see predicted).
113measured_cached_extenttokensHow much of the prompt the venue was measured to hold in cache when last seen; filled only on a warm guess.

decision_why by decision: for expected_cost, empty when the cheapest venue was chosen or the conversation moved, held_by_floor when a cheaper venue existed and the switch threshold kept the current one; for escalate, empty on the first model, context or thinking for the rule that moved it up; for hedge, hedged when it raced venues, otherwise why it went to one venue: over_cap (prompt over the hedge cap), no_keys (no key per venue), model_unsold, one_venue (no second healthy venue) or held (the decision never completed). The routing block from decision to expected_cost_current_udollars was added in 0.110.0.

Hedging

For hedged requests we store each leg's information.

#ColumnUnit or typeMeaning
104hedge_groupidShared by every leg of one hedged request, so you can group them; empty when the row is not a hedge leg.
105hedge_legnumberWhich leg this row is, 0 being the decided venue's own leg; empty when not a hedge leg.
106hedgenameHow the leg ended: won (it served you), cut (another leg won first; no fee) or failed; empty when not a hedge leg.

Model and tier

We store the model and grade you asked for, and what the venue tells us it served.

#ColumnUnit or typeMeaning
33served_tiernameThe service tier the venue said it served: default, flex, priority, scale, batch, reserved, auto or other; empty when it named none.
42requested_modeltextThe model you asked for, filled only when it is not listed at the serving venue, so the row was priced as the route's product; at most 32 characters.
71asked_modeltextThe model named in your request body, empty when it named none.
72served_modeltextThe model the venue's reply named, which is what you were served; often a dated id for an alias you asked for.
77model_substitutedflag 0/11 when the venue was sent the route's model in place of the "auto" your client asked for.
80tier_splicedflag 0/11 when the listing's service tier was written into a body that streamed to the venue, replacing your own value.
81speed_splicedflag 0/11 when the listing's speed setting was written into a streamed body, replacing your own value.
82geo_splicedflag 0/11 when the listing's inference region was written into a streamed body, replacing your own value.
98prior_modeltextThe model the declined attempts ran on, before the venue fell back. Empty on rows written before 0.95.0 recorded the venue's extra usage.
99served_speedtextThe speed the venue said it served, in its own words (Anthropic's usage.speed). Empty on rows written before 0.95.0 recorded the venue's extra usage.
100served_geotextThe inference region the venue said it served (Anthropic's usage.inference_geo). Empty on rows written before 0.95.0 recorded the venue's extra usage.
101served_latencytextThe latency setting the venue said it served (Bedrock's latency header). Empty on rows written before 0.95.0 recorded the venue's extra usage.
102served_other_gradeflag 0/11 when the venue served a speed or region other than the listing buys, so the listing's rates, cost and fee do not fit the row. Empty on rows written before 0.95.0 recorded the venue's extra usage.
103asked_cache_ttltextThe cache lifetime your request asked for in prompt_cache_options.ttl. Empty on rows written before 0.95.0 recorded the venue's extra usage.

Internal diagnostics

These are Kottos AI columns we use to reconcile and debug the tape.

#ColumnUnit or typeMeaning
3instance_nonceidInternal: a random number per gateway process start; with gateway_id and seq it identifies a row uniquely.
4workeridInternal: the gateway worker thread that handled the request.
5seqidInternal: a per-process request counter that restarts at 0; unique only with gateway_id and instance_nonce.
36snapshot_ididInternal: the routing snapshot the decision used; 0 when none.
37venues_versionidInternal: the version of the venue table in force.
38venue_table_hashhashInternal: a hash of the venue table in force.
40flagsbitfieldInternal bitfield, printed as a number (bits below).
41flags2bitfieldInternal bitfield, printed as a number (bits below).
55upstream_ipIPv4 addressInternal: the venue address the gateway connected to; empty when none was dialled.