diff --git a/README.md b/README.md index f62b0b9db..a32d8661d 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ It also has features that [help GPT-4 understand and modify larger codebases](ht

- +

diff --git a/aider/coders/base_coder.py b/aider/coders/base_coder.py index c969c4278..94748617f 100755 --- a/aider/coders/base_coder.py +++ b/aider/coders/base_coder.py @@ -746,11 +746,11 @@ class Coder: # Check if the file is already in the repo if self.repo: - tracked_files = set(self.get_tracked_files()) + tracked_files = set(self.repo.get_tracked_files()) relative_fname = self.get_rel_fname(full_path) if relative_fname not in tracked_files and self.io.confirm_ask(f"Add {path} to git?"): if not self.dry_run: - self.repo.git.add(full_path) + self.repo.repo.git.add(full_path) if write_content: self.io.write_text(full_path, write_content) diff --git a/aider/commands.py b/aider/commands.py index 6fd5fa594..0eae3a8b1 100644 --- a/aider/commands.py +++ b/aider/commands.py @@ -135,33 +135,38 @@ class Commands: self.io.tool_output() width = 8 + cost_width = 7 def fmt(v): return format(int(v), ",").rjust(width) col_width = max(len(row[1]) for row in res) + cost_pad = " " * cost_width total = 0 + total_cost = 0.0 for tk, msg, tip in res: total += tk + cost = tk * (self.coder.main_model.prompt_price / 1000) + total_cost += cost msg = msg.ljust(col_width) - self.io.tool_output(f"{fmt(tk)} {msg} {tip}") + self.io.tool_output(f"${cost:5.2f} {fmt(tk)} {msg} {tip}") - self.io.tool_output("=" * width) - self.io.tool_output(f"{fmt(total)} tokens total") + self.io.tool_output("=" * (width + cost_width + 1)) + self.io.tool_output(f"${total_cost:5.2f} {fmt(total)} tokens total") limit = self.coder.main_model.max_context_tokens remaining = limit - total if remaining > 1024: - self.io.tool_output(f"{fmt(remaining)} tokens remaining in context window") + self.io.tool_output(f"{cost_pad}{fmt(remaining)} tokens remaining in context window") elif remaining > 0: self.io.tool_error( - f"{fmt(remaining)} tokens remaining in context window (use /drop or /clear to make" - " space)" + f"{cost_pad}{fmt(remaining)} tokens remaining in context window (use /drop or" + " /clear to make space)" ) else: - self.io.tool_error(f"{fmt(remaining)} tokens remaining, window exhausted!") - self.io.tool_output(f"{fmt(limit)} tokens max context window size") + self.io.tool_error(f"{cost_pad}{fmt(remaining)} tokens remaining, window exhausted!") + self.io.tool_output(f"{cost_pad}{fmt(limit)} tokens max context window size") def cmd_undo(self, args): "Undo the last git commit if it was done by aider" diff --git a/aider/sendchat.py b/aider/sendchat.py index 441447863..56b46bd4a 100644 --- a/aider/sendchat.py +++ b/aider/sendchat.py @@ -4,7 +4,13 @@ import json import backoff import openai import requests -from openai.error import APIError, RateLimitError, ServiceUnavailableError, Timeout +from openai.error import ( + APIConnectionError, + APIError, + RateLimitError, + ServiceUnavailableError, + Timeout, +) @backoff.on_exception( @@ -14,6 +20,7 @@ from openai.error import APIError, RateLimitError, ServiceUnavailableError, Time APIError, ServiceUnavailableError, RateLimitError, + APIConnectionError, requests.exceptions.ConnectionError, ), max_tries=10, diff --git a/tests/test_coder.py b/tests/test_coder.py index a9ffaeca5..72b247727 100644 --- a/tests/test_coder.py +++ b/tests/test_coder.py @@ -22,6 +22,37 @@ class TestCoder(unittest.TestCase): def tearDown(self): self.patcher.stop() + def test_allowed_to_edit(self): + with GitTemporaryDirectory(): + repo = git.Repo(Path.cwd()) + fname = Path("foo.txt") + fname.touch() + repo.git.add(str(fname)) + repo.git.commit("-m", "init") + + io = InputOutput(yes=True) + # Initialize the Coder object with the mocked IO and mocked repo + coder = Coder.create(models.GPT4, None, io, fnames=["foo.txt"]) + + self.assertTrue(coder.allowed_to_edit("foo.txt")) + self.assertTrue(coder.allowed_to_edit("new.txt")) + + def test_allowed_to_edit_no(self): + with GitTemporaryDirectory(): + repo = git.Repo(Path.cwd()) + fname = Path("foo.txt") + fname.touch() + repo.git.add(str(fname)) + repo.git.commit("-m", "init") + + # say NO + io = InputOutput(yes=False) + + coder = Coder.create(models.GPT4, None, io, fnames=["foo.txt"]) + + self.assertTrue(coder.allowed_to_edit("foo.txt")) + self.assertFalse(coder.allowed_to_edit("new.txt")) + def test_get_last_modified(self): # Mock the IO object mock_io = MagicMock()