Skip to main content

LLM-based code review tool that finds issues tests and linters miss

Project description

Vet : Verify Everything

Vet is a standalone verification tool for code changes and coding agent behavior.

It reviews git diffs, and optionally an agent's conversation history, to find issues that tests and linters often miss. Vet is optimized for use by humans, CI, and coding agents.

Installation

pip install verify-everything

Or install from source:

pip install git+https://github.com/imbue-ai/vet.git

Quickstart

Run Vet in the current repo:

vet "Implement X without breaking Y"

Compare against a base ref/commit:

vet "Refactor storage layer" --base-commit main

GitHub PRs (Actions)

Vet can run on pull requests.

Create .github/workflows/vet.yml:

name: Vet

permissions:
  contents: read
  pull-requests: write

on:
  pull_request:
    types: [opened, edited, synchronize, reopened]

jobs:
  vet:
    if: github.event.pull_request.draft == false
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - uses: actions/setup-python@v5
        with:
          python-version: "3.11"
      - run: pip install verify-everything
      - name: Run vet
        if: github.event.pull_request.head.repo.full_name == github.repository
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          VET_GOAL: |
            ${{ github.event.pull_request.title }}

            Additional context (not necessarily part of the goal):
            ${{ github.event.pull_request.body }}
        run: |
          set +e
          vet "$VET_GOAL" --quiet --output-format github \
            --base-commit "${{ github.event.pull_request.base.sha }}" \
            > "$RUNNER_TEMP/review.json"
          status=$?
          if [ "$status" -ne 0 ] && [ "$status" -ne 10 ]; then exit "$status"; fi

          jq --arg sha "${{ github.event.pull_request.head.sha }}" \
            '. + {commit_id: $sha}' "$RUNNER_TEMP/review.json" > "$RUNNER_TEMP/review-final.json"

          gh api "repos/${{ github.repository }}/pulls/${{ github.event.pull_request.number }}/reviews" \
            --method POST --input "$RUNNER_TEMP/review-final.json" > /dev/null || \
            gh pr comment "${{ github.event.pull_request.number }}" \
              --body "$(jq -r '[.body] + [.comments[] | "**\(.path):\(.line)**\n\n\(.body)"] | join("\n\n---\n\n")' "$RUNNER_TEMP/review-final.json")"
          exit 0

NOTE: This will not fail in CI if Vet finds an issue.

Environment variables

  • ANTHROPIC_API_KEY is required for the default model configuration.

Using Vet with Coding Agents

Vet ships as an agent skill that coding agents like OpenCode and Codex can discover and use automatically. When installed, agents will proactively run vet after code changes and include conversation history for better analysis.

Install the skill

for dir in ~/.agents ~/.opencode ~/.claude ~/.codex; do
  mkdir -p "$dir/skills/vet/scripts"
  curl -fsSL https://raw.githubusercontent.com/imbue-ai/vet/main/skills/vet/SKILL.md \
    -o "$dir/skills/vet/SKILL.md"
  curl -fsSL https://raw.githubusercontent.com/imbue-ai/vet/main/skills/vet/scripts/export_opencode_session.py \
    -o "$dir/skills/vet/scripts/export_opencode_session.py"
  curl -fsSL https://raw.githubusercontent.com/imbue-ai/vet/main/skills/vet/scripts/export_codex_session.py \
    -o "$dir/skills/vet/scripts/export_codex_session.py"
  curl -fsSL https://raw.githubusercontent.com/imbue-ai/vet/main/skills/vet/scripts/export_claude_code_session.py \
    -o "$dir/skills/vet/scripts/export_claude_code_session.py"
done

This places the skill in ~/.agents/skills/vet/, ~/.opencode/skills/vet/, ~/.claude/skills/vet/, and ~/.codex/skills/vet/, so it is discovered by OpenCode, Claude Code, and Codex.

How it works

Vet snapshots the repo and diff, optionally adds a goal and agent conversation, runs LLM checks, then filters/deduplicates findings into a final list of issues.

architecture

Why Vet

  • Verification for agentic workflows: "the agent said it ran tests" is not the same as "all tests ran successfully".
  • CI-friendly safety net: catches classes of problems that may not be covered by existing tests.
  • Bring-your-own-model: can run against hosted providers or local/self-hosted OpenAI-compatible endpoints.

Output & exit codes

  • Exit code 0: no issues found
  • Exit code 1: unexpected runtime error
  • Exit code 2: invalid usage/configuration error
  • Exit code 10: issues found

Output formats:

  • text
  • json
  • github

Configuration

Model configuration

Vet supports custom model definitions using OpenAI-compatible endpoints via JSON config files searched in:

  • $XDG_CONFIG_HOME/imbue/models.json (or ~/.config/imbue/models.json)
  • models.json at your repo root

Example models.json

{
  "providers": {
    "openai": {
      "name": "OpenAI",
      "api_type": "openai_compatible",
      "base_url": "https://api.openai.com/v1",
      "api_key_env": "OPENAI_API_KEY",
      "models": {
        "gpt-4o": {
          "model_id": "gpt-4o-2024-08-06",
          "context_window": 128000,
          "max_output_tokens": 16384
        },
        "gpt-4o-mini": {
          "model_id": "gpt-4o-mini-2024-07-18",
          "context_window": 128000,
          "max_output_tokens": 16384
        },
        "o1": {
          "model_id": "o1-2024-12-17",
          "context_window": 200000,
          "max_output_tokens": 100000
        }
      }
    }
  }
}

Then:

vet "Harden error handling" --model gpt-4o-mini

Configuration profiles (TOML)

Vet supports named profiles so teams can standardize CI usage without long CLI invocations.

Profiles set defaults like model choice, enabled issue codes, output format, and thresholds.

See the example in this project.

License

This project is licensed under the GNU Affero General Public License v3.0 (AGPL-3.0-only).

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

verify_everything-0.1.0.tar.gz (185.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

verify_everything-0.1.0-py3-none-any.whl (238.7 kB view details)

Uploaded Python 3

File details

Details for the file verify_everything-0.1.0.tar.gz.

File metadata

  • Download URL: verify_everything-0.1.0.tar.gz
  • Upload date:
  • Size: 185.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for verify_everything-0.1.0.tar.gz
Algorithm Hash digest
SHA256 b6561c6db1fac63884a0f00df07fad6089d6b4afac7f13adfa7e5acfb66b1de1
MD5 eb6c733986e0e557ae38ea43cf22e8d3
BLAKE2b-256 aaffe76e835dd6c928171998a10c6e3999a4dccc34d97df510ba50444b1c7ccd

See more details on using hashes here.

File details

Details for the file verify_everything-0.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for verify_everything-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 dce97eda1dd8a775bef8b354f97464d4efe32e1a081c52554f301f5ec839f558
MD5 5416fdfff9d43fb9062d5b9715812fa4
BLAKE2b-256 837e05373ddd1685efcc794b3dc2eded249124f74d24c3842cd7999a76dde813

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page