Second 5-Opus reviewer round. Applying high-confidence fixes; speculative
items (gpt-5.5-pro effort restriction, o3 image_generation gating,
o-series parallel_tool_calls per-model, gpt-5.x new model prefixes,
Anthropic fast-mode + Priority exclusion UI gate, Gemini service_tier,
Kimi k2.5 toggleable thinking) deferred to follow-up because they need
type-system changes, more verification, or backend wire work.
OpenAI max-output caps — replace the 3-line table with one driven by
direct dev.openai.com per-model fetches (cross-checked against the Azure
Foundry reasoning table):
- gpt-5.4 / gpt-5.4-pro / gpt-5.4-mini / gpt-5.4-nano: 65536 -> 128000
(https://developers.openai.com/api/docs/models/gpt-5.4 "128,000 max
output tokens"; Azure table same).
- gpt-5.3-codex: 16384 -> 128000
(https://developers.openai.com/api/docs/models/gpt-5.3-codex).
- gpt-5 / gpt-5.1 / gpt-5.2: 32k default -> 128000
(https://developers.openai.com/api/docs/models/gpt-5.2 confirms
128k; Azure table extends to gpt-5/5.1).
- gpt-5.3-chat-latest and gpt-5.1-chat keep 16384 (chat-class
variants per Azure context table row).
- o1 / o3 / o3-mini / o3-pro / o4-mini / codex-mini: 32k default ->
100000 (https://developers.openai.com/api/docs/models/o3 "100,000
max output tokens"; Azure o-series table same).
Implementation: list the two 16k chat-latest ids first so the broader
`gpt-5` 128k entry doesn't shadow them.
OpenAI reasoning_effort levels:
- gpt-5.3-codex: drop "none" from levels + flip supportsOff to false.
Dev page lists the enum as low/medium/high/xhigh only — `none` is
not in the codex variant.
- o-series bucket: change prefix from ["o3"] to
["o1","o3","o4","codex-mini"]. Previously o1 / o4-mini / codex-mini
fell into NO_REASONING_CAPS so the panel HID the effort slider for
them — real UX regression for users on those ids. Azure o-series
table confirms all four accept low/medium/high reasoning_effort.
DeepSeek default_models:
- Add deepseek-v4-pro + deepseek-v4-flash alongside the legacy
deepseek-chat / deepseek-reasoner aliases. The latter retire on
2026-07-24 per https://api-docs.deepseek.com/updates; surfacing
both lets the picker keep working on cutover.
Local backend bucket split (Ollama-stricter):
- Splits the round-1 VLLM_OLLAMA_CAPABILITIES into a vLLM-specific
bucket (keeps top_k / min_p / repetition_penalty / seed on; vLLM's
SamplingParams supports all four) and an Ollama-specific bucket
that ALSO hides top_k / min_p / repetition_penalty. Ollama's OAI
translator (ollama/openai/openai.go FromChatRequest) only copies
the documented OpenAI subset on the /v1/chat/completions path that
Studio uses; the three knobs are silently dropped even though
native /api/chat would forward them via `options`. Hiding them is
the smaller fix vs adding a backend /api/chat rewrite path.
Reviewer claims verified wrong, skipped:
- _ANTHROPIC_NEW_CODE_EXEC_PREFIXES already lists opus-4-7, opus-4-6,
sonnet-4-6 (external_provider.py:337-339). No-op.
- Mistral `seed` already renamed to `random_seed` by backend at
external_provider.py:772. No-op.
- OpenRouter `isOpenRouterMandatoryReasoningModel` uses `Set.has()`
exact match, not prefix match, so deepseek/deepseek-r1-distill-*
cannot accidentally hit the always-on guard. No-op.
Tests: 63/63 sampling_params_routing tests pass; frontend tsc clean.