Skip to main content

GitGrounded

This project is from the BITSoM Vertex Builders Pitch Fest hackathon, Day 1, Software Automation AI Track. It solves:

"How can AI applications be tested, evaluated, monitored, or improved more reliably?"

"How can developers better manage prompts, models, agents, context, data, APIs, or AI workflows?"

Tests License: MIT Python 3.11+

What this actually does

You have an AI chatbot or assistant. You change its instructions (the "prompt"), or you swap which AI model powers it. Did that change make it better or worse?

Normally you find out when a customer complains. GitGrounded tells you first — it asks an AI to write a batch of test questions aimed at your exact change, runs your old version and new version against those questions, has a second AI grade both sets of answers, and gives you one word: PASS, WARN, or FAIL.

Think of it like a spell-checker, but for AI prompts instead of text.

The two ways to use it

1. Git mode — for your own code. You keep two versions of your prompt as two git branches. GitGrounded can literally see the diff between them, so it writes tests aimed at exactly what you changed.

2. Endpoint mode — for any live AI API, even one you don't control. GitGrounded can't see inside someone else's code, so instead it remembers what that API answered last time and checks if today's answers are still good.


Architecture

flowchart LR
    A[git ref: old] --> R[runner.py]
    B[git ref: new] --> R
    R --> D[diff]
    D --> G[generate.py<br/>writes 15-20 targeted test cases]
    R --> V1[old answers]
    R --> V2[new answers]
    G --> V1
    G --> V2
    V1 --> J[judge.py<br/>code checks + AI judge]
    V2 --> J
    J --> S[report.py<br/>PASS / WARN / FAIL]
    S --> RPT[report.json]
    RPT --> DASH[dashboard.py<br/>streamlit]
    RPT --> PR[GitHub PR comment]

Quick start

python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env

Open .env and fill in:

GITGROUNDED_MODE=dev
GROQ_API_KEY=
ANTHROPIC_API_KEY=

You don't need real API keys to try it out — use test mode first, it's free and instant:

GITGROUNDED_MODE=test python gitgrounded.py --demo citation --quick

If that prints a verdict at the end, everything's working.

What are the three modes?

Mode What it needs When to use it
test nothing trying things out, running the test suite
dev Ollama running on your computer free local development
demo Groq + Anthropic API keys the real thing, real AI models

Ollama setup, if you're using dev mode:

ollama pull qwen3:4b
ollama serve

(If your computer is low on GPU memory, use qwen2.5:3b instead — smaller and faster.)

Git mode needs your project to be a real git repo (git init, then commit once). Endpoint mode doesn't need git at all — it just needs a web address to call.

A note on the provider name

