Observed since 21 Oct, 09:58 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
AI generated commit messages
aiautocommit analyzes your staged changes and creates conventional commit messages.
Yes, there are a lot of these. Main ways this is different:
.aiautocommit file or folder)uvx aiautocommit
Note: OpenAI, Anthropic, and Gemini (Google) are supported by default. To install all providers supported by Pydantic AI, use
pip install "aiautocommit[all-providers]".
--version)uv.lock, package-lock.json) generate conventional messages (e.g., chore(deps): update uv.lock) even when they are excluded from the AI prompt.Set your API key (works for any provider, Google Gemini is the default):
export AIAUTOCOMMIT_AI_KEY=<YOUR API KEY>
export AIAUTOCOMMIT_MODEL=google:gemini-3.8-flash
Stage your changes and run aiautocommit:
git add .
# this will generate a commit message and commit the changes
aiautocommit commit
# or, just to see what it will do
aiautocommit commit --print-message
Using the CLI directly is the best way to debug and tinker with the project as well.
Lock files (like uv.lock, package-lock.json, Gemfile.lock, etc.) are frequently updated but don't provide much context for an AI-generated message. By default, these are excluded from the AI prompt to save tokens and improve quality.
However, if you stage only lock files, aiautocommit will detect them and automatically generate a conventional commit message:
uv.lock -> chore(deps): update uv.lockpackage-lock.json -> chore(deps): update package-lock.jsonchore(deps): update lock filesIf any non-lock files are staged alongside them, the AI will ignore the lock files (based on your exclusions) and focus on the code changes.
To provide even better commit messages, aiautocommit can automatically pull in the title and body of the pull request associated with your current branch. This gives the AI full context of the "why" behind your changes.
This feature is disabled by default to keep execution fast. To enable it:
export AIAUTOCOMMIT_INCLUDE_PR_CONTEXT=true
How it works:
gh) to find an open PR for the current branch..git/aiautocommit/<PR_NUMBER>_pull_request.md for 2 hours..git/aiautocommit/ if you want to refine the context sent to the AI.Requirements:
gh) installed and authenticated.First, you'll want to enable logging so you can extract the diff and prompt and iterate on it in ChatGPT:
export AIAUTOCOMMIT_LOG_LEVEL=DEBUG
export AIAUTOCOMMIT_LOG_PATH=aiautocommit.log
Now, you'll have a log you can tail and fiddle with from there.
Additional debugging commands:
# Print the compiled system prompt (after all config files are merged)
aiautocommit output-prompt
# Print the compiled file exclusions list
aiautocommit output-exclusions
# Generate a ChatGPT-ready debug block for a past commit to help iterate on the prompt
aiautocommit debug-prompt <sha> "the commit message was too vague"
# Ignore commands.md and instructions.md in home-level AI harness ignore files
aiautocommit global-ignores --dry-run
aiautocommit global-ignores
debug-prompt outputs the diff, the generated commit message, and the full prompt in a format you can paste directly into ChatGPT to get suggestions for improving the prompt.
aiautocommit looks for configuration files in these locations (in priority order):
.aiautocommit in git root (or current directory) — as a directory for full config, or a file to append to the default promptTo get started with customization:
aiautocommit dump-prompts
This creates a .aiautocommit/ directory with:
commit_prompt.txt: Template for generating commit messagesexcluded_files.txt: List of files or glob patterns (e.g., mise*lock) to exclude from processingcommit_suffix.txt: Git trailers appended to every generated message (default Generated-by: aiautocommit). Trailers are stacked into one block after a blank line at the end of the subject/body — including trailers the model already wrote, such as Dev-Note:.If you create .aiautocommit/examples/example_1.md, example_2.md, and so on, they are appended to the prompt in filename order as few-shot examples. Keep them small and use this format:
<example>
<diff>
diff --git ...
</diff>
<diffAnalysis>
- short|medium|large diff
- omit body | include body
- primary change: one-line intent
</diffAnalysis>
<commitMessage>
feat: concise subject
- optional body bullet
</commitMessage>
</example>
If you only want to extend the default prompt rather than replace it entirely, create a plain .aiautocommit file (not a directory) in your repo root. Its contents will be appended to the stock commit_prompt.txt:
echo "Always include the ticket number from the branch name in the subject line." > .aiautocommit
This is the simplest way to add project-specific instructions without duplicating the full default prompt.
To automatically generate commit messages during git commits:
aiautocommit install
Learn more about git hooks here.
First, dump the prompts into your project:
aiautocommit dump-prompts
Then add your scope specification to the commit prompt:
<scopes>
Optional scopes (e.g., `feat(api):`):
- `api`: API endpoints, controllers, services.
- `frontend`: React components, styles, state management.
- `migration`: Database schema changes.
- `jobs`: Background jobs, scheduled tasks.
- `infra`: Infrastructure, networking, deployment, containerization.
- `prompt`: Updates to LLM or AI prompts.
</scopes>
Lefthook is a tool for managing git hooks. To use aiautocommit with lefthook, add the following to your .lefthook.yml:
prepare-commit-msg:
commands:
aiautocommit:
run: aiautocommit commit --output-file "{1}"
interactive: true
env:
# without this, lefthook will run in an infinite loop
LEFTHOOK: 0
# ensures that LOG_LEVEL config of the current project does not interfere with aiautocommit
AIAUTOCOMMIT_LOG_LEVEL: info
skip:
merge:
rebase:
# only run this if the tool exists
run: ! which aiautocommit > /dev/null
All environment variables used by aiautocommit or its providers can be prefixed with AIAUTOCOMMIT_ to take precedence over the standard variable.
AIAUTOCOMMIT_AI_KEY: Universal API key. aiautocommit internally maps this to the correct provider-specific variable (e.g., GOOGLE_API_KEY, OPENAI_API_KEY) based on your active model.AIAUTOCOMMIT_MODEL: AI model to use, in provider:model format (default: google:gemini-3.8-flash). Examples: anthropic:claude-3-5-sonnet-latest, openai:gpt-4o.AIAUTOCOMMIT_CONFIG: Custom config directory pathAIAUTOCOMMIT_LOG_LEVEL: Logging verbosityAIAUTOCOMMIT_LOG_PATH: Custom log file pathEnsure you have the corresponding API key set in AIAUTOCOMMIT_AI_KEY.
aiautocommit uses pydantic-ai under the hood, supporting a wide range of providers including OpenAI, Anthropic, and Gemini (via VertexAI or Generative AI) by default. You can specify the model using the provider:model syntax in the AIAUTOCOMMIT_MODEL environment variable.
Google Gemini models use pydantic-ai's unified thinking setting at low effort. minimal is not used: newer Gemini models reject it.
Common examples:
google:gemini-3.8-flash (default)openai:gpt-4oanthropic:claude-3-5-sonnet-latestollama:llama3 (for local models)Ensure you have the corresponding API key set in your environment (e.g., ANTHROPIC_API_KEY for Anthropic models).
Meta's Model API at dev.meta.ai is OpenAI-compatible. Because Pydantic AI does not yet have a dedicated meta: provider class, use the openai: prefix along with AIAUTOCOMMIT_OPENAI_BASE_URL:
export AIAUTOCOMMIT_MODEL="openai:muse-spark-1.3-contributor"
export AIAUTOCOMMIT_OPENAI_BASE_URL="https://api.meta.ai/v1"
Difftastic integration was removed. While difftastic produces semantically richer diffs, LLMs do not interpret its output format well, leading to worse commit messages than standard git diff.
Some guides to writing commit messages:
This project inspired this project. It had a simple codebase. I've taken the idea and expanded it to include more features, specifically per-project prompt customization.
I looked at a bunch of projects before building this one.
This project was created from iloveitaly/python-package-template
Download counts and popularity will appear here as the collector receives them.
| Version | Published | Direct dependencies | Open version |
|---|---|---|---|
| 0.28.1 | 24 Sept 2026 | 5 |
This describes our collected data; it is not a security assessment.
Observed since 21 Oct, 09:58 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package:c40d430ff32c8d92b98de4e6c6a520abdfa222b0071e467c9216d746a9b82640