@@ -377,9 +377,9 @@ jobs:
377377 import json, os, pathlib
378378 gw = os.environ['GATEWAY_BASE_URL'].rstrip('/')
379379 model = os.environ.get('MODEL') or 'claude-opus-4-1'
380- claude_maintainer_model = os.environ.get('CLAUDE_MAINTAINER_MODEL') or 'claude-opus-4-8'
380+ claude_maintainer_model = os.environ.get('CLAUDE_MAINTAINER_MODEL') or model
381381 codex_maintainer_model = os.environ.get('CODEX_MAINTAINER_MODEL') or 'gpt-5-codex'
382- disprove_model = os.environ.get('DISPROVE_MODEL') or 'gpt-5. 6-sol'
382+ disprove_model = os.environ.get('DISPROVE_MODEL') or 'gpt-5- 6-sol'
383383 cfg = {
384384 'providers': {
385385 'gateway': {
@@ -407,6 +407,39 @@ jobs:
407407 pathlib.Path.home().joinpath('.omnigent', 'config.yaml').write_text(json.dumps(cfg, indent=2))
408408 "
409409
410+ - name : Materialize reviewer model config
411+ if : steps.creds.outputs.available == 'true'
412+ env :
413+ CLAUDE_MAINTAINER_MODEL : ${{ vars.CLAUDE_MAINTAINER_MODEL }}
414+ CODEX_MAINTAINER_MODEL : ${{ vars.CODEX_MAINTAINER_MODEL }}
415+ DISPROVE_MODEL : ${{ vars.DISPROVE_MODEL }}
416+ MODEL : ${{ vars.MODEL }}
417+ run : |
418+ set -euo pipefail
419+ python3 -u <<'PYEOF'
420+ import os
421+ import pathlib
422+ import yaml
423+
424+ model = os.environ.get("MODEL") or "claude-opus-4-1"
425+ replacements = {
426+ "default": model,
427+ "maintainer-claude": os.environ.get("CLAUDE_MAINTAINER_MODEL") or model,
428+ "maintainer-codex": os.environ.get("CODEX_MAINTAINER_MODEL") or "gpt-5-codex",
429+ "disprove": os.environ.get("DISPROVE_MODEL") or "gpt-5-6-sol",
430+ }
431+
432+ for path in pathlib.Path(".github/omnigent/reviewer").rglob("config.yaml"):
433+ cfg = yaml.safe_load(path.read_text())
434+ executor = cfg.get("executor", {})
435+ old_model = executor.get("model")
436+ if old_model in replacements:
437+ executor["model"] = replacements[old_model]
438+ path.write_text(yaml.safe_dump(cfg, sort_keys=False))
439+
440+ print("Materialized AI reviewer model aliases for CI runtime.")
441+ PYEOF
442+
410443 - name : Collect PR context and build review prompt
411444 if : steps.creds.outputs.available == 'true'
412445 env :
@@ -498,17 +531,38 @@ jobs:
498531 if : steps.creds.outputs.available == 'true'
499532 id : review
500533 env :
534+ GATEWAY_BASE_URL : ${{ secrets.GATEWAY_BASE_URL }}
501535 LLM_API_KEY : ${{ secrets.LLM_API_KEY }}
536+ MODEL : ${{ vars.MODEL }}
502537 run : |
503538 set -euo pipefail
504539 prompt=$(cat /tmp/review_prompt.txt)
505-
540+ model="${MODEL:-claude-opus-4-1}"
541+
542+ export ANTHROPIC_AUTH_TOKEN="$LLM_API_KEY"
543+ export ANTHROPIC_BASE_URL="${GATEWAY_BASE_URL%/}/anthropic"
544+ export ANTHROPIC_MODEL="$model"
545+ export ANTHROPIC_DEFAULT_MODEL="$model"
546+ export ANTHROPIC_DEFAULT_OPUS_MODEL="$model"
547+ export ANTHROPIC_DEFAULT_SONNET_MODEL="$model"
548+ export OPENAI_API_KEY="$LLM_API_KEY"
549+ export OPENAI_BASE_URL="${GATEWAY_BASE_URL%/}/openai"
550+
551+ set +e
506552 omnigent run .github/omnigent/reviewer/ \
507553 -p "$prompt" \
508554 --no-session \
509555 2>review-stderr.log \
510- | tee /tmp/review_output.txt \
511- || { echo "::warning::AI review exited non-zero"; cat review-stderr.log; }
556+ | tee /tmp/review_output.txt
557+ review_status="${PIPESTATUS[0]}"
558+ set -e
559+
560+ if [ "$review_status" -ne 0 ]; then
561+ echo "::warning::AI review exited with status ${review_status}."
562+ if [ -s review-stderr.log ]; then
563+ cat review-stderr.log
564+ fi
565+ fi
512566
513567 python3 -c "
514568 import pathlib
@@ -528,9 +582,10 @@ jobs:
528582 echo "review_text<<${delim}" >> "$GITHUB_OUTPUT"
529583 cat /tmp/review_output.txt >> "$GITHUB_OUTPUT"
530584 echo "${delim}" >> "$GITHUB_OUTPUT"
585+ echo "review_status=${review_status}" >> "$GITHUB_OUTPUT"
531586
532587 - name : Scan review output for secrets before publishing
533- if : steps.creds.outputs.available == 'true'
588+ if : always() && steps.creds.outputs.available == 'true'
534589 env :
535590 LLM_API_KEY : ${{ secrets.LLM_API_KEY }}
536591 run : |
@@ -540,6 +595,21 @@ jobs:
540595 exit 1
541596 fi
542597
598+ - name : Validate review output
599+ if : always() && steps.creds.outputs.available == 'true'
600+ env :
601+ REVIEW_STATUS : ${{ steps.review.outputs.review_status }}
602+ run : |
603+ set -euo pipefail
604+ if [ "${REVIEW_STATUS:-1}" -ne 0 ]; then
605+ echo "::error::AI review exited with status ${REVIEW_STATUS:-unknown}."
606+ exit 1
607+ fi
608+ if [ ! -s /tmp/review_output.txt ]; then
609+ echo "::error::AI review produced no publishable output."
610+ exit 1
611+ fi
612+
543613 - name : Post review comment
544614 if : >-
545615 steps.review.outputs.review_text != '' &&
0 commit comments