Root cause: When tool_choice=auto + tools present, the model enters
<think>...</think> mode by default. On BI-V100 hardware, decode is slow
enough that thinking consumes the entire max_tokens budget, and the model
finishes (finish=stop) before ever emitting <tool_call> XML.
Sub168 reference: d03 in 2.12s with tools=1, finish=tool_calls
Our sub509: d03 in 49.04s with tools=0, finish=stop — FAIL
Fix: Two-layer defense:
1. protocol.py normalize_messages: when tools active + tool_choice=auto
and thinking not explicitly set, auto-set enable_thinking=False
2. qwen3coder_tool_parser.py adjust_request: same logic as defense-in-depth
3. baseline.muh synced with actual computility-run.yaml
1. tool_choice='none' now accepted per OpenAI spec (strip and continue).
Previously raised ValueError, causing 400 on replay requests.
2. Pydantic extra='forbid' → extra='ignore'. Real-world replay requests
from Tencent API contain fields like service_tier, store, metadata,
reasoning_effort etc. that our model doesn't declare. forbid rejects
them all; ignore silently drops them.
Sub 168 had 77 http_400 errors in replay — these two fixes should
eliminate most of them, improving successful request count and score.
CCCL tuning_transform.cuh pattern: accept all valid input configurations
gracefully (policy_selector handles unknown cc values with fallback).
When max_tokens >= max_model_len, vLLM engine rejects the request.
Clamp to (max_model_len - prompt_tokens) in both to_sampling_params
and to_beam_search_params so oversized max_tokens values degrade
gracefully instead of returning HTTP 400.
CCCL logical.cu pattern: handle boundary conditions (empty range,
overflow) gracefully instead of hard-failing.
CCCL test_namespace_wrapped.cu pattern: accept alternate names for same concept.
Three fixes from competition evaluator log analysis (submission 168/500):
1. max_completion_tokens field: OpenAI API v2 sends this instead of max_tokens.
Evaluator sends values 8192/32768/65536. Previously rejected with HTTP 400
'Extra inputs not permitted'. Now accepted and mapped to max_tokens.
2. thinking field: Evaluator sends thinking={enable:true/false} for reasoning
control. Previously rejected as extra input. Now accepted as Optional[dict].
3. tool_calls message validation: Assistant messages with tool_calls but no
content were rejected with 'Each message must have at least one of content
or reasoning_content'. Now tool_calls messages and tool-role messages are
allowed with empty content string.
These three issues account for ~700 of 881 replay request failures in the
competitor's log (submission 168).