drop_tuning_params field, which is consumed before forwarding, so whatever the provider accepts, you get. For the translated lanes (Anthropic, Bedrock, Gemini, Vertex) the gateway builds the provider-native request itself, and every parameter follows an explicit policy:
- mapped: translated faithfully to the provider’s native field.
- dropped: a tuning parameter with no equivalent on the lane. By default it is removed, the request proceeds, and the drop is signaled (see below). It is never silently ignored.
- refused: the request depends on the parameter functionally; honoring the request without it would change what you observably get. These always fail with a clear
400 unsupported_parametererror naming the parameter, the lane, and why.
drop_tuning_params
Send"drop_tuning_params": false in the request body to opt into strict mode: any parameter the lane cannot map then refuses instead of dropping. The default is true. The field itself is consumed by the gateway and never reaches a provider.
Drop signals
When a parameter is dropped, the drop is visible in three places:- Response body:
extra_fields.params_droppedlists the dropped parameter names (on streams, on the final usage-bearing chunk). - Response header:
X-LangWatch-Params-Droppedcarries the same list, comma separated. - Trace: the gateway span records
langwatch.gateway.params_dropped.
The table
The codex lane
Codex models (your own ChatGPT subscription, model prefixopenai_codex/) speak the Responses API. The gateway builds the outgoing body itself, so every provider-bound field you send is mapped, dropped or refused by the table below, exactly as above. The codex backend accepts only a fixed set of fields and answers 400 Unsupported parameter to anything else, which is why every key the table does not list is dropped rather than forwarded. The gateway also pins three invariants the backend requires: the bare model name, stream on, and store off. Dropped fields are signaled on the X-LangWatch-Params-Dropped header and the gateway span; the response body is the backend’s own SSE stream, so extra_fields.params_dropped is not injected into it. drop_tuning_params works on this lane too.
reasoning_effort budgets
On lanes that mapreasoning_effort to a thinking budget (Anthropic models without adaptive thinking, on both the anthropic and bedrock lanes), the budget is derived from your output cap: budget = 1024 + ratio x (max_tokens - 1024) with ratios minimal 0.025, low 0.15, medium 0.425, high 0.80, xhigh 0.92, max 1.0. Claude Opus and Sonnet 4.6+ use the provider’s adaptive thinking with your effort passed through (minimal maps to low). Gemini thinking models receive the effort natively. Thinking tokens count inside usage.completion_tokens.