All of lore.kernel.org
 help / color / mirror / Atom feed
From: Aaron Conole <aconole@redhat.com>
To: Stephen Hemminger <stephen@networkplumber.org>
Cc: dev@dpdk.org
Subject: Re: [PATCH v13 3/6] devtools: add compare-reviews.sh for multi-provider analysis
Date: Tue, 14 Apr 2026 15:58:42 -0400	[thread overview]
Message-ID: <f7t340x9uvh.fsf@redhat.com> (raw)
In-Reply-To: <20260402194618.134002-4-stephen@networkplumber.org> (Stephen Hemminger's message of "Thu, 2 Apr 2026 12:44:33 -0700")

Stephen Hemminger <stephen@networkplumber.org> writes:

> Add script to run patch reviews across multiple AI providers for
> comparison purposes.
>
> The script automatically detects which providers have API keys
> configured and runs analyze-patch.py for each one. This allows
> users to compare review quality and feedback across different
> AI models.
>
> Features:
>   - Auto-detects available providers based on environment variables
>   - Optional provider selection via -p/--providers option
>   - Saves individual reviews to separate files with -o/--output
>   - Verbose mode passes through to underlying analyze-patch.py
>
> Usage:
>   ./devtools/compare-reviews.sh my-patch.patch
>   ./devtools/compare-reviews.sh -p anthropic,xai my-patch.patch
>   ./devtools/compare-reviews.sh -o ./reviews my-patch.patch
>
> Output files are named <patch>-<provider>.txt when using the
> output directory option.
>
> Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
> ---

Way cool!

Acked-by: Aaron Conole <aconole@redhat.com>

>  devtools/compare-reviews.sh | 263 ++++++++++++++++++++++++++++++++++++
>  1 file changed, 263 insertions(+)
>  create mode 100755 devtools/compare-reviews.sh
>
> diff --git a/devtools/compare-reviews.sh b/devtools/compare-reviews.sh
> new file mode 100755
> index 0000000000..b4813cb6a7
> --- /dev/null
> +++ b/devtools/compare-reviews.sh
> @@ -0,0 +1,263 @@
> +#!/bin/bash
> +# SPDX-License-Identifier: BSD-3-Clause
> +# Copyright(c) 2026 Stephen Hemminger
> +
> +# Compare DPDK patch reviews across multiple AI providers
> +# Runs analyze-patch.py with each available provider
> +
> +set -o pipefail
> +
> +SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
> +ANALYZE_SCRIPT="${SCRIPT_DIR}/analyze-patch.py"
> +AGENTS_FILE="AGENTS.md"
> +OUTPUT_DIR=""
> +PROVIDERS=""
> +FORMAT="text"
> +VERBOSE=""
> +EXTRA_ARGS=()
> +
> +usage() {
> +    cat <<EOF
> +Usage: $(basename "$0") [OPTIONS] <patch-file>
> +
> +Compare DPDK patch reviews across multiple AI providers.
> +
> +Options:
> +    -a, --agents FILE      Path to AGENTS.md file (default: AGENTS.md)
> +    -o, --output DIR       Save individual reviews to directory
> +    -p, --providers LIST   Comma-separated list of providers to use
> +                           (default: all providers with API keys set)
> +    -f, --format FORMAT    Output format: text, markdown, html, json
> +                           (default: text)
> +    -t, --tokens N         Max tokens for response
> +    -D, --date DATE        Review date context (YYYY-MM-DD)
> +    -r, --release VERSION  Target DPDK release (e.g., 24.11, 23.11-lts)
> +    --split-patches        Split mbox into individual patches
> +    --patch-range N-M      Review only patches N through M
> +    --large-file MODE      Handle large files: error, truncate, chunk,
> +                           commits-only, summary
> +    --max-tokens N         Max input tokens
> +    -v, --verbose          Show verbose output from each provider
> +    -h, --help             Show this help message
> +
> +Environment Variables:
> +    Set API keys for providers you want to use:
> +    ANTHROPIC_API_KEY, OPENAI_API_KEY, XAI_API_KEY, GOOGLE_API_KEY
> +
> +Examples:
> +    $(basename "$0") my-patch.patch
> +    $(basename "$0") -p anthropic,openai my-patch.patch
> +    $(basename "$0") -o ./reviews -f markdown my-patch.patch
> +    $(basename "$0") -r 24.11 --split-patches series.mbox
> +EOF
> +    exit "${1:-0}"
> +}
> +
> +error() {
> +    echo "Error: $1" >&2
> +    exit 1
> +}
> +
> +# Check which providers have API keys configured
> +get_available_providers() {
> +    local available=""
> +
> +    [[ -n "$ANTHROPIC_API_KEY" ]] && available="${available}anthropic,"
> +    [[ -n "$OPENAI_API_KEY" ]] && available="${available}openai,"
> +    [[ -n "$XAI_API_KEY" ]] && available="${available}xai,"
> +    [[ -n "$GOOGLE_API_KEY" ]] && available="${available}google,"
> +
> +    # Remove trailing comma
> +    echo "${available%,}"
> +}
> +
> +# Get file extension for format
> +get_extension() {
> +    case "$1" in
> +        text)     echo "txt" ;;
> +        markdown) echo "md" ;;
> +        html)     echo "html" ;;
> +        json)     echo "json" ;;
> +        *)        echo "txt" ;;
> +    esac
> +}
> +
> +# Parse command line options
> +while [[ $# -gt 0 ]]; do
> +    case "$1" in
> +        -a|--agents)
> +            [[ -z "${2:-}" || "$2" == -* ]] && error "$1 requires an argument"
> +            AGENTS_FILE="$2"
> +            shift 2
> +            ;;
> +        -o|--output)
> +            [[ -z "${2:-}" || "$2" == -* ]] && error "$1 requires an argument"
> +            OUTPUT_DIR="$2"
> +            shift 2
> +            ;;
> +        -p|--providers)
> +            [[ -z "${2:-}" || "$2" == -* ]] && error "$1 requires an argument"
> +            PROVIDERS="$2"
> +            shift 2
> +            ;;
> +        -f|--format)
> +            [[ -z "${2:-}" || "$2" == -* ]] && error "$1 requires an argument"
> +            FORMAT="$2"
> +            shift 2
> +            ;;
> +        -t|--tokens)
> +            [[ -z "${2:-}" || "$2" == -* ]] && error "$1 requires an argument"
> +            EXTRA_ARGS+=("-t" "$2")
> +            shift 2
> +            ;;
> +        -D|--date)
> +            [[ -z "${2:-}" || "$2" == -* ]] && error "$1 requires an argument"
> +            EXTRA_ARGS+=("-D" "$2")
> +            shift 2
> +            ;;
> +        -r|--release)
> +            [[ -z "${2:-}" || "$2" == -* ]] && error "$1 requires an argument"
> +            EXTRA_ARGS+=("-r" "$2")
> +            shift 2
> +            ;;
> +        --split-patches)
> +            EXTRA_ARGS+=("--split-patches")
> +            shift
> +            ;;
> +        --patch-range)
> +            [[ -z "${2:-}" || "$2" == -* ]] && error "$1 requires an argument"
> +            EXTRA_ARGS+=("--patch-range" "$2")
> +            shift 2
> +            ;;
> +        --large-file)
> +            [[ -z "${2:-}" || "$2" == -* ]] && error "$1 requires an argument"
> +            EXTRA_ARGS+=("--large-file" "$2")
> +            shift 2
> +            ;;
> +        --large-file=*)
> +            EXTRA_ARGS+=("$1")
> +            shift
> +            ;;
> +        --max-tokens)
> +            [[ -z "${2:-}" || "$2" == -* ]] && error "$1 requires an argument"
> +            EXTRA_ARGS+=("--max-tokens" "$2")
> +            shift 2
> +            ;;
> +        -v|--verbose)
> +            VERBOSE="-v"
> +            shift
> +            ;;
> +        -h|--help)
> +            usage 0
> +            ;;
> +        -*)
> +            error "Unknown option: $1"
> +            ;;
> +        *)
> +            break
> +            ;;
> +    esac
> +done
> +
> +# Check for required arguments
> +if [[ $# -lt 1 ]]; then
> +    echo "Error: No patch file specified" >&2
> +    usage 1
> +fi
> +
> +PATCH_FILE="$1"
> +
> +if [[ ! -f "$PATCH_FILE" ]]; then
> +    error "Patch file not found: $PATCH_FILE"
> +fi
> +
> +if [[ ! -f "$ANALYZE_SCRIPT" ]]; then
> +    error "analyze-patch.py not found: $ANALYZE_SCRIPT"
> +fi
> +
> +if [[ ! -f "$AGENTS_FILE" ]]; then
> +    error "AGENTS.md not found: $AGENTS_FILE"
> +fi
> +
> +# Validate format
> +case "$FORMAT" in
> +    text|markdown|html|json) ;;
> +    *) error "Invalid format: $FORMAT (must be text, markdown, html, or json)" ;;
> +esac
> +
> +# Get providers to use
> +if [[ -z "$PROVIDERS" ]]; then
> +    PROVIDERS=$(get_available_providers)
> +fi
> +
> +if [[ -z "$PROVIDERS" ]]; then
> +    error "No API keys configured. Set at least one of: "\
> +"ANTHROPIC_API_KEY, OPENAI_API_KEY, XAI_API_KEY, GOOGLE_API_KEY"
> +fi
> +
> +# Create output directory if specified
> +if [[ -n "$OUTPUT_DIR" ]]; then
> +    mkdir -p "$OUTPUT_DIR"
> +fi
> +
> +PATCH_BASENAME=$(basename "$PATCH_FILE")
> +PATCH_STEM="${PATCH_BASENAME%.*}"
> +EXT=$(get_extension "$FORMAT")
> +
> +echo "Reviewing patch: $PATCH_BASENAME"
> +echo "Providers: $PROVIDERS"
> +echo "Format: $FORMAT"
> +echo "========================================"
> +echo ""
> +
> +# Run review for each provider, continue on failure
> +IFS=',' read -ra PROVIDER_LIST <<< "$PROVIDERS"
> +failures=0
> +for provider in "${PROVIDER_LIST[@]}"; do
> +    echo ">>> Running review with: $provider"
> +    echo ""
> +
> +    if [[ -n "$OUTPUT_DIR" ]]; then
> +        OUTPUT_FILE="${OUTPUT_DIR}/${PATCH_STEM}-${provider}.${EXT}"
> +        if python3 "$ANALYZE_SCRIPT" \
> +            -p "$provider" \
> +            -a "$AGENTS_FILE" \
> +            -f "$FORMAT" \
> +            ${VERBOSE:+"$VERBOSE"} \
> +            "${EXTRA_ARGS[@]}" \
> +            "$PATCH_FILE" | tee "$OUTPUT_FILE"; then
> +            echo ""
> +            echo "Saved to: $OUTPUT_FILE"
> +        else
> +            echo "FAILED: $provider review failed" >&2
> +            rm -f "$OUTPUT_FILE"
> +            ((failures++)) || true
> +        fi
> +    else
> +        if ! python3 "$ANALYZE_SCRIPT" \
> +            -p "$provider" \
> +            -a "$AGENTS_FILE" \
> +            -f "$FORMAT" \
> +            ${VERBOSE:+"$VERBOSE"} \
> +            "${EXTRA_ARGS[@]}" \
> +            "$PATCH_FILE"; then
> +            echo "FAILED: $provider review failed" >&2
> +            ((failures++)) || true
> +        fi
> +    fi
> +
> +    echo ""
> +    echo "========================================"
> +    echo ""
> +done
> +
> +echo "Review comparison complete."
> +
> +if [[ -n "$OUTPUT_DIR" ]]; then
> +    echo "All reviews saved to: $OUTPUT_DIR"
> +fi
> +
> +if [[ $failures -gt 0 ]]; then
> +    echo "$failures provider(s) failed." >&2
> +    exit 1
> +fi


  reply	other threads:[~2026-04-14 19:58 UTC|newest]