The live-API demo uses Groq (groq.com — very fast AI hosting), which is a different company from Grok (xAI's chatbot). Easy to mix up. GROQ_API_KEY is the one you need; get it at console.groq.com/keys.


All the commands, explained simply

Command In plain words
--old X --new Y "Compare these two git branches of my app"
--demo safe / citation / model "Run one of the three ready-made examples"
--rank --old X A B C "Which of these git branches is the best?"
--compare URL --label NAME "Check this one live API against what it said last time"
--check "Check every API I've registered in gitgrounded.yml"
--check URL "Check this one API, right now, no setup needed"
--rank NAME "Has this one API been getting better or worse over time?"
--labels "What APIs have I been tracking?"
--del-v NAME "Forget everything I've recorded about this API"
--del-v NAME 2 "Forget just version 2 of this API's history"
--del-v-all "Forget everything about every API"
--quick "Use fewer test questions, so this runs faster"
--app-module "Test my own app instead of the built-in example"

Comparing two of your own git branches

This is the main way to use GitGrounded on your own code.

git checkout -b baseline
git commit --allow-empty -m baseline

git checkout -b change-1
# now edit prompts/triage.txt, or config/model.yaml, however you like
git add -A && git commit -m "change 1"

python gitgrounded.py --old baseline --new change-1

Try it for free first, no API cost:

GITGROUNDED_MODE=test python gitgrounded.py --old baseline --new change-1 --quick

The three ready-made examples

Three branches already exist in this repo showing three kinds of change:

python gitgrounded.py --demo safe        # a harmless wording tweak — should PASS
python gitgrounded.py --demo citation    # removes an important instruction — should FAIL
python gitgrounded.py --demo model       # swaps to a cheaper AI model — should FAIL

Which version is best? (--rank, git mode)

Give it several branches, it tells you which one scored highest:

python gitgrounded.py --old baseline --rank test/safe-wording-tweak test/drop-citation-rule test/model-downgrade

Checking a live API (--compare)

Point it at any web address that answers questions:

python gitgrounded.py --compare "https://your-api.com/chat" --label "my-app" --quick

The address just needs to accept POST {"message": "..."} and reply with some JSON — that's the only rule.

The first time you run this, there's nothing to compare against yet, so it just remembers what it saw ("version 1"). Run it again any time later, and it checks today's answers against that memory. --label is just a name you pick, so GitGrounded knows which API's history it's looking at.

Checking several APIs at once (--check + gitgrounded.yml)

Instead of typing the address every time, list all your APIs once in a file called gitgrounded.yml:

targets:
  ai-chatbot:
    endpoint: http://localhost:8765/ai-chatbot
    questions: data/seed_cases.json
  ai-chatbot2:
    endpoint: http://localhost:8765/ai-chatbot2
    questions: data/seed_cases.json

Then just run:

python gitgrounded.py --check

This checks every API in that list, one after another.

You can also skip the file and check one address directly:

python gitgrounded.py --check "http://localhost:8765/ai-chatbot"

One thing to know: if you check the same API both through the yaml file and directly by typing its address, GitGrounded treats them as two separate things with two separate histories. Stick to one way of calling it for the same API.

Has an API gotten better or worse over time? (--rank, endpoint mode)

python gitgrounded.py --rank "ai-chatbot"

You need to have checked that API at least twice already for this to have anything to compare. It walks through every version you've saved and tells you, in plain words, whether each one was an improvement or a step backward.

Managing what's been saved

python gitgrounded.py --labels

Shows every API you've ever checked, and which version number it's on.

python gitgrounded.py --del-v ai-chatbot2

Deletes everything saved for that one API.

python gitgrounded.py --del-v ai-chatbot2 2

Deletes just version 2 of that API's history, keeps the rest.

python gitgrounded.py --del-v-all

Deletes everything, for every API. Use this to start completely fresh.

Testing your own app instead of the built-in example

app/triage.py is just a sample chatbot GitGrounded ships with, to demo against. To test your own app, write one function with this exact shape:

def run(message, prompt_text, model_config, providers_config):
    # call your own AI, however you want
    return {"raw": raw_text, "parsed": parsed_dict_or_none, "valid_json": True_or_False}

Then tell GitGrounded to use it instead:

python gitgrounded.py --demo citation --app-module myapp.mymodule

The example chatbot server

This repo includes servers/chatbots.py — three fake chatbots you can practice on, each with its own editable prompt file. Good for trying out endpoint mode before pointing it at something real.

Start it:

GITGROUNDED_MODE=dev python servers/chatbots.py

Check it's alive:

curl -X POST http://localhost:8765/ai-chatbot -H "Content-Type: application/json" -d '{"message":"hello"}'

Try the full loop — check it, change one of its prompts, check it again:

python gitgrounded.py --check --quick
echo "Keep every answer under 5 words." > servers/prompts/ai-chatbot2.txt
python gitgrounded.py --check --quick

The second check should show a real difference for ai-chatbot2 only, since that's the one you edited.


Running the test suite

pip install -r requirements.txt
pytest -v

22 tests, all free, no API keys needed. They use a fake AI provider so nothing costs money and nothing needs the internet. These same tests run automatically on GitHub every time code is pushed.

Where things are saved

  • .cache/ — remembers AI answers so you don't pay to ask the same question twice (git mode)
  • .versions/ — the history endpoint mode keeps for each API you've checked

Both are safe to delete any time — GitGrounded will just start fresh and rebuild them.

Automatic PR checks (optional)

If you push a pull request to GitHub, .github/workflows/gitgrounded.yml runs GitGrounded automatically and leaves a comment on the PR with the verdict. You'll need to add GROQ_API_KEY and ANTHROPIC_API_KEY as secrets in your repo's GitHub settings for this to work.

What's in this folder

app/triage.py             the sample chatbot used in git mode
prompts/triage.txt        its instructions (this is what you'd edit)
config/model.yaml         which AI model to use, per mode
config/providers.yaml     API connection details
data/                     sample company policy + test questions
gitgrounded.yml           your list of APIs to check
servers/chatbots.py       the practice chatbot server
servers/prompts/          that server's editable instructions
gitgrounded/              the actual GitGrounded code
gitgrounded.py            the command you actually run
dashboard.py              a visual results viewer (streamlit run dashboard.py)
tests/                    the test suite

Metadata

Release files for gitgrounded 0.1.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for gitgrounded 0.1.2
File Size Uploaded
gitgrounded-0.1.2.tar.gz 399.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for gitgrounded 0.1.2
File Interpreter ABI Platform
gitgrounded-0.1.2-py3-none-any.whl Python 3 none any Details

Total release size: 414.8 kB

Release files / gitgrounded-0.1.2.tar.gz

Download URL gitgrounded-0.1.2.tar.gz
Size 399.3 kB
Tags Source
SHA-256 checksum
How to use checksums
881186d7cec9689219b3ab9f9c20625391d2d143fdb67c1ca1a5d1d231dd9174
BLAKE2b-256 checksum
How to use checksums
bd42ee3d909540b400fa301a449e820d328a81af35af7fa89c58f32a8ff52c5d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 28, 2026.

Transparency log

Release files / gitgrounded-0.1.2-py3-none-any.whl

Download URL gitgrounded-0.1.2-py3-none-any.whl
Size 15.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
8c95c97bf0592b06d913b584a8cd86d9b670f7a7413d08cb7e454d2f8d70c310
BLAKE2b-256 checksum
How to use checksums
3bf07e936f58c422fce7118c62d6cc31881b84d305ad9a877e125516de8dd2d5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 28, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.1.2 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page