diff --git a/docs/doctoring/strix-openai-fallback-api-base-routing.md b/docs/doctoring/strix-openai-fallback-api-base-routing.md index d38d222d4..5e65387c4 100644 --- a/docs/doctoring/strix-openai-fallback-api-base-routing.md +++ b/docs/doctoring/strix-openai-fallback-api-base-routing.md @@ -71,7 +71,11 @@ Regression evidence proves that: 8. the workflow provisions the override file and passes it into the gate env; 9. the required-workflow smoke contract pins both sides of the wiring; and 10. the stale `gpt-5.6-luna` expectations left behind by the model rename are - aligned with the valid `gpt-5.4` contract in queue-contract tests. + aligned with the valid `gpt-5.4` contract in queue-contract tests; and +11. the direct GPT-5.4 fallback clears reasoning effort to `none` because the + pinned Strix scanner uses Chat Completions function tools, a combination + the provider rejects when `reasoning_effort` is present. Other models keep + the workflow's configured `high` effort. ## Limitations diff --git a/scripts/ci/strix_quick_gate.sh b/scripts/ci/strix_quick_gate.sh index c9aa41545..483149bed 100755 --- a/scripts/ci/strix_quick_gate.sh +++ b/scripts/ci/strix_quick_gate.sh @@ -2580,6 +2580,14 @@ run_strix_once() { local start_epoch start_epoch="$(date +%s)" local child_llm_api_key="" + local child_reasoning_effort="${STRIX_REASONING_EFFORT:-}" + case "$(normalize_model "$model")" in + openai-direct/gpt-5.4 | openai_direct/gpt-5.4) + # OpenAI rejects function tools plus reasoning_effort for GPT-5.4 on + # Chat Completions, the transport used by the pinned Strix scanner. + child_reasoning_effort="none" + ;; + esac if ! is_vertex_model "$(normalize_model "$model")"; then child_llm_api_key="$LLM_API_KEY" if is_github_models_model "$(normalize_model "$model")" && [ -n "$STRIX_GITHUB_MODELS_KEY" ]; then @@ -2597,6 +2605,7 @@ run_strix_once() { set -o pipefail set +e STRIX_CHILD_MODEL="$child_model" \ + STRIX_CHILD_REASONING_EFFORT="$child_reasoning_effort" \ STRIX_CHILD_LLM_API_KEY="$child_llm_api_key" \ STRIX_CHILD_LLM_API_BASE="$llm_api_base_value" \ STRIX_CHILD_REPORTS_DIR="$ACTIVE_REPORTS_DIR" \ @@ -2682,6 +2691,8 @@ for key in ( value = os.environ.get(key) if value: child_env[key] = value +if os.environ.get("STRIX_CHILD_REASONING_EFFORT"): + child_env["STRIX_REASONING_EFFORT"] = os.environ["STRIX_CHILD_REASONING_EFFORT"] llm_api_base = os.environ.get("STRIX_CHILD_LLM_API_BASE", "") if llm_api_base: child_env["LLM_API_BASE"] = llm_api_base diff --git a/scripts/ci/test_strix_quick_gate.sh b/scripts/ci/test_strix_quick_gate.sh index 3d3449dae..1fc84469e 100755 --- a/scripts/ci/test_strix_quick_gate.sh +++ b/scripts/ci/test_strix_quick_gate.sh @@ -3415,6 +3415,10 @@ REPORT exit 1 ;; openai/gpt-5.4) + if [ "${STRIX_REASONING_EFFORT:-}" != "none" ]; then + echo "direct OpenAI GPT-5.4 fallback retained unsupported reasoning effort (${STRIX_REASONING_EFFORT:-})" >&2 + exit 29 + fi if [ "${LLM_API_KEY:-}" != "openai-fallback-token" ]; then echo "unexpected direct-OpenAI fallback key (${LLM_API_KEY:-})" >&2 exit 26 @@ -5701,6 +5705,7 @@ PY if [ "$scenario" = "nvidia-rate-limit-openai-direct-fallback-clears-api-base" ]; then printf '%s' 'openai-fallback-token' >"$tmp_dir/openai_fallback_key.txt" env_cmd+=(STRIX_OPENAI_FALLBACK_KEY_FILE="$tmp_dir/openai_fallback_key.txt") + env_cmd+=(STRIX_REASONING_EFFORT="high") fi if [ "$scenario" = "openai-direct-quota-github-models-fallback-success" ]; then printf '%s' 'https://models.github.ai/inference' >"$tmp_dir/github_models_api_base.txt"