PR #1203 landed in the gonka repository on 2026-05-20, merged by @qdanik (Daniil Yankouski). It teaches the devshard gateway — the layer that takes OpenAI-style chat requests from clients and forwards them to Gonka's inference backends — to understand reasoning and thinking parameters instead of rejecting them. The change touches 16 files, adds 1,167 lines, and removes 187.

What changed

Many OpenAI-compatible clients (Hermes Agent, OpenRouter, Kilo, the Kimi migration tooling) send parameters that Gonka's current backends do not consume. Until now the gateway answered some of those with a 400 error, which broke compatibility for no security gain. PR #1203 adds dedicated handlers under devshard/cmd/devshardctl/paramvalidators/:

  • reasoning_effort — validated against the enum none|minimal|low|medium|high|xhigh, then stripped, because the models in service today are non-reasoning. A ModelScopedParameterHandler{Models: nil} marks the exact spot to flip from strip to forward once a reasoning-capable model is routed.
  • reasoning — the OpenRouter unified reasoning object is decomposed into a top-level reasoning_effort, honoring enabled: false as an opt-out.
  • enable_thinking — translated to its canonical Qwen3 placement, chat_template_kwargs.enable_thinking, so a client does not need to know where the field belongs.
  • safety_identifier — OpenAI's replacement for the older user field. It is forwarded to moonshotai/Kimi-K2.6 and silently stripped elsewhere.

A new pre-pass in VLLMParameterCatalog.Apply unwraps the client-side extra_body envelope, lifting its inner keys to the top level before unknown-parameter rejection runs. The motivating case came from real traffic: a client sent extra_body["thinking"] and had the field silently dropped.

The PR also fixes a pre-existing silent-data-destruction bug. When a client sent a malformed chat_template_kwargs alongside a thinking field, the validator overwrote the client's value with a synthetic map. A new getOrCreateChatTemplateKwargs helper now returns ErrChatTemplateKwargsShape (a 400) instead, matching how every other shape error in the catalog is handled.

Why it matters

For a developer pointing existing OpenAI or OpenRouter tooling at Gonka, the gateway now accepts the reasoning and thinking parameters those tools emit, rather than refusing the request outright. Parameters the backend cannot use are validated and dropped quietly, so a request that should work does work. The chat_template_kwargs fix closes a path where a client's input could be silently replaced — the gateway now either honors the value or returns a clear error.

Every accept, reject, and strip decision is documented in devshard/docs/supported-params.md. The change ships with 23 new unit tests and more than 15 end-to-end pipeline tests, and go test ./... passes both the devshardctl and paramvalidators packages.