Skip to content

Commit c7eb168

Browse files
committed
feat: Update ollama integration with async client
1 parent 759c0b4 commit c7eb168

File tree

1 file changed

+38
-29
lines changed

1 file changed

+38
-29
lines changed

auto_commit.py

Lines changed: 38 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1+
import asyncio
12
import subprocess
23
import sys
3-
from ollama import chat
4-
from ollama import ChatResponse
4+
from ollama import AsyncClient
55

66
model = "gemma3:4b"
77
prompt = f"""
@@ -19,9 +19,11 @@
1919
2. Summarize all changes into a single logical commit.
2020
3. Write a concise commit message (max 72 characters) in the conventional commit style
2121
"""
22+
client = AsyncClient()
2223

23-
def get_changed_files():
24-
# Git add all
24+
25+
async def get_changed_files():
26+
# Git add all
2527
subprocess.run(
2628
["git", "add", "."],
2729
capture_output=True, text=True
@@ -40,7 +42,8 @@ def get_changed_files():
4042
# Union of both sets
4143
return sorted(unstaged | staged)
4244

43-
def get_diff_for_file(filename, staged=False):
45+
46+
async def get_diff_for_file(filename, staged=False):
4447
cmd = ["git", "diff"]
4548
if staged:
4649
cmd.append("--staged")
@@ -49,34 +52,38 @@ def get_diff_for_file(filename, staged=False):
4952
result = subprocess.run(cmd, capture_output=True, text=True)
5053
return result.stdout
5154

52-
def get_commit_messages(diff, files):
55+
56+
async def get_commit_messages(diff, files):
5357
# Use the Ollama chat model to get commit messages
5458
if len(diff) == 0 or len(files) == 0:
5559
return ""
5660
try:
57-
response: ChatResponse = chat(model=model, messages=[
58-
{
59-
'role': 'user',
60-
'content': prompt.replace("[Git Diff]", diff).replace("[Changed Files and Types]", files),
61-
},
62-
])
61+
messages = [
62+
{
63+
'role': 'user',
64+
'content': prompt.replace("[Git Diff]", diff).replace("[Changed Files and Types]", files),
65+
},
66+
]
67+
response = await client.chat(model=model, messages=messages)
6368
return response['message']['content']
6469
except Exception:
6570
return ""
66-
67-
def diff_single_file(file):
71+
72+
73+
async def diff_single_file(file):
6874
commit_messages = []
69-
unstaged_diff = get_diff_for_file(file, staged=False).strip()
70-
staged_diff = get_diff_for_file(file, staged=True).strip()
71-
messages_staged_diff = get_commit_messages(staged_diff, file).strip()
72-
messages_unstaged_diff = get_commit_messages(unstaged_diff, file).strip()
75+
unstaged_diff = (await get_diff_for_file(file, staged=False)).strip()
76+
staged_diff = (await get_diff_for_file(file, staged=True)).strip()
77+
messages_staged_diff = (await get_commit_messages(staged_diff, file)).strip()
78+
messages_unstaged_diff = (await get_commit_messages(unstaged_diff, file)).strip()
7379
if messages_staged_diff:
7480
commit_messages.append(messages_staged_diff)
7581
if messages_unstaged_diff:
7682
commit_messages.append(messages_unstaged_diff)
7783
return commit_messages
78-
""
79-
def git_commit_everything(message):
84+
85+
86+
async def git_commit_everything(message):
8087
"""
8188
Stages all changes (including new, modified, deleted files), commits with the given message,
8289
and pushes the commit to the current branch on the default remote ('origin').
@@ -87,26 +94,28 @@ def git_commit_everything(message):
8794
subprocess.run(['git', 'add', '-A'], check=True)
8895
# Commit with the provided message
8996
subprocess.run(['git', 'commit', '-m', message], check=True)
90-
91-
def main():
92-
commit_single_file = True if (len(sys.argv) > 1 and sys.argv[1] == "single_file") else False
93-
files = get_changed_files()
97+
98+
99+
async def main():
100+
commit_single_file = True if (
101+
len(sys.argv) > 1 and sys.argv[1] == "single_file") else False
102+
files = await get_changed_files()
94103
if not files:
95104
print("No changes detected.")
96105
return
97106

98107
all_commit_messages = []
99108
for file in files:
100109
print(f"{file}")
101-
commit_messages = diff_single_file(file)
110+
commit_messages = await diff_single_file(file)
102111
commit_messages_text = "\n".join(commit_messages)
103112
print(f"{commit_messages_text}")
104113
if commit_single_file:
105-
git_commit_everything(commit_messages_text)
106-
else:
114+
await git_commit_everything(commit_messages_text)
115+
else:
107116
all_commit_messages.extend(commit_messages)
108117
if all_commit_messages and not commit_single_file:
109-
git_commit_everything("\n".join(all_commit_messages))
118+
await git_commit_everything("\n".join(all_commit_messages))
110119

111120
if __name__ == "__main__":
112-
main()
121+
asyncio.run(main())

0 commit comments

Comments
 (0)