Thread overview: 64+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <0260109014106.398156-1-stephen@networkplumber.org>
2026-01-26 18:40 ` [PATCH v7 0/4] devtools: add AI-assisted code review tools Stephen Hemminger
2026-01-26 18:40   ` [PATCH v7 1/4] doc: add AGENTS.md for AI-powered " Stephen Hemminger
2026-01-30 23:49     ` Stephen Hemminger
2026-01-26 18:40   ` [PATCH v7 2/4] devtools: add multi-provider AI patch review script Stephen Hemminger
2026-01-26 18:40   ` [PATCH v7 3/4] devtools: add compare-reviews.sh for multi-provider analysis Stephen Hemminger
2026-01-26 18:40   ` [PATCH v7 4/4] devtools: add multi-provider AI documentation review script Stephen Hemminger
2026-02-09 19:48   ` [PATCH v8 0/6] add AGENTS.md and scripts for AI code review Stephen Hemminger
2026-02-09 19:48     ` [PATCH v8 1/6] doc: add AGENTS.md for AI code review tools Stephen Hemminger
2026-02-09 19:48     ` [PATCH v8 2/6] devtools: add multi-provider AI patch review script Stephen Hemminger
2026-02-09 19:48     ` [PATCH v8 3/6] devtools: add compare-reviews.sh for multi-provider analysis Stephen Hemminger
2026-02-09 19:48     ` [PATCH v8 4/6] devtools: add multi-provider AI documentation review script Stephen Hemminger
2026-02-09 19:48     ` [PATCH v8 5/6] doc: add AI-assisted patch review to contributing guide Stephen Hemminger
2026-02-09 19:48     ` [PATCH v8 6/6] MAINTAINERS: add section for AI review tools Stephen Hemminger
2026-03-04 17:59   ` [PATCH v9 0/6] add AGENTS.md and scripts for AI code review Stephen Hemminger
2026-03-04 17:59     ` [PATCH v9 1/6] doc: add AGENTS.md for AI code review tools Stephen Hemminger
2026-03-04 17:59     ` [PATCH v9 2/6] devtools: add multi-provider AI patch review script Stephen Hemminger
2026-03-04 17:59     ` [PATCH v9 3/6] devtools: add compare-reviews.sh for multi-provider analysis Stephen Hemminger
2026-03-04 17:59     ` [PATCH v9 4/6] devtools: add multi-provider AI documentation review script Stephen Hemminger
2026-03-04 17:59     ` [PATCH v9 5/6] doc: add AI-assisted patch review to contributing guide Stephen Hemminger
2026-03-04 17:59     ` [PATCH v9 6/6] MAINTAINERS: add section for AI review tools Stephen Hemminger
2026-03-10  1:57   ` [PATCH v10 0/6] Add AGENTS and scripts for AI code review Stephen Hemminger
2026-03-10  1:57     ` [PATCH v10 1/6] doc: add AGENTS.md for AI code review tools Stephen Hemminger
2026-03-10  1:57     ` [PATCH v10 2/6] devtools: add multi-provider AI patch review script Stephen Hemminger
2026-03-10  1:57     ` [PATCH v10 3/6] devtools: add compare-reviews.sh for multi-provider analysis Stephen Hemminger
2026-03-10  1:57     ` [PATCH v10 4/6] devtools: add multi-provider AI documentation review script Stephen Hemminger
2026-03-10  1:57     ` [PATCH v10 5/6] doc: add AI-assisted patch review to contributing guide Stephen Hemminger
2026-03-10  1:57     ` [PATCH v10 6/6] MAINTAINERS: add section for AI review tools Stephen Hemminger
2026-03-27 15:41   ` [PATCH v11 0/6] Add AGENTS.md and scripts for AI code review Stephen Hemminger
2026-03-27 15:41     ` [PATCH v11 1/6] doc: add AGENTS.md for AI code review tools Stephen Hemminger
2026-03-27 15:41     ` [PATCH v11 2/6] devtools: add multi-provider AI patch review script Stephen Hemminger
2026-03-27 15:41     ` [PATCH v11 3/6] devtools: add compare-reviews.sh for multi-provider analysis Stephen Hemminger
2026-03-27 15:41     ` [PATCH v11 4/6] devtools: add multi-provider AI documentation review script Stephen Hemminger
2026-03-27 15:41     ` [PATCH v11 5/6] doc: add AI-assisted patch review to contributing guide Stephen Hemminger
2026-03-27 15:41     ` [PATCH v11 6/6] MAINTAINERS: add section for AI review tools Stephen Hemminger
2026-04-01 15:38   ` [PATCH v12 0/6] Add AGENTS.md and scripts for AI code review Stephen Hemminger
2026-04-01 15:38     ` [PATCH v12 1/6] doc: add AGENTS.md for AI code review tools Stephen Hemminger
2026-04-01 15:38     ` [PATCH v12 2/6] devtools: add multi-provider AI patch review script Stephen Hemminger
2026-04-02  4:00       ` sunyuechi
2026-04-01 15:38     ` [PATCH v12 3/6] devtools: add compare-reviews.sh for multi-provider analysis Stephen Hemminger
2026-04-01 15:38     ` [PATCH v12 4/6] devtools: add multi-provider AI documentation review script Stephen Hemminger
2026-04-02  4:05       ` sunyuechi
2026-04-01 15:38     ` [PATCH v12 5/6] doc: add AI-assisted patch review to contributing guide Stephen Hemminger
2026-04-01 15:38     ` [PATCH v12 6/6] MAINTAINERS: add section for AI review tools Stephen Hemminger
2026-04-02 19:44   ` [PATCH v13 0/6] Add AGENTS.md and scripts for AI code review Stephen Hemminger
2026-04-02 19:44     ` [PATCH v13 1/6] doc: add AGENTS.md for AI code review tools Stephen Hemminger
2026-04-14 19:54       ` Aaron Conole
2026-04-14 20:45         ` Stephen Hemminger
2026-04-02 19:44     ` [PATCH v13 2/6] devtools: add multi-provider AI patch review script Stephen Hemminger
2026-04-14 19:57       ` Aaron Conole
2026-04-02 19:44     ` [PATCH v13 3/6] devtools: add compare-reviews.sh for multi-provider analysis Stephen Hemminger
2026-04-14 19:58       ` Aaron Conole [this message]
2026-04-02 19:44     ` [PATCH v13 4/6] devtools: add multi-provider AI documentation review script Stephen Hemminger
2026-04-14 20:05       ` Aaron Conole
2026-04-02 19:44     ` [PATCH v13 5/6] doc: add AI-assisted patch review to contributing guide Stephen Hemminger
2026-04-14 20:06       ` Aaron Conole
2026-04-02 19:44     ` [PATCH v13 6/6] MAINTAINERS: add section for AI review tools Stephen Hemminger
2026-04-14 20:07       ` Aaron Conole
2026-04-14 21:08   ` [PATCH v14 0/6] Add AGENTS.md and scripts for AI code review Stephen Hemminger
2026-04-14 21:08     ` [PATCH v14 1/6] doc: add AGENTS.md for AI code review tools Stephen Hemminger
2026-04-14 21:08     ` [PATCH v14 2/6] devtools: add multi-provider AI patch review script Stephen Hemminger
2026-04-14 21:08     ` [PATCH v14 3/6] devtools: add compare-reviews.sh for multi-provider analysis Stephen Hemminger
2026-04-14 21:08     ` [PATCH v14 4/6] devtools: add multi-provider AI documentation review script Stephen Hemminger
2026-04-14 21:08     ` [PATCH v14 5/6] doc: add AI-assisted patch review to contributing guide Stephen Hemminger
2026-04-14 21:08     ` [PATCH v14 6/6] MAINTAINERS: add section for AI review tools Stephen Hemminger

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=f7t340x9uvh.fsf@redhat.com \
    --to=aconole@redhat.com \
    --cc=dev@dpdk.org \
    --cc=stephen@networkplumber.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.