124 lines
4.2 KiB
Nix
124 lines
4.2 KiB
Nix
{ pkgs, ... }:
|
|
{
|
|
home.packages = [
|
|
(pkgs.writers.writePython3Bin
|
|
"tiktoken-cli"
|
|
{ libraries = [ pkgs.python3Packages.tiktoken ]; }
|
|
''
|
|
import os
|
|
import sys
|
|
import tiktoken
|
|
|
|
content = sys.stdin.read()
|
|
|
|
default = "gpt-3.5-turbo-0301"
|
|
model = os.getenv('TIKTOKEN_MODEL', default)
|
|
|
|
try:
|
|
encoding = tiktoken.encoding_for_model(model)
|
|
except KeyError:
|
|
encoding = tiktoken.get_encoding(default)
|
|
|
|
print(len(encoding.encode(content)))
|
|
'')
|
|
|
|
(pkgs.writeShellScriptBin "git-commit-ai" ''
|
|
# This bash script performs the following tasks:
|
|
# 1. Takes a git diff of modifications made to a repo.
|
|
# 2. Passes this diff to an LLM (Large Language Model) that generates a commit
|
|
# message.
|
|
#
|
|
# Usage: ./git-commit-ai --git-diff-commands --model
|
|
#
|
|
#
|
|
endpoint="10.0.10.100:11434"
|
|
|
|
diff=$(git diff "$@" )
|
|
[ -z "$diff" ] && echo "No diff provided. Did you stage the changes?" && exit 1
|
|
tokens=$(echo "$diff" | tiktoken-cli)
|
|
echo -e "\n\nEstimated tokens: $tokens\n\n"
|
|
choose_model() {
|
|
models_response=$(curl http://$endpoint/api/tags)
|
|
model=$(echo "$models_response" | jq -r '..|.model? // empty' | fzf | sed 's/:latest$//')
|
|
}
|
|
choose_model
|
|
|
|
system_message="""
|
|
You are a git commit generator. You will be provided with a git diff file.
|
|
Your role is to create a concise commit message that outlines all of the
|
|
most relevant and impactful changes in the diff. You only output a commit
|
|
message, do not write anything else not related to the commit. Use
|
|
imperative mood for you writing style.
|
|
|
|
Your message should include a short summary in the first line followed by
|
|
more detailed descriptions of the changes on subsequent lines.
|
|
|
|
The first line summary should be no more than 70 characters, not end with a
|
|
period, and a blank line should separate the summary from the body of the
|
|
message.
|
|
|
|
There should only be 1 summary line, and 1 body with the description.
|
|
The body should include no more than 3 bullet points with more detailed
|
|
descriptions of the files and functions that have been modified.
|
|
|
|
Do not output any code.
|
|
"""
|
|
|
|
query=$(jq -n --arg model "$model" --arg system_message "$system_message" --arg prompt "$diff" '{model: $model, system: $system_message, prompt: $prompt, stream: false}')
|
|
echo "$query"
|
|
|
|
git config commit.template ".git/gitmessage"
|
|
|
|
redo=""
|
|
while true
|
|
do
|
|
|
|
[ -z "$redo" ] && echo "Using model: $model" && commit_message=$(curl -s http://$endpoint/api/generate -H "Content-Type: application/json" -d "$query" | jq -r '.response')
|
|
|
|
echo ""
|
|
echo "Message:"
|
|
echo "---------------------------------------------"
|
|
echo ""
|
|
echo "$commit_message"
|
|
echo ""
|
|
echo "---------------------------------------------"
|
|
echo "What would you like to do?"
|
|
echo ""
|
|
echo "Copy to clipboard (c)"
|
|
echo "Git commit in editor (g)"
|
|
echo "Open in editor (e)"
|
|
echo "Show diff (d)"
|
|
echo "Choose different model (m)"
|
|
echo "Exit and do nothing (q)"
|
|
|
|
read -r -p "Action: (c|g|e|q) " input
|
|
|
|
case "$input" in
|
|
"c") echo "$commit_message" | ${pkgs.xclip}/bin/xclip -i -selection CLIPBOARD &&
|
|
${pkgs.libnotify}/bin/notify-send "AI Buddy" "Copied to clipboard"
|
|
exit 0
|
|
;;
|
|
"g") echo "$commit_message" > ".git/gitmessage" &&
|
|
git commit -e
|
|
cat /dev/null > ".git/gitmessage" # clear the template
|
|
exit 0
|
|
;;
|
|
"d") echo -e "Current commit message:\n\n$commit_message\n\nDiff file:\n\n$diff" | less
|
|
redo=true
|
|
shift
|
|
;;
|
|
"e") echo "$commit_message" | nvim -
|
|
exit 0
|
|
;;
|
|
"m") choose_model && shift
|
|
;;
|
|
"q") exit 0
|
|
;;
|
|
*) exit 0
|
|
esac
|
|
done
|
|
|
|
'')
|
|
];
|
|
}
|