# Phase 08 — Strip ignored params and validate temperature

**Estimated time:** ~15 minutes
**Touches:** `lib/dispatch/adapter/minimax/request_builder.rb`.

## Goal

Two related changes in `RequestBuilder.build`:

1. **Strip parameters MiniMax ignores** so the wire payload is clean.
   Per MiniMax's compatibility docs the following Anthropic parameters
   are *Ignored* by their endpoint: `top_k`, `stop_sequences`,
   `service_tier`, `mcp_servers`, `context_management`, `container`.
   Whatever shape they arrive in, they must not appear in the outgoing
   body.

2. **Validate `temperature`** to MiniMax's documented `(0.0, 1.0]` range.
   Outside that range MiniMax returns a 400. Rather than ship malformed
   requests, raise `ArgumentError` at build time when the value is `<= 0`
   or `> 1`. `nil` is allowed (means "don't send temperature, MiniMax
   uses its default").

## Steps

### 1. Open `lib/dispatch/adapter/minimax/request_builder.rb`

Locate the `RequestBuilder.build` method. It currently takes these
keywords:

```
model_id:, messages:, system:, tools:, is_oauth:, base_url:,
stream:, max_tokens:, thinking:, tool_choice:, cache_retention:,
metadata:, disable_strict_tools:
```

Phase 02 already removed the `is_oauth:` keyword from the callsite — make
sure it is removed from the parameter list here too. If it is not yet
removed, remove it now.

### 2. Add a `temperature:` keyword and a `top_p:` keyword

These are not currently exposed in `RequestBuilder.build`. Add them:

```ruby
def build(
  model_id:,
  messages:,
  system:,
  tools:,
  base_url:,
  stream: true,
  max_tokens: nil,
  temperature: nil,
  top_p: nil,
  thinking: nil,
  tool_choice: nil,
  cache_retention: nil,
  metadata: nil,
  disable_strict_tools: false
)
```

(`top_p` is fully supported per MiniMax docs.)

### 3. Validate temperature inside the method body

Right after `model_info = ModelCatalog.build(model_id)` (or wherever the
opening sanity checks live), add:

```ruby
unless temperature.nil?
  unless temperature.is_a?(Numeric)
    raise ArgumentError,
          "temperature must be Numeric or nil, got #{temperature.class}"
  end
  if temperature <= 0.0 || temperature > 1.0
    raise ArgumentError,
          "temperature must be in (0.0, 1.0], got #{temperature}"
  end
end
```

### 4. Plumb temperature and top_p into the body

After the base body assembly:

```ruby
body[:temperature] = temperature unless temperature.nil?
body[:top_p]       = top_p       unless top_p.nil?
```

### 5. Strip ignored parameters from the body

After all body assembly, before returning, strip the documented-ignored
keys (in case they were injected by `extra:` or merged in via metadata or
similar surprises):

```ruby
IGNORED_KEYS = %i[top_k stop_sequences service_tier mcp_servers
                  context_management container].freeze

def strip_ignored!(body)
  IGNORED_KEYS.each do |k|
    body.delete(k)
    body.delete(k.to_s)
  end
end
```

Call `strip_ignored!(body)` as the LAST step before `return body`.

`IGNORED_KEYS` is module-level (top of the `RequestBuilder` module).

### 6. Plumb the new kwargs from the adapter

In `lib/dispatch/adapter/minimax.rb`, the `chat` and `count_tokens`
methods accept caller kwargs. They almost certainly already accept
`temperature:` and `top_p:` if they followed the Anthropic interface. If
not, add them and forward to `RequestBuilder.build`. Defaults: `nil`.

DO NOT alter the temperature default behavior on the adapter — `nil`
means "don't send", which lets MiniMax pick its own server-side default.

## Acceptance criteria

- `grep -rn ':top_k\|:stop_sequences\|:service_tier\|:mcp_servers\|:context_management\|:container' lib/` should still match (the IGNORED_KEYS literal) but should NOT appear as keys in any built body.
- `RequestBuilder.build(temperature: 0.0, ...)` raises `ArgumentError`.
- `RequestBuilder.build(temperature: 1.01, ...)` raises `ArgumentError`.
- `RequestBuilder.build(temperature: -0.1, ...)` raises `ArgumentError`.
- `RequestBuilder.build(temperature: 0.5, ...)[:temperature]` is `0.5`.
- `RequestBuilder.build(temperature: 1.0, ...)[:temperature]` is `1.0`.
- `RequestBuilder.build(temperature: nil, ...).key?(:temperature)` is
  `false`.
- `bundle exec rubocop --autocorrect-all` exits 0.

## Verification

Run `run_tests` with `project_path=reference/dispatch-adapter-minimax`.
Rubocop must be clean. `request_builder_spec.rb` failures referencing
`is_oauth` or expecting different shapes are acceptable (retargeted in
phase 13). New examples covering the temperature validation and ignored-
key stripping are NOT required here; phase 13 will add them.
