From c3952cb985a8d9273fbcbbfcd19d2bcf503a3363 Mon Sep 17 00:00:00 2001 From: Titusz Pan Date: Mon, 13 Jan 2025 17:51:02 +0100 Subject: [PATCH 001/229] feat: Add line endings configuration option for file writing --- aider/args.py | 6 ++++++ aider/io.py | 5 ++++- aider/main.py | 1 + 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/aider/args.py b/aider/args.py index 642858ec3..b880605a9 100644 --- a/aider/args.py +++ b/aider/args.py @@ -766,6 +766,12 @@ def get_parser(default_config_files, git_root): default="utf-8", help="Specify the encoding for input and output (default: utf-8)", ) + group.add_argument( + "--line-endings", + choices=["platform", "lf", "crlf"], + default="platform", + help="Line endings to use when writing files (default: platform)", + ) group.add_argument( "-c", "--config", diff --git a/aider/io.py b/aider/io.py index dc50b4178..b79b0e63c 100644 --- a/aider/io.py +++ b/aider/io.py @@ -198,6 +198,7 @@ class InputOutput: completion_menu_current_bg_color=None, code_theme="default", encoding="utf-8", + line_endings="platform", dry_run=False, llm_history_file=None, editingmode=EditingMode.EMACS, @@ -244,6 +245,8 @@ class InputOutput: self.chat_history_file = None self.encoding = encoding + self.newline = None if line_endings == "platform" \ + else "\n" if line_endings == "lf" else "\r\n" self.dry_run = dry_run current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") @@ -375,7 +378,7 @@ class InputOutput: delay = initial_delay for attempt in range(max_retries): try: - with open(str(filename), "w", encoding=self.encoding) as f: + with open(str(filename), "w", encoding=self.encoding, newline=self.newline) as f: f.write(content) return # Successfully wrote the file except PermissionError as err: diff --git a/aider/main.py b/aider/main.py index 33b23c66d..943c74d21 100644 --- a/aider/main.py +++ b/aider/main.py @@ -552,6 +552,7 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F code_theme=args.code_theme, dry_run=args.dry_run, encoding=args.encoding, + line_endings=args.line_endings, llm_history_file=args.llm_history_file, editingmode=editing_mode, fancy_input=args.fancy_input, From b06e765e688966d366a7ff95a22c530cafe05922 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Mon, 13 Jan 2025 08:58:26 -0800 Subject: [PATCH 002/229] copy --- aider/commands.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aider/commands.py b/aider/commands.py index 13f267a12..a276b66cb 100644 --- a/aider/commands.py +++ b/aider/commands.py @@ -1069,7 +1069,7 @@ class Commands: return self._generic_chat_command(args, self.coder.main_model.edit_format) def cmd_architect(self, args): - """Enter architect mode to discuss high-level design and architecture. If no prompt provided, switches to architect mode.""" # noqa + """Enter architect/editor mode using 2 different models. If no prompt provided, switches to architect/editor mode.""" # noqa return self._generic_chat_command(args, "architect") def _generic_chat_command(self, args, edit_format): From add2f6f66992bdc0ffb4fb47990a088ab2ab469f Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Mon, 13 Jan 2025 09:00:21 -0800 Subject: [PATCH 003/229] copy --- aider/website/assets/sample-analytics.jsonl | 12 ++++++------ aider/website/docs/faq.md | 4 ++-- aider/website/docs/usage/commands.md | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/aider/website/assets/sample-analytics.jsonl b/aider/website/assets/sample-analytics.jsonl index 9c3fa2fe4..755465e90 100644 --- a/aider/website/assets/sample-analytics.jsonl +++ b/aider/website/assets/sample-analytics.jsonl @@ -1,9 +1,3 @@ -{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736438263} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736438264} -{"event": "repo", "properties": {"num_files": 18}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736438266} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736438266} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 3838, "completion_tokens": 1843, "total_tokens": 5681, "cost": 0.0010533600000000001, "total_cost": 0.0010533600000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736438311} -{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736440041} {"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736440043} {"event": "repo", "properties": {"num_files": 18}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736440045} {"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736440045} @@ -998,3 +992,9 @@ {"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736640204} {"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 4692, "completion_tokens": 202, "total_tokens": 4894, "cost": 0.0007134399999980401, "total_cost": 0.0007134399999980401}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736640209} {"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736640209} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736640352} +{"event": "gui session", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736640352} +{"event": "exit", "properties": {"reason": "GUI session ended"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736640352} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736640454} +{"event": "gui session", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736640455} +{"event": "exit", "properties": {"reason": "GUI session ended"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736640455} diff --git a/aider/website/docs/faq.md b/aider/website/docs/faq.md index a2922ff0c..668aad49e 100644 --- a/aider/website/docs/faq.md +++ b/aider/website/docs/faq.md @@ -237,8 +237,8 @@ tr:hover { background-color: #f5f5f5; } - - + +
Model NameTotal TokensPercent
deepseek/deepseek-chat1,258,43686.2%
claude-3-5-sonnet-20241022178,35212.2%
deepseek/deepseek-chat1,252,75586.2%
claude-3-5-sonnet-20241022178,35212.3%
o122,7481.6%
diff --git a/aider/website/docs/usage/commands.md b/aider/website/docs/usage/commands.md index 9d2e13a81..b73d82ac8 100644 --- a/aider/website/docs/usage/commands.md +++ b/aider/website/docs/usage/commands.md @@ -22,7 +22,7 @@ cog.out(get_help_md()) |Command|Description| |:------|:----------| | **/add** | Add files to the chat so aider can edit them or review them in detail | -| **/architect** | Enter architect mode to discuss high-level design and architecture. If no prompt provided, switches to architect mode. | +| **/architect** | Enter architect/editor mode using 2 different models. If no prompt provided, switches to architect/editor mode. | | **/ask** | Ask questions about the code base without editing any files. If no prompt provided, switches to ask mode. | | **/chat-mode** | Switch to a new chat mode | | **/clear** | Clear the chat history | From de7da1e8063382c85eaad48dd1a17e81494c8b1d Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Mon, 13 Jan 2025 09:12:56 -0800 Subject: [PATCH 004/229] copy --- aider/website/docs/faq.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/aider/website/docs/faq.md b/aider/website/docs/faq.md index 668aad49e..496e1db80 100644 --- a/aider/website/docs/faq.md +++ b/aider/website/docs/faq.md @@ -141,6 +141,18 @@ When starting a fresh aider session, you can include recent git history in the c Remember, the chat history already includes recent changes made during the current session, so this tip is most useful when starting a new aider session and you want to provide context about recent work. +You can also use aider to review PR branches: + +``` +/run git diff one-branch..another-branch + +... + +Add 6.9k tokens of command output to the chat? (Y)es/(N)o [Yes]: Yes + +/ask Are there any problems with the way this change works with the FooBar class? +``` + {: .tip } The `/git` command will not work for this purpose, as its output is not included in the chat. From f28c912d5a56e77c6080ba295dfcb4cf9c6d88b8 Mon Sep 17 00:00:00 2001 From: Titusz Pan Date: Mon, 13 Jan 2025 18:29:04 +0100 Subject: [PATCH 005/229] refactor: Reorder exception handling in file reading method --- aider/io.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/aider/io.py b/aider/io.py index dc50b4178..e977b79ff 100644 --- a/aider/io.py +++ b/aider/io.py @@ -342,10 +342,6 @@ class InputOutput: try: with open(str(filename), "r", encoding=self.encoding) as f: return f.read() - except OSError as err: - if not silent: - self.tool_error(f"{filename}: unable to read: {err}") - return except FileNotFoundError: if not silent: self.tool_error(f"{filename}: file not found error") @@ -354,6 +350,10 @@ class InputOutput: if not silent: self.tool_error(f"{filename}: is a directory") return + except OSError as err: + if not silent: + self.tool_error(f"{filename}: unable to read: {err}") + return except UnicodeError as e: if not silent: self.tool_error(f"{filename}: {e}") From c22202585d46b13e6e1a980e7f19365358bd214c Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Mon, 13 Jan 2025 09:35:01 -0800 Subject: [PATCH 006/229] fix: validate line_endings parameter in InputOutput initialization --- aider/io.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/aider/io.py b/aider/io.py index b79b0e63c..140847c9e 100644 --- a/aider/io.py +++ b/aider/io.py @@ -245,6 +245,12 @@ class InputOutput: self.chat_history_file = None self.encoding = encoding + valid_line_endings = {"platform", "lf", "crlf"} + if line_endings not in valid_line_endings: + raise ValueError( + f"Invalid line_endings value: {line_endings}. " + f"Must be one of: {', '.join(valid_line_endings)}" + ) self.newline = None if line_endings == "platform" \ else "\n" if line_endings == "lf" else "\r\n" self.dry_run = dry_run From 869f37cd89986648a7491a0115e3afb74cf9094b Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Mon, 13 Jan 2025 09:35:07 -0800 Subject: [PATCH 007/229] style: Format code for better readability in io.py --- aider/io.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/aider/io.py b/aider/io.py index 140847c9e..66ae26382 100644 --- a/aider/io.py +++ b/aider/io.py @@ -251,8 +251,9 @@ class InputOutput: f"Invalid line_endings value: {line_endings}. " f"Must be one of: {', '.join(valid_line_endings)}" ) - self.newline = None if line_endings == "platform" \ - else "\n" if line_endings == "lf" else "\r\n" + self.newline = ( + None if line_endings == "platform" else "\n" if line_endings == "lf" else "\r\n" + ) self.dry_run = dry_run current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") From fa80d2f3cc8142950329e73dc4801fa001f69d84 Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Mon, 13 Jan 2025 09:36:26 -0800 Subject: [PATCH 008/229] test: add line endings validation tests for InputOutput --- tests/basic/test_io.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tests/basic/test_io.py b/tests/basic/test_io.py index d6762df93..5f56a278a 100644 --- a/tests/basic/test_io.py +++ b/tests/basic/test_io.py @@ -12,6 +12,18 @@ from aider.utils import ChdirTemporaryDirectory class TestInputOutput(unittest.TestCase): + def test_line_endings_validation(self): + # Test valid line endings + for ending in ["platform", "lf", "crlf"]: + io = InputOutput(line_endings=ending) + self.assertEqual(io.newline, None if ending == "platform" else "\n" if ending == "lf" else "\r\n") + + # Test invalid line endings + with self.assertRaises(ValueError) as cm: + io = InputOutput(line_endings="invalid") + self.assertIn("Invalid line_endings value: invalid", str(cm.exception)) + self.assertIn("Must be one of: platform, lf, crlf", str(cm.exception)) + def test_no_color_environment_variable(self): with patch.dict(os.environ, {"NO_COLOR": "1"}): io = InputOutput(fancy_input=False) From ebb38c65187c0f47a87a55eb267b48b3b481e771 Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Mon, 13 Jan 2025 09:36:31 -0800 Subject: [PATCH 009/229] style: Format test_io.py to comply with linter rules --- tests/basic/test_io.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/basic/test_io.py b/tests/basic/test_io.py index 5f56a278a..15de208b0 100644 --- a/tests/basic/test_io.py +++ b/tests/basic/test_io.py @@ -16,7 +16,9 @@ class TestInputOutput(unittest.TestCase): # Test valid line endings for ending in ["platform", "lf", "crlf"]: io = InputOutput(line_endings=ending) - self.assertEqual(io.newline, None if ending == "platform" else "\n" if ending == "lf" else "\r\n") + self.assertEqual( + io.newline, None if ending == "platform" else "\n" if ending == "lf" else "\r\n" + ) # Test invalid line endings with self.assertRaises(ValueError) as cm: From b9edec069a49b7bd4af1f9649ee6c237c7c6acea Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Mon, 13 Jan 2025 09:38:13 -0800 Subject: [PATCH 010/229] fix: Update test to match error message format for line endings validation --- tests/basic/test_io.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/basic/test_io.py b/tests/basic/test_io.py index 15de208b0..bbce17820 100644 --- a/tests/basic/test_io.py +++ b/tests/basic/test_io.py @@ -24,7 +24,7 @@ class TestInputOutput(unittest.TestCase): with self.assertRaises(ValueError) as cm: io = InputOutput(line_endings="invalid") self.assertIn("Invalid line_endings value: invalid", str(cm.exception)) - self.assertIn("Must be one of: platform, lf, crlf", str(cm.exception)) + self.assertIn("Must be one of: platform, crlf, lf", str(cm.exception)) def test_no_color_environment_variable(self): with patch.dict(os.environ, {"NO_COLOR": "1"}): From 0cba898280efcafe8c08ace89cac4a24193c66e7 Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Mon, 13 Jan 2025 09:38:36 -0800 Subject: [PATCH 011/229] fix: Make line endings validation test order-independent --- tests/basic/test_io.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/basic/test_io.py b/tests/basic/test_io.py index bbce17820..3aadaff3d 100644 --- a/tests/basic/test_io.py +++ b/tests/basic/test_io.py @@ -24,7 +24,10 @@ class TestInputOutput(unittest.TestCase): with self.assertRaises(ValueError) as cm: io = InputOutput(line_endings="invalid") self.assertIn("Invalid line_endings value: invalid", str(cm.exception)) - self.assertIn("Must be one of: platform, crlf, lf", str(cm.exception)) + # Check each valid option is in the error message + self.assertIn("platform", str(cm.exception)) + self.assertIn("crlf", str(cm.exception)) + self.assertIn("lf", str(cm.exception)) def test_no_color_environment_variable(self): with patch.dict(os.environ, {"NO_COLOR": "1"}): From bbcde55a9eb98dd9fbdedcc0a22c9996b276fbd4 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Mon, 13 Jan 2025 10:18:34 -0800 Subject: [PATCH 012/229] copy --- aider/website/assets/sample-analytics.jsonl | 94 ++++++++++----------- aider/website/assets/sample.aider.conf.yml | 3 + aider/website/assets/sample.env | 3 + aider/website/docs/config/aider_conf.md | 3 + aider/website/docs/config/dotenv.md | 3 + aider/website/docs/config/options.md | 7 +- aider/website/docs/faq.md | 7 +- 7 files changed, 69 insertions(+), 51 deletions(-) diff --git a/aider/website/assets/sample-analytics.jsonl b/aider/website/assets/sample-analytics.jsonl index 755465e90..089fa2d38 100644 --- a/aider/website/assets/sample-analytics.jsonl +++ b/aider/website/assets/sample-analytics.jsonl @@ -1,50 +1,3 @@ -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736440043} -{"event": "repo", "properties": {"num_files": 18}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736440045} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736440045} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 5367, "completion_tokens": 846, "total_tokens": 6213, "cost": 0.0009882600000000001, "total_cost": 0.0009882600000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736440068} -{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736440073} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736440075} -{"event": "repo", "properties": {"num_files": 18}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736440077} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736440077} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 3876, "completion_tokens": 750, "total_tokens": 4626, "cost": 0.0007526400000000001, "total_cost": 0.0007526400000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736440096} -{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736440101} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736440103} -{"event": "repo", "properties": {"num_files": 18}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736440104} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736440104} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 4568, "completion_tokens": 4035, "total_tokens": 8603, "cost": 0.00176932, "total_cost": 0.00176932}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736440364} -{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736440371} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736440374} -{"event": "repo", "properties": {"num_files": 18}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736440377} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736440377} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 4543, "completion_tokens": 770, "total_tokens": 5313, "cost": 0.0008516200000000001, "total_cost": 0.0008516200000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736440395} -{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736440398} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736442977} -{"event": "repo", "properties": {"num_files": 18}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736442979} -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736442979} -{"event": "ai-comments file-add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736442994} -{"event": "ai-comments file-add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736443000} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736443178} -{"event": "repo", "properties": {"num_files": 18}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736443179} -{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736443183} -{"event": "command_reset", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736443184} -{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736443187} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736443193} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 5349, "completion_tokens": 1052, "total_tokens": 6401, "cost": 0.0010434200000000002, "total_cost": 0.0010434200000000002}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736443218} -{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736443227} -{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736443236} -{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736443255} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736443256} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 20028, "completion_tokens": 535, "total_tokens": 20563, "cost": 0.00295372, "total_cost": 0.00399714}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736443274} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736443285} -{"event": "repo", "properties": {"num_files": 19}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736443287} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736443287} -{"event": "command_read-only", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736443289} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 3244, "completion_tokens": 748, "total_tokens": 3992, "cost": 0.0006636000000000001, "total_cost": 0.0006636000000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736443304} -{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736443306} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736443308} -{"event": "repo", "properties": {"num_files": 19}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736443309} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736443309} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 3201, "completion_tokens": 619, "total_tokens": 3820, "cost": 0.00062146, "total_cost": 0.00062146}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736443324} {"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736443564} {"event": "command_reset", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736443777} {"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736443787} @@ -998,3 +951,50 @@ {"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736640454} {"event": "gui session", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736640455} {"event": "exit", "properties": {"reason": "GUI session ended"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736640455} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736787629} +{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736787631} +{"event": "cli session", "properties": {"main_model": "o1", "weak_model": "gpt-4o-mini", "editor_model": "gpt-4o", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736787631} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736787631} +{"event": "message_send", "properties": {"main_model": "o1", "weak_model": "gpt-4o-mini", "editor_model": "gpt-4o", "edit_format": "diff", "prompt_tokens": 2366, "completion_tokens": 212, "total_tokens": 2578, "cost": 0.04821, "total_cost": 0.04821}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736787636} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736787696} +{"event": "gui session", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736787697} +{"event": "exit", "properties": {"reason": "GUI session ended"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736787697} +{"event": "command_run", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736788221} +{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736788278} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736788436} +{"event": "gui session", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736788436} +{"event": "exit", "properties": {"reason": "GUI session ended"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736788436} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736788785} +{"event": "exit", "properties": {"reason": "Listed models"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736788787} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736788803} +{"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736788804} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736788805} +{"event": "message_send", "properties": {"main_model": "mistral/codestral-latest", "weak_model": "mistral/codestral-latest", "editor_model": "mistral/codestral-latest", "edit_format": "whole", "prompt_tokens": 8094, "completion_tokens": 43, "total_tokens": 8137, "cost": 0.008223000000000001, "total_cost": 0.008223000000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736788807} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736788807} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736789235} +{"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736789237} +{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736789237} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736789251} +{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 18807, "completion_tokens": 478, "total_tokens": 19285, "cost": 0.0027668199999980403, "total_cost": 0.0027668199999980403}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736789270} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736789276} +{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 19375, "completion_tokens": 162, "total_tokens": 19537, "cost": 0.00275785999999804, "total_cost": 0.00552467999999608}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736789285} +{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736789291} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736789294} +{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 22233, "completion_tokens": 723, "total_tokens": 22956, "cost": 0.00331505999999804, "total_cost": 0.00883973999999412}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736789319} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736789595} +{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 23444, "completion_tokens": 232, "total_tokens": 23676, "cost": 0.0033471199999980405, "total_cost": 0.01218685999999216}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736789608} +{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736789640} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736789682} +{"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736789684} +{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736789684} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736789686} +{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 18927, "completion_tokens": 241, "total_tokens": 19168, "cost": 0.00271725999999804, "total_cost": 0.00271725999999804}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736789699} +{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736789766} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736789768} +{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 21935, "completion_tokens": 374, "total_tokens": 22309, "cost": 0.0031756199999980403, "total_cost": 0.005892879999996081}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736789784} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736789879} +{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 24221, "completion_tokens": 208, "total_tokens": 24429, "cost": 0.0034491799999980407, "total_cost": 0.009342059999994122}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736789890} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736789900} +{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 26206, "completion_tokens": 251, "total_tokens": 26457, "cost": 0.00373911999999804, "total_cost": 0.013081179999992162}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736789914} +{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736789923} +{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736789923} diff --git a/aider/website/assets/sample.aider.conf.yml b/aider/website/assets/sample.aider.conf.yml index 0afb5f6b6..fa85acda5 100644 --- a/aider/website/assets/sample.aider.conf.yml +++ b/aider/website/assets/sample.aider.conf.yml @@ -410,6 +410,9 @@ ## Specify the encoding for input and output (default: utf-8) #encoding: utf-8 +## Line endings to use when writing files (default: platform) +#line-endings: platform + ## Specify the config file (default: search for .aider.conf.yml in git root, cwd or home directory) #config: xxx diff --git a/aider/website/assets/sample.env b/aider/website/assets/sample.env index 0c481afb4..cfb19aa6d 100644 --- a/aider/website/assets/sample.env +++ b/aider/website/assets/sample.env @@ -381,6 +381,9 @@ ## Specify the encoding for input and output (default: utf-8) #AIDER_ENCODING=utf-8 +## Line endings to use when writing files (default: platform) +#AIDER_LINE_ENDINGS=platform + ## Specify the .env file to load (default: .env in git root) #AIDER_ENV_FILE=.env diff --git a/aider/website/docs/config/aider_conf.md b/aider/website/docs/config/aider_conf.md index 9b9e2521c..91b88fe28 100644 --- a/aider/website/docs/config/aider_conf.md +++ b/aider/website/docs/config/aider_conf.md @@ -462,6 +462,9 @@ cog.outl("```") ## Specify the encoding for input and output (default: utf-8) #encoding: utf-8 +## Line endings to use when writing files (default: platform) +#line-endings: platform + ## Specify the config file (default: search for .aider.conf.yml in git root, cwd or home directory) #config: xxx diff --git a/aider/website/docs/config/dotenv.md b/aider/website/docs/config/dotenv.md index 8cf3928fe..d7bf7503d 100644 --- a/aider/website/docs/config/dotenv.md +++ b/aider/website/docs/config/dotenv.md @@ -421,6 +421,9 @@ cog.outl("```") ## Specify the encoding for input and output (default: utf-8) #AIDER_ENCODING=utf-8 +## Line endings to use when writing files (default: platform) +#AIDER_LINE_ENDINGS=platform + ## Specify the .env file to load (default: .env in git root) #AIDER_ENV_FILE=.env diff --git a/aider/website/docs/config/options.md b/aider/website/docs/config/options.md index 4660be72d..fc672186b 100644 --- a/aider/website/docs/config/options.md +++ b/aider/website/docs/config/options.md @@ -73,7 +73,7 @@ usage: aider [-h] [--model] [--opus] [--sonnet] [--haiku] [--4] [--show-prompts] [--voice-format] [--voice-language] [--voice-input-device] [--file] [--read] [--vim] [--chat-language] [--yes-always] [-v] [--load] - [--encoding] [-c] [--env-file] + [--encoding] [--line-endings] [-c] [--env-file] [--suggest-shell-commands | --no-suggest-shell-commands] [--fancy-input | --no-fancy-input] [--multiline | --no-multiline] @@ -705,6 +705,11 @@ Specify the encoding for input and output (default: utf-8) Default: utf-8 Environment variable: `AIDER_ENCODING` +### `--line-endings VALUE` +Line endings to use when writing files (default: platform) +Default: platform +Environment variable: `AIDER_LINE_ENDINGS` + ### `--config CONFIG_FILE` Specify the config file (default: search for .aider.conf.yml in git root, cwd or home directory) Aliases: diff --git a/aider/website/docs/faq.md b/aider/website/docs/faq.md index 496e1db80..97a820211 100644 --- a/aider/website/docs/faq.md +++ b/aider/website/docs/faq.md @@ -249,9 +249,10 @@ tr:hover { background-color: #f5f5f5; } - - - + + + +
Model NameTotal TokensPercent
deepseek/deepseek-chat1,252,75586.2%
claude-3-5-sonnet-20241022178,35212.3%
o122,7481.6%
deepseek/deepseek-chat1,371,04186.6%
claude-3-5-sonnet-20241022178,35211.3%
o125,3261.6%
mistral/codestral-latest8,1370.5%
From e1c914d9bb3deb08c875c06a41f257f04f71e273 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Mon, 13 Jan 2025 11:21:34 -0800 Subject: [PATCH 013/229] chore: Update polyglot leaderboard with new test results for Codestral 25.01 --- aider/website/_data/polyglot_leaderboard.yml | 25 ++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/aider/website/_data/polyglot_leaderboard.yml b/aider/website/_data/polyglot_leaderboard.yml index eba1773bc..e33f54623 100644 --- a/aider/website/_data/polyglot_leaderboard.yml +++ b/aider/website/_data/polyglot_leaderboard.yml @@ -336,3 +336,28 @@ seconds_per_case: 42.0 total_cost: 0.0000 +- dirname: 2025-01-13-18-17-25--codestral-whole2 + test_cases: 225 + model: Codestral 25.01 + edit_format: whole + commit_hash: 0cba898-dirty + pass_rate_1: 4.0 + pass_rate_2: 11.1 + pass_num_1: 9 + pass_num_2: 25 + percent_cases_well_formed: 100.0 + error_outputs: 0 + num_malformed_responses: 0 + num_with_malformed_responses: 0 + user_asks: 47 + lazy_comments: 0 + syntax_errors: 0 + indentation_errors: 0 + exhausted_context_windows: 0 + test_timeouts: 4 + total_tests: 225 + command: aider --model mistral/codestral-latest + date: 2025-01-13 + versions: 0.71.2.dev + seconds_per_case: 9.3 + total_cost: 1.9834 \ No newline at end of file From 21f20417d6110f14c473443287cb6e8c74fc1072 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Mon, 13 Jan 2025 11:39:22 -0800 Subject: [PATCH 014/229] copy --- aider/website/_data/polyglot_leaderboard.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aider/website/_data/polyglot_leaderboard.yml b/aider/website/_data/polyglot_leaderboard.yml index e33f54623..ccb14eb30 100644 --- a/aider/website/_data/polyglot_leaderboard.yml +++ b/aider/website/_data/polyglot_leaderboard.yml @@ -312,7 +312,7 @@ - dirname: 2024-12-26-00-55-20--Qwen2.5-Coder-32B-Instruct test_cases: 225 - model: openai/Qwen2.5-Coder-32B-Instruct + model: Qwen2.5-Coder-32B-Instruct edit_format: whole commit_hash: b51768b0 pass_rate_1: 4.9 From d831e2f3a456124c37912c6b0794852e71b5233c Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Mon, 13 Jan 2025 14:26:24 -0800 Subject: [PATCH 015/229] copy --- aider/website/assets/sample-analytics.jsonl | 24 ++++++++++----------- aider/website/docs/faq.md | 4 ++-- aider/website/docs/leaderboards/index.md | 5 ++--- 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/aider/website/assets/sample-analytics.jsonl b/aider/website/assets/sample-analytics.jsonl index 089fa2d38..ed7b372d4 100644 --- a/aider/website/assets/sample-analytics.jsonl +++ b/aider/website/assets/sample-analytics.jsonl @@ -1,15 +1,3 @@ -{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736443564} -{"event": "command_reset", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736443777} -{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736443787} -{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736443806} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736443806} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "ask", "prompt_tokens": 6361, "completion_tokens": 567, "total_tokens": 6928, "cost": 0.0010493000000000002, "total_cost": 0.00504644}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736443821} -{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736443945} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736443945} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "ask", "prompt_tokens": 6952, "completion_tokens": 539, "total_tokens": 7491, "cost": 0.0011242000000000001, "total_cost": 0.00617064}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736443959} -{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736444381} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736444385} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 5677, "completion_tokens": 181, "total_tokens": 5858, "cost": 0.00084546, "total_cost": 0.0070161}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736444391} {"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736444393} {"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 6029, "completion_tokens": 195, "total_tokens": 6224, "cost": 0.0008986600000000001, "total_cost": 0.00791476}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736444400} {"event": "command_reset", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736444404} @@ -998,3 +986,15 @@ {"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 26206, "completion_tokens": 251, "total_tokens": 26457, "cost": 0.00373911999999804, "total_cost": 0.013081179999992162}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736789914} {"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736789923} {"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736789923} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736792377} +{"event": "gui session", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736792378} +{"event": "exit", "properties": {"reason": "GUI session ended"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736792378} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736795974} +{"event": "gui session", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736795974} +{"event": "exit", "properties": {"reason": "GUI session ended"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736795974} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736796089} +{"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736796091} +{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736796094} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736797223} +{"event": "gui session", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736797224} +{"event": "exit", "properties": {"reason": "GUI session ended"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736797224} diff --git a/aider/website/docs/faq.md b/aider/website/docs/faq.md index 97a820211..7eee6f400 100644 --- a/aider/website/docs/faq.md +++ b/aider/website/docs/faq.md @@ -249,8 +249,8 @@ tr:hover { background-color: #f5f5f5; } - - + +
Model NameTotal TokensPercent
deepseek/deepseek-chat1,371,04186.6%
claude-3-5-sonnet-20241022178,35211.3%
deepseek/deepseek-chat1,350,76486.4%
claude-3-5-sonnet-20241022178,35211.4%
o125,3261.6%
mistral/codestral-latest8,1370.5%
diff --git a/aider/website/docs/leaderboards/index.md b/aider/website/docs/leaderboards/index.md index 7e50e9a2e..681d73d1c 100644 --- a/aider/website/docs/leaderboards/index.md +++ b/aider/website/docs/leaderboards/index.md @@ -107,8 +107,7 @@ import datetime files = [ 'aider/website/docs/leaderboards/index.md', - 'aider/website/_data/edit_leaderboard.yml', - 'aider/website/_data/refactor_leaderboard.yml' + 'aider/website/_data/polyglot_leaderboard.yml', ] def get_last_modified_date(file): @@ -122,6 +121,6 @@ mod_dates = [get_last_modified_date(file) for file in files] latest_mod_date = max(mod_dates) cog.out(f"{latest_mod_date.strftime('%B %d, %Y.')}") ]]]--> -December 26, 2024. +January 13, 2025.

From 4251e976b3aa52c2a3af08da4b203d4d524c8e92 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Mon, 13 Jan 2025 14:28:34 -0800 Subject: [PATCH 016/229] copy --- aider/website/assets/sample-analytics.jsonl | 6 ++--- aider/website/docs/faq.md | 4 ++-- aider/website/docs/leaderboards/edit.md | 5 ++-- aider/website/docs/leaderboards/refactor.md | 26 +++++++++++++++++++++ scripts/update-docs.sh | 2 ++ 5 files changed, 35 insertions(+), 8 deletions(-) diff --git a/aider/website/assets/sample-analytics.jsonl b/aider/website/assets/sample-analytics.jsonl index ed7b372d4..0cc85ddfd 100644 --- a/aider/website/assets/sample-analytics.jsonl +++ b/aider/website/assets/sample-analytics.jsonl @@ -1,6 +1,3 @@ -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736444393} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 6029, "completion_tokens": 195, "total_tokens": 6224, "cost": 0.0008986600000000001, "total_cost": 0.00791476}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736444400} -{"event": "command_reset", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736444404} {"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736445473} {"event": "gui session", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736445474} {"event": "exit", "properties": {"reason": "GUI session ended"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736445474} @@ -998,3 +995,6 @@ {"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736797223} {"event": "gui session", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736797224} {"event": "exit", "properties": {"reason": "GUI session ended"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736797224} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736807243} +{"event": "gui session", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736807243} +{"event": "exit", "properties": {"reason": "GUI session ended"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736807243} diff --git a/aider/website/docs/faq.md b/aider/website/docs/faq.md index 7eee6f400..e9e92af0a 100644 --- a/aider/website/docs/faq.md +++ b/aider/website/docs/faq.md @@ -249,8 +249,8 @@ tr:hover { background-color: #f5f5f5; } - - + +
Model NameTotal TokensPercent
deepseek/deepseek-chat1,350,76486.4%
claude-3-5-sonnet-20241022178,35211.4%
deepseek/deepseek-chat1,344,54086.4%
claude-3-5-sonnet-20241022178,35211.5%
o125,3261.6%
mistral/codestral-latest8,1370.5%
diff --git a/aider/website/docs/leaderboards/edit.md b/aider/website/docs/leaderboards/edit.md index aa23e4a4e..8771881e5 100644 --- a/aider/website/docs/leaderboards/edit.md +++ b/aider/website/docs/leaderboards/edit.md @@ -113,9 +113,8 @@ import subprocess import datetime files = [ - 'aider/website/docs/leaderboards/index.md', + 'aider/website/docs/leaderboards/edit.md', 'aider/website/_data/edit_leaderboard.yml', - 'aider/website/_data/refactor_leaderboard.yml' ] def get_last_modified_date(file): @@ -129,6 +128,6 @@ mod_dates = [get_last_modified_date(file) for file in files] latest_mod_date = max(mod_dates) cog.out(f"{latest_mod_date.strftime('%B %d, %Y.')}") ]]]--> -December 16, 2024. +December 22, 2024.

diff --git a/aider/website/docs/leaderboards/refactor.md b/aider/website/docs/leaderboards/refactor.md index f78941428..f7545f809 100644 --- a/aider/website/docs/leaderboards/refactor.md +++ b/aider/website/docs/leaderboards/refactor.md @@ -50,3 +50,29 @@ Therefore, results are available for fewer models. + diff --git a/scripts/update-docs.sh b/scripts/update-docs.sh index fdf4791b3..ecde8ac01 100755 --- a/scripts/update-docs.sh +++ b/scripts/update-docs.sh @@ -27,6 +27,8 @@ cog $ARG \ aider/website/docs/config/adv-model-settings.md \ aider/website/docs/config/model-aliases.md \ aider/website/docs/leaderboards/index.md \ + aider/website/docs/leaderboards/edit.md \ + aider/website/docs/leaderboards/refactor.md \ aider/website/docs/llms/other.md \ aider/website/docs/more/infinite-output.md \ aider/website/docs/legal/privacy.md From 2ec576e1108be7f0ca7c76cf4e99a4fd8b51cbca Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Mon, 13 Jan 2025 15:46:36 -0800 Subject: [PATCH 017/229] use examples_as_sys_msg=True for 4o models --- aider/models.py | 7 +++ aider/website/_data/polyglot_leaderboard.yml | 56 ++++++++++++++------ 2 files changed, 48 insertions(+), 15 deletions(-) diff --git a/aider/models.py b/aider/models.py index 6271b9ff8..9dd8d0720 100644 --- a/aider/models.py +++ b/aider/models.py @@ -162,6 +162,7 @@ MODEL_SETTINGS = [ lazy=True, reminder="sys", editor_edit_format="editor-diff", + examples_as_sys_msg=True, ), ModelSettings( "openai/gpt-4o-2024-08-06", @@ -170,6 +171,7 @@ MODEL_SETTINGS = [ use_repo_map=True, lazy=True, reminder="sys", + examples_as_sys_msg=True, ), ModelSettings( "gpt-4o-2024-08-06", @@ -178,6 +180,7 @@ MODEL_SETTINGS = [ use_repo_map=True, lazy=True, reminder="sys", + examples_as_sys_msg=True, ), ModelSettings( "gpt-4o-2024-11-20", @@ -186,6 +189,7 @@ MODEL_SETTINGS = [ use_repo_map=True, lazy=True, reminder="sys", + examples_as_sys_msg=True, ), ModelSettings( "openai/gpt-4o-2024-11-20", @@ -194,6 +198,7 @@ MODEL_SETTINGS = [ use_repo_map=True, lazy=True, reminder="sys", + examples_as_sys_msg=True, ), ModelSettings( "gpt-4o", @@ -203,6 +208,7 @@ MODEL_SETTINGS = [ lazy=True, reminder="sys", editor_edit_format="editor-diff", + examples_as_sys_msg=True, ), ModelSettings( "gpt-4o-mini", @@ -680,6 +686,7 @@ MODEL_SETTINGS = [ lazy=True, reminder="sys", editor_edit_format="editor-diff", + examples_as_sys_msg=True, ), ModelSettings( "openai/o1-mini", diff --git a/aider/website/_data/polyglot_leaderboard.yml b/aider/website/_data/polyglot_leaderboard.yml index ccb14eb30..8b52c1dbd 100644 --- a/aider/website/_data/polyglot_leaderboard.yml +++ b/aider/website/_data/polyglot_leaderboard.yml @@ -50,32 +50,58 @@ seconds_per_case: 30.8 total_cost: 13.4847 -- dirname: 2024-12-21-18-52-34--polyglot-gpt-4o-diff +- dirname: 2024-12-30-20-57-12--gpt-4o-2024-11-20-ex-as-sys test_cases: 225 model: gpt-4o-2024-11-20 edit_format: diff - commit_hash: a755079-dirty + commit_hash: 09ee197-dirty pass_rate_1: 4.9 - pass_rate_2: 15.1 + pass_rate_2: 18.2 pass_num_1: 11 - pass_num_2: 34 - percent_cases_well_formed: 96.0 + pass_num_2: 41 + percent_cases_well_formed: 95.1 error_outputs: 12 - num_malformed_responses: 11 - num_with_malformed_responses: 9 - user_asks: 34 + num_malformed_responses: 12 + num_with_malformed_responses: 11 + user_asks: 53 lazy_comments: 0 syntax_errors: 0 indentation_errors: 0 - exhausted_context_windows: 1 - test_timeouts: 19 + exhausted_context_windows: 0 + test_timeouts: 12 total_tests: 225 command: aider --model gpt-4o-2024-11-20 - date: 2024-12-21 - versions: 0.69.2.dev - seconds_per_case: 22.2 - total_cost: 7.1835 - + date: 2024-12-30 + versions: 0.70.1.dev + seconds_per_case: 12.1 + total_cost: 6.7351 + +- dirname: 2024-12-30-20-44-54--gpt4o-ex-as-sys-clean-prompt + test_cases: 225 + model: gpt-4o-2024-08-06 + edit_format: diff + commit_hash: 09ee197-dirty + pass_rate_1: 4.9 + pass_rate_2: 23.1 + pass_num_1: 11 + pass_num_2: 52 + percent_cases_well_formed: 94.2 + error_outputs: 21 + num_malformed_responses: 21 + num_with_malformed_responses: 13 + user_asks: 65 + lazy_comments: 0 + syntax_errors: 0 + indentation_errors: 0 + exhausted_context_windows: 0 + test_timeouts: 3 + total_tests: 225 + command: aider --model gpt-4o-2024-08-06 + date: 2024-12-30 + versions: 0.70.1.dev + seconds_per_case: 16.0 + total_cost: 7.0286 + - dirname: 2024-12-21-19-23-03--polyglot-o1-hard-diff test_cases: 224 model: o1-2024-12-17 (high) From 1e54ca82b86e13027380f0e22d51418370c1dc73 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Mon, 13 Jan 2025 15:47:49 -0800 Subject: [PATCH 018/229] refactor: encapsulate rsync logic in function and add continuous sync loop --- benchmark/rsync.sh | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/benchmark/rsync.sh b/benchmark/rsync.sh index 0de23c9d0..d18f50524 100755 --- a/benchmark/rsync.sh +++ b/benchmark/rsync.sh @@ -19,15 +19,27 @@ git -C "$REPO_ROOT" ls-files --exclude-standard --others --ignored --directory > # Create remote directory if needed ssh "$DEST" "mkdir -p ~/aider" -# Sync the repository -rsync -avz --delete \ - --exclude-from="$EXCLUDE_FILE" \ - "$REPO_ROOT/" \ - "$DEST:~/aider/" +sync_repo() { + # Sync the repository + rsync -avz --delete \ + --exclude-from="$EXCLUDE_FILE" \ + "$REPO_ROOT/" \ + "$DEST:~/aider/" || true + + rsync -a .env .gitignore "$DEST:~/aider/." || true -rsync -a .env .gitignore "$DEST:~/aider/." + echo Done syncing, waiting. +} + +sync_repo -rsync -a ~/dotfiles/screenrc "$DEST:.screenrc" +while true; do + fswatch -o $REPO_ROOT | while read ; do + sync_repo + done +done + # Clean up rm "$EXCLUDE_FILE" + From 63cf99361d01487df978dcdb9bcd62e23b23b209 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 15 Jan 2025 13:57:54 -0800 Subject: [PATCH 019/229] ensure no loading of any other files --- benchmark/benchmark.py | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/benchmark/benchmark.py b/benchmark/benchmark.py index 1d27ab58f..92599c573 100755 --- a/benchmark/benchmark.py +++ b/benchmark/benchmark.py @@ -717,17 +717,6 @@ def run_test_real( else: print(f"Warning: Solution file not found: {src}") - # Copy all test files - for file_path in test_files: - src = testdir / Path(file_path) - if src.exists(): - original_fname = original_dname / testdir.name / file_path - if original_fname.exists(): - os.makedirs(src.parent, exist_ok=True) - shutil.copy(original_fname, src) - else: - print(f"Warning: Test file not found: {src}") - file_list = " ".join(fname.name for fname in fnames) instructions = "" @@ -785,6 +774,7 @@ def run_test_real( dump(coder.ignore_mentions) coder.show_announcements() + coder.get_file_mentions = lambda x: set() # No loading of any other files timeouts = 0 @@ -796,6 +786,7 @@ def run_test_real( test_outcomes = [] for i in range(tries): start = time.time() + if no_aider: pass elif replay: From a08326ab606191bddb7756737febcfc04cf938f8 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 15 Jan 2025 15:18:46 -0800 Subject: [PATCH 020/229] enable all java tests --- benchmark/benchmark.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/benchmark/benchmark.py b/benchmark/benchmark.py index 92599c573..a6840970e 100755 --- a/benchmark/benchmark.py +++ b/benchmark/benchmark.py @@ -916,15 +916,6 @@ def run_test_real( def run_unit_tests(original_dname, testdir, history_fname, test_files): timeout = 60 * 3 - # Remove @Disabled annotations from Java test files - for file_path in test_files: - if file_path.endswith(".java"): - test_file = testdir / file_path - if test_file.exists(): - content = test_file.read_text() - content = re.sub(r"@Disabled\([^)]*\)\s*\n", "", content) - test_file.write_text(content) - # Map of file extensions to test commands TEST_COMMANDS = { ".py": ["pytest"], @@ -956,6 +947,15 @@ def run_unit_tests(original_dname, testdir, history_fname, test_files): os.makedirs(dst.parent, exist_ok=True) shutil.copy(src, dst) + # Remove @Disabled annotations from Java test files + for file_path in test_files: + if file_path.endswith(".java"): + test_file = testdir / file_path + if test_file.exists(): + content = test_file.read_text() + content = re.sub(r"@Disabled\([^)]*\)\s*\n", "", content) + test_file.write_text(content) + print(" ".join(command)) result = subprocess.run( From 590ee5a24893b1827f5cc2205ce47150301aa3a0 Mon Sep 17 00:00:00 2001 From: "Max Yankov (aider)" Date: Wed, 15 Jan 2025 20:44:53 -0300 Subject: [PATCH 021/229] docs: Add architect mode section to edit errors troubleshooting guide --- aider/website/docs/troubleshooting/edit-errors.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/aider/website/docs/troubleshooting/edit-errors.md b/aider/website/docs/troubleshooting/edit-errors.md index 7aab589b1..fac41767d 100644 --- a/aider/website/docs/troubleshooting/edit-errors.md +++ b/aider/website/docs/troubleshooting/edit-errors.md @@ -62,6 +62,12 @@ Aider v0.50.2-dev Models: claude-3-5-sonnet-20240620 with ♾️ diff edit format ``` +## Try architect mode + +Run aider with `--architect` or `/chat-mode architect` to enable [architect mode](../usage/modes.md#architect-mode-and-the-editor-model). +This mode first proposes changes, then uses a separate model to handle the file edits. +This two-step process often produces more reliable edits, especially with models that have trouble +following edit format instructions. ## More help From 1986f08cf91fdfa7a5a00cad1b8aa4d3a102b2f6 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Thu, 16 Jan 2025 08:24:02 -0800 Subject: [PATCH 022/229] ci: Conditionally push Docker images only on non-pull request events --- .github/workflows/docker-build-test.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docker-build-test.yml b/.github/workflows/docker-build-test.yml index 3bafc3cf5..83f5667bd 100644 --- a/.github/workflows/docker-build-test.yml +++ b/.github/workflows/docker-build-test.yml @@ -31,6 +31,7 @@ jobs: uses: docker/setup-buildx-action@v3 - name: Login to DockerHub + if: github.event_name != 'pull_request' uses: docker/login-action@v3 with: username: ${{ secrets.DOCKERHUB_USERNAME }} @@ -42,7 +43,7 @@ jobs: context: . file: ./docker/Dockerfile platforms: linux/amd64,linux/arm64 - push: true + push: ${{ github.event_name != 'pull_request' }} tags: ${{ secrets.DOCKERHUB_USERNAME }}/aider:dev target: aider @@ -52,6 +53,6 @@ jobs: context: . file: ./docker/Dockerfile platforms: linux/amd64,linux/arm64 - push: true + push: ${{ github.event_name != 'pull_request' }} tags: ${{ secrets.DOCKERHUB_USERNAME }}/aider-full:dev target: aider-full From 3bc6c641de371d4d15801df3a4d485d75d7b00a5 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Thu, 16 Jan 2025 08:24:31 -0800 Subject: [PATCH 023/229] copy --- aider/website/assets/sample-analytics.jsonl | 342 +++++++++--------- .../website/docs/config/adv-model-settings.md | 14 +- aider/website/docs/faq.md | 7 +- aider/website/docs/leaderboards/edit.md | 2 +- aider/website/docs/leaderboards/refactor.md | 2 +- 5 files changed, 184 insertions(+), 183 deletions(-) diff --git a/aider/website/assets/sample-analytics.jsonl b/aider/website/assets/sample-analytics.jsonl index 0cc85ddfd..b8314f3d1 100644 --- a/aider/website/assets/sample-analytics.jsonl +++ b/aider/website/assets/sample-analytics.jsonl @@ -1,174 +1,3 @@ -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736445473} -{"event": "gui session", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736445474} -{"event": "exit", "properties": {"reason": "GUI session ended"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736445474} -{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736445713} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736445743} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 8739, "completion_tokens": 319, "total_tokens": 9058, "cost": 0.00131278, "total_cost": 0.00922754}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736445752} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736445792} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 9183, "completion_tokens": 266, "total_tokens": 9449, "cost": 0.0013601000000000002, "total_cost": 0.010587639999999999}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736445800} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736447092} -{"event": "repo", "properties": {"num_files": 61}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736447094} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736447094} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 3329, "completion_tokens": 58, "total_tokens": 3387, "cost": 0.0004823, "total_cost": 0.0004823}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736447098} -{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736447098} -{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736447364} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736448117} -{"event": "repo", "properties": {"num_files": 21}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736448119} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736448119} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 3502, "completion_tokens": 326, "total_tokens": 3828, "cost": 0.0005815600000000001, "total_cost": 0.0005815600000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736448127} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736448150} -{"event": "repo", "properties": {"num_files": 21}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736448152} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736448152} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 3510, "completion_tokens": 161, "total_tokens": 3671, "cost": 0.00053648, "total_cost": 0.00053648}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736448157} -{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736448160} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736448162} -{"event": "repo", "properties": {"num_files": 21}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736448164} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736448164} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 4303, "completion_tokens": 216, "total_tokens": 4519, "cost": 0.0006629, "total_cost": 0.0006629}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736448171} -{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736448172} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736448173} -{"event": "repo", "properties": {"num_files": 21}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736448175} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736448175} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 3505, "completion_tokens": 75, "total_tokens": 3580, "cost": 0.0005117, "total_cost": 0.0005117}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736448179} -{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736448179} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736448181} -{"event": "repo", "properties": {"num_files": 21}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736448182} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736448183} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 4166, "completion_tokens": 225, "total_tokens": 4391, "cost": 0.0006462400000000001, "total_cost": 0.0006462400000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736448190} -{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736448192} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736448194} -{"event": "repo", "properties": {"num_files": 21}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736448196} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736448196} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 4141, "completion_tokens": 121, "total_tokens": 4262, "cost": 0.00061362, "total_cost": 0.00061362}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736448200} -{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736448201} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736448202} -{"event": "repo", "properties": {"num_files": 21}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736448204} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736448204} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 5753, "completion_tokens": 238, "total_tokens": 5991, "cost": 0.00087206, "total_cost": 0.00087206}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736448212} -{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736448214} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736448216} -{"event": "repo", "properties": {"num_files": 21}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736448217} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736448218} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 4268, "completion_tokens": 185, "total_tokens": 4453, "cost": 0.00064932, "total_cost": 0.00064932}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736448223} -{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736448228} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736448230} -{"event": "repo", "properties": {"num_files": 21}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736448232} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736448232} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 5162, "completion_tokens": 306, "total_tokens": 5468, "cost": 0.00080836, "total_cost": 0.00080836}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736448240} -{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736448247} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736448249} -{"event": "repo", "properties": {"num_files": 21}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736448250} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736448251} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 4839, "completion_tokens": 344, "total_tokens": 5183, "cost": 0.0007737800000000001, "total_cost": 0.0007737800000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736448260} -{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736448263} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736449570} -{"event": "repo", "properties": {"num_files": 22}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736449572} -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736449572} -{"event": "ai-comments file-add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736449590} -{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736449590} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736449590} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 6071, "completion_tokens": 631, "total_tokens": 6702, "cost": 0.0010266200000000002, "total_cost": 0.0010266200000000002}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736449606} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736449754} -{"event": "repo", "properties": {"num_files": 22}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736449756} -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736449756} -{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736449759} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736449775} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 8618, "completion_tokens": 185, "total_tokens": 8803, "cost": 0.00125832, "total_cost": 0.00125832}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736449782} -{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736449787} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736449887} -{"event": "repo", "properties": {"num_files": 22}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736449888} -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736449888} -{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736449901} -{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736449909} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736449909} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "ask", "prompt_tokens": 6477, "completion_tokens": 187, "total_tokens": 6664, "cost": 0.00095914, "total_cost": 0.00095914}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736449915} -{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736450000} -{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736450000} -{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736450636} -{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736450636} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736450703} -{"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736450705} -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736450705} -{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736450715} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736450715} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "ask", "prompt_tokens": 1979, "completion_tokens": 778, "total_tokens": 2757, "cost": 0.0004949, "total_cost": 0.0004949}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736450733} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736450736} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 4991, "completion_tokens": 1252, "total_tokens": 6243, "cost": 0.0010493, "total_cost": 0.0015442}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736450764} -{"event": "command_diff", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736450768} -{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736451421} -{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736451421} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736451565} -{"event": "gui session", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736451566} -{"event": "exit", "properties": {"reason": "GUI session ended"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736451566} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736451901} -{"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736451903} -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736451903} -{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736451910} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736451933} -{"event": "gui session", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736451934} -{"event": "exit", "properties": {"reason": "GUI session ended"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736451934} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736452461} -{"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736452462} -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736452462} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736452491} -{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736452549} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736452564} -{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736452565} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736452565} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 23399, "completion_tokens": 425, "total_tokens": 23824, "cost": 0.0033948600000000004, "total_cost": 0.0033948600000000004}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736452581} -{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736452581} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736452607} -{"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736452609} -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736452609} -{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736452616} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736452616} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "ask", "prompt_tokens": 1987, "completion_tokens": 240, "total_tokens": 2227, "cost": 0.00034538, "total_cost": 0.00034538}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736452623} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736452632} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 4622, "completion_tokens": 318, "total_tokens": 4940, "cost": 0.00073612, "total_cost": 0.0010815}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736452641} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736452656} -{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736452657} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736452657} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 23160, "completion_tokens": 490, "total_tokens": 23650, "cost": 0.0033796000000000004, "total_cost": 0.0033796000000000004}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736452675} -{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736452675} -{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736452822} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736452824} -{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736452825} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736452825} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 22997, "completion_tokens": 237, "total_tokens": 23234, "cost": 0.0032859399999980404, "total_cost": 0.0032859399999980404}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736452837} -{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736452837} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736453047} -{"event": "gui session", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736453047} -{"event": "exit", "properties": {"reason": "GUI session ended"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736453047} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736458561} -{"event": "repo", "properties": {"num_files": 22}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736458563} -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736458563} -{"event": "ai-comments file-add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736458567} -{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736458567} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736458570} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 6342, "completion_tokens": 467, "total_tokens": 6809, "cost": 0.0010186400000000001, "total_cost": 0.0010186400000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736458582} -{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736458591} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736458630} -{"event": "repo", "properties": {"num_files": 22}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736458632} -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736458632} -{"event": "ai-comments file-add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736458633} -{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736458633} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736458633} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 6072, "completion_tokens": 414, "total_tokens": 6486, "cost": 0.0009660000000000001, "total_cost": 0.0009660000000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736458645} -{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736458681} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736458681} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 6830, "completion_tokens": 176, "total_tokens": 7006, "cost": 0.00100548, "total_cost": 0.0019714800000000003}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736458686} -{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736459425} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736461726} -{"event": "repo", "properties": {"num_files": 22}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736461728} -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736461728} -{"event": "ai-comments file-add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736461739} -{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736461739} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736461739} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 6140, "completion_tokens": 401, "total_tokens": 6541, "cost": 0.00097188, "total_cost": 0.00097188}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736461750} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736461764} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 6727, "completion_tokens": 763, "total_tokens": 7490, "cost": 0.00115542, "total_cost": 0.0021273000000000004}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736461780} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736461781} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 8402, "completion_tokens": 422, "total_tokens": 8824, "cost": 0.00129444, "total_cost": 0.0034217400000000004}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736461792} {"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736463690} {"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736463692} {"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736463696} @@ -998,3 +827,174 @@ {"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736807243} {"event": "gui session", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736807243} {"event": "exit", "properties": {"reason": "GUI session ended"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736807243} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736812065} +{"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736812067} +{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736812069} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736812371} +{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736812374} +{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736812374} +{"event": "ai-comments file-add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736812375} +{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736812375} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736812375} +{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 10054, "completion_tokens": 207, "total_tokens": 10261, "cost": 0.0014655199999980399, "total_cost": 0.0014655199999980399}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736812386} +{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736812405} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736812405} +{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736813429} +{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736813429} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736821676} +{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736821678} +{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736821678} +{"event": "ai-comments file-add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736821680} +{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736821680} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736821680} +{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 13967, "completion_tokens": 734, "total_tokens": 14701, "cost": 0.0021608999999980396, "total_cost": 0.0021608999999980396}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736821701} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736821714} +{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 15829, "completion_tokens": 121, "total_tokens": 15950, "cost": 0.00224993999999804, "total_cost": 0.00441083999999608}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736821721} +{"event": "command_lint", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736821765} +{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736821898} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736821898} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736821929} +{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 16915, "completion_tokens": 774, "total_tokens": 17689, "cost": 0.0025848199999980405, "total_cost": 0.00699565999999412}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736821949} +{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736822189} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736822190} +{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 17958, "completion_tokens": 432, "total_tokens": 18390, "cost": 0.0026350799999980403, "total_cost": 0.009630739999992161}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736822223} +{"event": "command_lint", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736822806} +{"event": "command_commit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736822811} +{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736822960} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736822960} +{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736823014} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736823014} +{"event": "command_model", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736823024} +{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736823026} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736823026} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 19309, "completion_tokens": 618, "total_tokens": 19927, "cost": 0.067197, "total_cost": 0.07682773999999216}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736823039} +{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736823806} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736823806} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 20351, "completion_tokens": 355, "total_tokens": 20706, "cost": 0.066378, "total_cost": 0.14320573999999217}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736823823} +{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736824648} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736824648} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 17348, "completion_tokens": 277, "total_tokens": 17625, "cost": 0.056199, "total_cost": 0.19940473999999217}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736824660} +{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736829877} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736829877} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 18071, "completion_tokens": 229, "total_tokens": 18300, "cost": 0.057648000000000005, "total_cost": 0.2570527399999922}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736829884} +{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736829924} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736829924} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 18752, "completion_tokens": 254, "total_tokens": 19006, "cost": 0.060066, "total_cost": 0.3171187399999922}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736829933} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736829948} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 19102, "completion_tokens": 348, "total_tokens": 19450, "cost": 0.062526, "total_cost": 0.37964473999999215}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736829957} +{"event": "command_undo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736829964} +{"event": "command_lint", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736830026} +{"event": "command_lint", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736830048} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736830063} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 14582, "completion_tokens": 135, "total_tokens": 14717, "cost": 0.045771, "total_cost": 0.42541573999999216}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736830068} +{"event": "command_lint", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736830097} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736831023} +{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736831025} +{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736831030} +{"event": "ai-comments file-add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736872863} +{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736872863} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736872863} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 19760, "completion_tokens": 162, "total_tokens": 19922, "cost": 0.06171, "total_cost": 0.44135473999999214}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736872869} +{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736879750} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736879750} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 20179, "completion_tokens": 214, "total_tokens": 20393, "cost": 0.063747, "total_cost": 0.5051017399999922}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736879758} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736879771} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 20490, "completion_tokens": 40, "total_tokens": 20530, "cost": 0.06207000000000001, "total_cost": 0.5671717399999922}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736879777} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736879787} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 20545, "completion_tokens": 512, "total_tokens": 21057, "cost": 0.069315, "total_cost": 0.6364867399999922}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736879799} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736879807} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 18224, "completion_tokens": 118, "total_tokens": 18342, "cost": 0.056442, "total_cost": 0.6929287399999922}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736879818} +{"event": "command_model", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736879828} +{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736880670} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736880670} +{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 18647, "completion_tokens": 1009, "total_tokens": 19656, "cost": 0.0028931000000000004, "total_cost": 0.6958218399999921}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736880694} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736888187} +{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736888189} +{"event": "cli session", "properties": {"main_model": "gemini/gemini-exp-1206", "weak_model": "gemini/gemini-exp-1206", "editor_model": "gemini/gemini-exp-1206", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736888190} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736888192} +{"event": "message_send", "properties": {"main_model": "gemini/gemini-exp-1206", "weak_model": "gemini/gemini-exp-1206", "editor_model": "gemini/gemini-exp-1206", "edit_format": "diff", "prompt_tokens": 10023, "completion_tokens": 45, "total_tokens": 10068, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736888197} +{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736888198} +{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736888198} +{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736892852} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736892852} +{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 20043, "completion_tokens": 188, "total_tokens": 20231, "cost": 0.0028586600000000003, "total_cost": 0.6986804999999922}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736892860} +{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736892903} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736910815} +{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736910817} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736910817} +{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 10037, "completion_tokens": 36, "total_tokens": 10073, "cost": 0.00141525999999804, "total_cost": 0.00141525999999804}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736911269} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736911269} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736911388} +{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736911390} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736911390} +{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 9999, "completion_tokens": 37, "total_tokens": 10036, "cost": 0.00141021999999804, "total_cost": 0.00141021999999804}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736911396} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736911396} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736911505} +{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736911507} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736911507} +{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 9998, "completion_tokens": 37, "total_tokens": 10035, "cost": 0.00141007999999804, "total_cost": 0.00141007999999804}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736911512} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736911512} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737002938} +{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737002941} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737002941} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737002965} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737002967} +{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737002969} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737002969} +{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 9994, "completion_tokens": 37, "total_tokens": 10031, "cost": 0.00140951999999804, "total_cost": 0.00140951999999804}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737002993} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737002993} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737008253} +{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737008255} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737008255} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737008434} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737008437} +{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737008438} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737008438} +{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 10038, "completion_tokens": 37, "total_tokens": 10075, "cost": 0.00141567999999804, "total_cost": 0.00141567999999804}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737040760} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737040760} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737041456} +{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737041459} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737041460} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737041523} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737041525} +{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737041527} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737041527} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737041640} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737041642} +{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737041645} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737041646} +{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 10044, "completion_tokens": 36, "total_tokens": 10080, "cost": 0.00141623999999804, "total_cost": 0.00141623999999804}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737042040} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737042040} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737042533} +{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737042535} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737042535} +{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 10036, "completion_tokens": 36, "total_tokens": 10072, "cost": 0.00141511999999804, "total_cost": 0.00141511999999804}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737042541} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737042541} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737042883} +{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737042885} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737042885} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737042920} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737042923} +{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737042926} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737042926} +{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 9992, "completion_tokens": 38, "total_tokens": 10030, "cost": 0.0014095199999980398, "total_cost": 0.0014095199999980398}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737043515} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737043515} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737043847} +{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737043849} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737043849} +{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 9989, "completion_tokens": 36, "total_tokens": 10025, "cost": 0.00140853999999804, "total_cost": 0.00140853999999804}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737043855} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737043855} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737044275} +{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737044276} +{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737044276} +{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737044277} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737044310} +{"event": "command_model", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737044337} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737044338} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "ask", "prompt_tokens": 5345, "completion_tokens": 624, "total_tokens": 5969, "cost": 0.025395, "total_cost": 0.025395}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737044349} +{"event": "command_code", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737044491} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737044491} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 7693, "completion_tokens": 472, "total_tokens": 8165, "cost": 0.030159000000000002, "total_cost": 0.055554000000000006}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737044499} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737044639} +{"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737044641} +{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737044642} diff --git a/aider/website/docs/config/adv-model-settings.md b/aider/website/docs/config/adv-model-settings.md index 589a9d72a..2367713be 100644 --- a/aider/website/docs/config/adv-model-settings.md +++ b/aider/website/docs/config/adv-model-settings.md @@ -235,7 +235,7 @@ cog.out("```\n") edit_format: diff editor_edit_format: editor-diff editor_model_name: null - examples_as_sys_msg: false + examples_as_sys_msg: true extra_params: null lazy: true name: openai/gpt-4o @@ -251,7 +251,7 @@ cog.out("```\n") edit_format: diff editor_edit_format: null editor_model_name: null - examples_as_sys_msg: false + examples_as_sys_msg: true extra_params: null lazy: true name: openai/gpt-4o-2024-08-06 @@ -267,7 +267,7 @@ cog.out("```\n") edit_format: diff editor_edit_format: null editor_model_name: null - examples_as_sys_msg: false + examples_as_sys_msg: true extra_params: null lazy: true name: gpt-4o-2024-08-06 @@ -283,7 +283,7 @@ cog.out("```\n") edit_format: diff editor_edit_format: null editor_model_name: null - examples_as_sys_msg: false + examples_as_sys_msg: true extra_params: null lazy: true name: gpt-4o-2024-11-20 @@ -299,7 +299,7 @@ cog.out("```\n") edit_format: diff editor_edit_format: null editor_model_name: null - examples_as_sys_msg: false + examples_as_sys_msg: true extra_params: null lazy: true name: openai/gpt-4o-2024-11-20 @@ -315,7 +315,7 @@ cog.out("```\n") edit_format: diff editor_edit_format: editor-diff editor_model_name: null - examples_as_sys_msg: false + examples_as_sys_msg: true extra_params: null lazy: true name: gpt-4o @@ -1184,7 +1184,7 @@ cog.out("```\n") edit_format: diff editor_edit_format: editor-diff editor_model_name: null - examples_as_sys_msg: false + examples_as_sys_msg: true extra_params: null lazy: true name: openrouter/openai/gpt-4o diff --git a/aider/website/docs/faq.md b/aider/website/docs/faq.md index e9e92af0a..53e3454ba 100644 --- a/aider/website/docs/faq.md +++ b/aider/website/docs/faq.md @@ -249,9 +249,10 @@ tr:hover { background-color: #f5f5f5; } - - - + + + +
Model NameTotal TokensPercent
deepseek/deepseek-chat1,344,54086.4%
claude-3-5-sonnet-20241022178,35211.5%
o125,3261.6%
deepseek/deepseek-chat1,332,43574.1%
claude-3-5-sonnet-20241022422,46123.5%
o125,3261.4%
gemini/gemini-exp-120610,0680.6%
mistral/codestral-latest8,1370.5%
diff --git a/aider/website/docs/leaderboards/edit.md b/aider/website/docs/leaderboards/edit.md index 8771881e5..a759bf64b 100644 --- a/aider/website/docs/leaderboards/edit.md +++ b/aider/website/docs/leaderboards/edit.md @@ -128,6 +128,6 @@ mod_dates = [get_last_modified_date(file) for file in files] latest_mod_date = max(mod_dates) cog.out(f"{latest_mod_date.strftime('%B %d, %Y.')}") ]]]--> -December 22, 2024. +January 13, 2025.

diff --git a/aider/website/docs/leaderboards/refactor.md b/aider/website/docs/leaderboards/refactor.md index f7545f809..c5f065945 100644 --- a/aider/website/docs/leaderboards/refactor.md +++ b/aider/website/docs/leaderboards/refactor.md @@ -73,6 +73,6 @@ mod_dates = [get_last_modified_date(file) for file in files] latest_mod_date = max(mod_dates) cog.out(f"{latest_mod_date.strftime('%B %d, %Y.')}") ]]]--> -December 21, 2024. +January 13, 2025.

From 0e87854819f9b398b531b99f45c759831e26fc67 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Thu, 16 Jan 2025 08:24:47 -0800 Subject: [PATCH 024/229] copy --- aider/website/docs/leaderboards/edit.md | 2 +- aider/website/docs/leaderboards/refactor.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/aider/website/docs/leaderboards/edit.md b/aider/website/docs/leaderboards/edit.md index a759bf64b..01a5dc57a 100644 --- a/aider/website/docs/leaderboards/edit.md +++ b/aider/website/docs/leaderboards/edit.md @@ -128,6 +128,6 @@ mod_dates = [get_last_modified_date(file) for file in files] latest_mod_date = max(mod_dates) cog.out(f"{latest_mod_date.strftime('%B %d, %Y.')}") ]]]--> -January 13, 2025. +January 16, 2025.

diff --git a/aider/website/docs/leaderboards/refactor.md b/aider/website/docs/leaderboards/refactor.md index c5f065945..96a7bea2b 100644 --- a/aider/website/docs/leaderboards/refactor.md +++ b/aider/website/docs/leaderboards/refactor.md @@ -73,6 +73,6 @@ mod_dates = [get_last_modified_date(file) for file in files] latest_mod_date = max(mod_dates) cog.out(f"{latest_mod_date.strftime('%B %d, %Y.')}") ]]]--> -January 13, 2025. +January 16, 2025.

From 8040a20f716c3f0e65af98497cef5e1a9a3cee5c Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Thu, 16 Jan 2025 08:25:02 -0800 Subject: [PATCH 025/229] add uv article --- aider/website/_posts/2025-01-15-uv.md | 102 ++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 aider/website/_posts/2025-01-15-uv.md diff --git a/aider/website/_posts/2025-01-15-uv.md b/aider/website/_posts/2025-01-15-uv.md new file mode 100644 index 000000000..7e319d2ff --- /dev/null +++ b/aider/website/_posts/2025-01-15-uv.md @@ -0,0 +1,102 @@ +--- +title: Using uv as an installer +excerpt: Reliably packaging & distributing python CLI tools is hard. Aider uses uv in novel ways to make it easy to install the aider CLI, its dependencies and python 3.12. All in an isolated env. +draft: true +nav_exclude: true +--- +{% if page.date %} + +{% endif %} + +# Using uv as an installer +{: .no_toc } + +It's hard to reliably +package and distribute python command line tools +to end users. +Users frequently encounter challenges: +dependency version conflicts, virtual environment management, +needing to install python or a specific version of python, etc. + +Aider employs [uv](https://github.com/astral-sh/uv) +in a couple of novel ways to streamline the installation process: + +1. Install aider with +`curl https://aider.chat/install.sh | sh` even if python isn't already installed. + +2. Users who have python 3.8+ installed can `pip install aider-install && aider-install`. + +Both methods use uv to **globally** install the `aider` command line program, +with all of its dependencies in an **isolated environment**. +They ensure that aider will run with **python 3.12**, and install that version +if it is not already available. + +These uv install methods are especially helpful for aider, because it +has a large set of very specific dependencies. +Since not all of aider's dependencies are available on all python versions, +it requires python 3.9-3.12. + +Most users don't want to worry about these details -- +they just want a quick way to install and run aider. + + +## One-liners + +Users can install aider with a shell one-liner, without even having python previously installed: + +```bash +curl -LsSf https://aider.chat/install.sh | sh +``` + +This installs uv, then uses it to install python 3.12, +install the `aider` command line tool +and update the user's shell path. +Under the hood, it is simply a copy of +uv's own install script `https://astral.sh/uv/install.sh` +with [one line added](https://github.com/Aider-AI/aider/blob/4251e976b3aa52c2a3af08da4b203d4d524c8e92/aider/website/install.sh#L1181), to install aider as a tool: + +``` +ensure "${_install_dir}/uv" tool install --force --python python3.12 aider-chat@latest +``` + + +## aider-install + +The aider-install python package allows quick global installation of aider +for users who already have python 3.18+ installed. +It simply provides the `aider-install` command line program, +which users just need to run once. + +```bash +pip install aider-install +aider-install +``` + +The `pip install aider-install` installs only two packages: +aider-install and the [uv python package](https://pypi.org/project/uv/). +This ensures that uv is available +in the user's environment. +Everything else is installed in a stand-alone environment created by uv. + +When the user runs `aider-install`, it runs uv +to install aider as a tool and update the user's shell path if needed: + +```bash +uv tool install --force --python python3.12 aider-chat +uv tool update-shell +``` + + +## Benefits + +These uv install methods have been popular with users, +providing a hassle free way to install aider and quickly get started. +Installs are also extremely fast, much faster than pip or pipx installs +even when uv is also installing python 3.12! + +There are also a number of benefits from the perspective of the tool developer/publisher. +Since providing these install methods, far fewer users report dependency problems and +version conflicts as compared to users who `pip install aider-chat`. +There is also less pressure to rapidly support the newest python versions, +since aider always installs with python 3.12. + From a7fadc3a451f18c55193e8cd7b3fae545f32934a Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Thu, 16 Jan 2025 08:28:18 -0800 Subject: [PATCH 026/229] chore: Update upload-pages-artifact action to v4 --- .github/workflows/pages.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index 916742746..88bc6991d 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -56,7 +56,7 @@ jobs: JEKYLL_ENV: production - name: Upload artifact # Automatically uploads an artifact from the './_site' directory by default - uses: actions/upload-pages-artifact@v1 + uses: actions/upload-pages-artifact@v4 with: path: "aider/website/_site/" From ea2e885505a33588e0256d3f183442ad1a961163 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Thu, 16 Jan 2025 08:32:46 -0800 Subject: [PATCH 027/229] Revert "chore: Update upload-pages-artifact action to v4" This reverts commit a7fadc3a451f18c55193e8cd7b3fae545f32934a. --- .github/workflows/pages.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index 88bc6991d..916742746 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -56,7 +56,7 @@ jobs: JEKYLL_ENV: production - name: Upload artifact # Automatically uploads an artifact from the './_site' directory by default - uses: actions/upload-pages-artifact@v4 + uses: actions/upload-pages-artifact@v1 with: path: "aider/website/_site/" From 2813437515ae24658153750354c6b9a0fb56f2aa Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Thu, 16 Jan 2025 08:35:13 -0800 Subject: [PATCH 028/229] chore: Update GitHub Actions upload-pages-artifact to v3 --- .github/workflows/pages.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index 916742746..21e382032 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -56,7 +56,7 @@ jobs: JEKYLL_ENV: production - name: Upload artifact # Automatically uploads an artifact from the './_site' directory by default - uses: actions/upload-pages-artifact@v1 + uses: actions/upload-pages-artifact@v3 with: path: "aider/website/_site/" From ebc475d2785557df15ac3d66b1ab1bea4cd2409e Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Thu, 16 Jan 2025 08:38:19 -0800 Subject: [PATCH 029/229] feat: Update GitHub Pages artifact upload path --- .github/workflows/pages.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index 21e382032..369ae0d50 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -55,10 +55,9 @@ jobs: env: JEKYLL_ENV: production - name: Upload artifact - # Automatically uploads an artifact from the './_site' directory by default uses: actions/upload-pages-artifact@v3 with: - path: "aider/website/_site/" + path: "aider/website/_site" # Deployment job deploy: From 05ffc7f8d6e12ed8f518ec141655a9976e5f37c2 Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Thu, 16 Jan 2025 08:38:38 -0800 Subject: [PATCH 030/229] feat: Add trigger for pages.yml workflow file changes --- .github/workflows/pages.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index 369ae0d50..913e1b0e7 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -12,6 +12,7 @@ on: - "main" paths: - "aider/website/**" + - ".github/workflows/pages.yml" # Allows you to run this workflow manually from the Actions tab workflow_dispatch: From bd03563fcb656b12d8a09ac055f57e9386519832 Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Thu, 16 Jan 2025 08:50:53 -0800 Subject: [PATCH 031/229] ci: Ignore workflow file changes except for self-modification --- .github/workflows/docker-build-test.yml | 6 ++++-- .github/workflows/ubuntu-tests.yml | 6 ++++-- .github/workflows/windows-tests.yml | 6 ++++-- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/.github/workflows/docker-build-test.yml b/.github/workflows/docker-build-test.yml index 83f5667bd..011c190cf 100644 --- a/.github/workflows/docker-build-test.yml +++ b/.github/workflows/docker-build-test.yml @@ -4,8 +4,10 @@ on: push: paths-ignore: - 'aider/website/**' - - README.md - - HISTORY.md + - 'README.md' + - 'HISTORY.md' + - '.github/workflows/*' + - '!.github/workflows/docker-build-test.yml' branches: - main pull_request: diff --git a/.github/workflows/ubuntu-tests.yml b/.github/workflows/ubuntu-tests.yml index 5efd26520..1c1387989 100644 --- a/.github/workflows/ubuntu-tests.yml +++ b/.github/workflows/ubuntu-tests.yml @@ -4,8 +4,10 @@ on: push: paths-ignore: - 'aider/website/**' - - README.md - - HISTORY.md + - 'README.md' + - 'HISTORY.md' + - '.github/workflows/*' + - '!.github/workflows/ubuntu-tests.yml' branches: - main pull_request: diff --git a/.github/workflows/windows-tests.yml b/.github/workflows/windows-tests.yml index bbc6a9b37..6ded64043 100644 --- a/.github/workflows/windows-tests.yml +++ b/.github/workflows/windows-tests.yml @@ -4,8 +4,10 @@ on: push: paths-ignore: - 'aider/website/**' - - README.md - - HISTORY.md + - 'README.md' + - 'HISTORY.md' + - '.github/workflows/*' + - '!.github/workflows/windows-tests.yml' branches: - main pull_request: From ed7fbabd1c01edb9fcda6f8f7a7bd786965970a8 Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Thu, 16 Jan 2025 08:51:24 -0800 Subject: [PATCH 032/229] ci: Update pull_request workflow triggers with consistent path ignores --- .github/workflows/docker-build-test.yml | 5 ++++- .github/workflows/ubuntu-tests.yml | 5 ++++- .github/workflows/windows-tests.yml | 5 ++++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/.github/workflows/docker-build-test.yml b/.github/workflows/docker-build-test.yml index 011c190cf..d98a3138e 100644 --- a/.github/workflows/docker-build-test.yml +++ b/.github/workflows/docker-build-test.yml @@ -13,7 +13,10 @@ on: pull_request: paths-ignore: - 'aider/website/**' - - README.md + - 'README.md' + - 'HISTORY.md' + - '.github/workflows/*' + - '!.github/workflows/docker-build-test.yml' branches: - main diff --git a/.github/workflows/ubuntu-tests.yml b/.github/workflows/ubuntu-tests.yml index 1c1387989..632c03757 100644 --- a/.github/workflows/ubuntu-tests.yml +++ b/.github/workflows/ubuntu-tests.yml @@ -13,7 +13,10 @@ on: pull_request: paths-ignore: - 'aider/website/**' - - README.md + - 'README.md' + - 'HISTORY.md' + - '.github/workflows/*' + - '!.github/workflows/ubuntu-tests.yml' branches: - main diff --git a/.github/workflows/windows-tests.yml b/.github/workflows/windows-tests.yml index 6ded64043..21799563e 100644 --- a/.github/workflows/windows-tests.yml +++ b/.github/workflows/windows-tests.yml @@ -13,7 +13,10 @@ on: pull_request: paths-ignore: - 'aider/website/**' - - README.md + - 'README.md' + - 'HISTORY.md' + - '.github/workflows/*' + - '!.github/workflows/windows-tests.yml' branches: - main From 0ed42f657d67d49ba72f25d8c172dbed6e66c5b7 Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Thu, 16 Jan 2025 08:54:57 -0800 Subject: [PATCH 033/229] feat: Add build output listing step to debug artifact upload --- .github/workflows/pages.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index 913e1b0e7..98a097bf4 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -55,6 +55,9 @@ jobs: run: bundle exec jekyll build --baseurl "${{ steps.pages.outputs.base_path }}" env: JEKYLL_ENV: production + - name: List build output + run: ls -la aider/website/_site + - name: Upload artifact uses: actions/upload-pages-artifact@v3 with: From af09c3e62a04456e9f2c779d53a313dae069d239 Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Thu, 16 Jan 2025 08:57:51 -0800 Subject: [PATCH 034/229] chore: Update artifact upload path in GitHub Pages workflow --- .github/workflows/pages.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index 98a097bf4..0823b7afc 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -56,12 +56,12 @@ jobs: env: JEKYLL_ENV: production - name: List build output - run: ls -la aider/website/_site + run: ls -la _site - name: Upload artifact uses: actions/upload-pages-artifact@v3 with: - path: "aider/website/_site" + path: "_site" # Deployment job deploy: From d7921c01113a76f70eecbd99d19ad6b52f751809 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Thu, 16 Jan 2025 09:01:01 -0800 Subject: [PATCH 035/229] chore: Update GitHub Actions workflow with artifact path and deploy pages version --- .github/workflows/pages.yml | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index 0823b7afc..4454e832f 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -55,13 +55,10 @@ jobs: run: bundle exec jekyll build --baseurl "${{ steps.pages.outputs.base_path }}" env: JEKYLL_ENV: production - - name: List build output - run: ls -la _site - - name: Upload artifact uses: actions/upload-pages-artifact@v3 with: - path: "_site" + path: "aider/website/_site" # Deployment job deploy: @@ -73,7 +70,7 @@ jobs: steps: - name: Deploy to GitHub Pages id: deployment - uses: actions/deploy-pages@v2 + uses: actions/deploy-pages@v4 - name: Set up Python 3.12 uses: actions/setup-python@v5 From b92df8740065f61c6a830bd0900dec7d378bd231 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Thu, 16 Jan 2025 09:03:09 -0800 Subject: [PATCH 036/229] publish --- aider/website/_posts/2025-01-15-uv.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aider/website/_posts/2025-01-15-uv.md b/aider/website/_posts/2025-01-15-uv.md index 7e319d2ff..a61895634 100644 --- a/aider/website/_posts/2025-01-15-uv.md +++ b/aider/website/_posts/2025-01-15-uv.md @@ -1,7 +1,7 @@ --- title: Using uv as an installer excerpt: Reliably packaging & distributing python CLI tools is hard. Aider uses uv in novel ways to make it easy to install the aider CLI, its dependencies and python 3.12. All in an isolated env. -draft: true +draft: false nav_exclude: true --- {% if page.date %} From a06f4dfad6df7868a113272f9a86a1236e6c11fc Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Thu, 16 Jan 2025 10:30:14 -0800 Subject: [PATCH 037/229] copy --- aider/website/_posts/2025-01-15-uv.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aider/website/_posts/2025-01-15-uv.md b/aider/website/_posts/2025-01-15-uv.md index a61895634..3f0d045c6 100644 --- a/aider/website/_posts/2025-01-15-uv.md +++ b/aider/website/_posts/2025-01-15-uv.md @@ -63,7 +63,7 @@ ensure "${_install_dir}/uv" tool install --force --python python3.12 aider-chat@ ## aider-install The aider-install python package allows quick global installation of aider -for users who already have python 3.18+ installed. +for users who already have python 3.8+ installed. It simply provides the `aider-install` command line program, which users just need to run once. From 9822a6ed5dcda863ee9c010ca89845d07fd02fa4 Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Thu, 16 Jan 2025 11:47:29 -0800 Subject: [PATCH 038/229] feat: Modify Docker workflow to separate PR and push build steps --- .github/workflows/docker-build-test.yml | 30 +++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/.github/workflows/docker-build-test.yml b/.github/workflows/docker-build-test.yml index d98a3138e..3e4dce471 100644 --- a/.github/workflows/docker-build-test.yml +++ b/.github/workflows/docker-build-test.yml @@ -42,22 +42,44 @@ jobs: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_PASSWORD }} - - name: Build and push Docker images + - name: Build Docker images (PR) + if: github.event_name == 'pull_request' uses: docker/build-push-action@v5 with: context: . file: ./docker/Dockerfile platforms: linux/amd64,linux/arm64 - push: ${{ github.event_name != 'pull_request' }} + push: false + target: aider + + - name: Build Docker images (Push) + if: github.event_name != 'pull_request' + uses: docker/build-push-action@v5 + with: + context: . + file: ./docker/Dockerfile + platforms: linux/amd64,linux/arm64 + push: true tags: ${{ secrets.DOCKERHUB_USERNAME }}/aider:dev target: aider - - name: Build and push Docker full image + - name: Build Docker full image (PR) + if: github.event_name == 'pull_request' uses: docker/build-push-action@v5 with: context: . file: ./docker/Dockerfile platforms: linux/amd64,linux/arm64 - push: ${{ github.event_name != 'pull_request' }} + push: false + target: aider-full + + - name: Build Docker full image (Push) + if: github.event_name != 'pull_request' + uses: docker/build-push-action@v5 + with: + context: . + file: ./docker/Dockerfile + platforms: linux/amd64,linux/arm64 + push: true tags: ${{ secrets.DOCKERHUB_USERNAME }}/aider-full:dev target: aider-full From 3b7b9b6ed1250f6abc216313d08f262a8d375e62 Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Thu, 16 Jan 2025 11:48:59 -0800 Subject: [PATCH 039/229] ci: Update Docker build workflow to use DockerHub secret conditions --- .github/workflows/docker-build-test.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/docker-build-test.yml b/.github/workflows/docker-build-test.yml index 3e4dce471..40b86f973 100644 --- a/.github/workflows/docker-build-test.yml +++ b/.github/workflows/docker-build-test.yml @@ -36,14 +36,14 @@ jobs: uses: docker/setup-buildx-action@v3 - name: Login to DockerHub - if: github.event_name != 'pull_request' + if: secrets.DOCKERHUB_USERNAME != '' uses: docker/login-action@v3 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_PASSWORD }} - name: Build Docker images (PR) - if: github.event_name == 'pull_request' + if: secrets.DOCKERHUB_USERNAME == '' uses: docker/build-push-action@v5 with: context: . @@ -53,7 +53,7 @@ jobs: target: aider - name: Build Docker images (Push) - if: github.event_name != 'pull_request' + if: secrets.DOCKERHUB_USERNAME != '' uses: docker/build-push-action@v5 with: context: . @@ -64,7 +64,7 @@ jobs: target: aider - name: Build Docker full image (PR) - if: github.event_name == 'pull_request' + if: secrets.DOCKERHUB_USERNAME == '' uses: docker/build-push-action@v5 with: context: . @@ -74,7 +74,7 @@ jobs: target: aider-full - name: Build Docker full image (Push) - if: github.event_name != 'pull_request' + if: secrets.DOCKERHUB_USERNAME != '' uses: docker/build-push-action@v5 with: context: . From d62c43bc957724c48e05a445f4b8e7c8df38188b Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Thu, 16 Jan 2025 11:51:10 -0800 Subject: [PATCH 040/229] ci: Fix GitHub Actions workflow syntax for secret conditions --- .github/workflows/docker-build-test.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/docker-build-test.yml b/.github/workflows/docker-build-test.yml index 40b86f973..dc387c720 100644 --- a/.github/workflows/docker-build-test.yml +++ b/.github/workflows/docker-build-test.yml @@ -36,14 +36,14 @@ jobs: uses: docker/setup-buildx-action@v3 - name: Login to DockerHub - if: secrets.DOCKERHUB_USERNAME != '' + if: ${{ secrets.DOCKERHUB_USERNAME != '' }} uses: docker/login-action@v3 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_PASSWORD }} - name: Build Docker images (PR) - if: secrets.DOCKERHUB_USERNAME == '' + if: ${{ secrets.DOCKERHUB_USERNAME == '' }} uses: docker/build-push-action@v5 with: context: . @@ -53,7 +53,7 @@ jobs: target: aider - name: Build Docker images (Push) - if: secrets.DOCKERHUB_USERNAME != '' + if: ${{ secrets.DOCKERHUB_USERNAME != '' }} uses: docker/build-push-action@v5 with: context: . @@ -64,7 +64,7 @@ jobs: target: aider - name: Build Docker full image (PR) - if: secrets.DOCKERHUB_USERNAME == '' + if: ${{ secrets.DOCKERHUB_USERNAME == '' }} uses: docker/build-push-action@v5 with: context: . @@ -74,7 +74,7 @@ jobs: target: aider-full - name: Build Docker full image (Push) - if: secrets.DOCKERHUB_USERNAME != '' + if: ${{ secrets.DOCKERHUB_USERNAME != '' }} uses: docker/build-push-action@v5 with: context: . From c912b66a8fe8f355678bc704f5085a6443bc26a8 Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Thu, 16 Jan 2025 11:52:34 -0800 Subject: [PATCH 041/229] ci: Update GitHub Actions workflow to use github.event_name for build conditions --- .github/workflows/docker-build-test.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/docker-build-test.yml b/.github/workflows/docker-build-test.yml index dc387c720..f5872ce8b 100644 --- a/.github/workflows/docker-build-test.yml +++ b/.github/workflows/docker-build-test.yml @@ -36,14 +36,14 @@ jobs: uses: docker/setup-buildx-action@v3 - name: Login to DockerHub - if: ${{ secrets.DOCKERHUB_USERNAME != '' }} + if: ${{ github.event_name != 'pull_request' }} uses: docker/login-action@v3 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_PASSWORD }} - name: Build Docker images (PR) - if: ${{ secrets.DOCKERHUB_USERNAME == '' }} + if: ${{ github.event_name == 'pull_request' }} uses: docker/build-push-action@v5 with: context: . @@ -53,7 +53,7 @@ jobs: target: aider - name: Build Docker images (Push) - if: ${{ secrets.DOCKERHUB_USERNAME != '' }} + if: ${{ github.event_name != 'pull_request' }} uses: docker/build-push-action@v5 with: context: . @@ -64,7 +64,7 @@ jobs: target: aider - name: Build Docker full image (PR) - if: ${{ secrets.DOCKERHUB_USERNAME == '' }} + if: ${{ github.event_name == 'pull_request' }} uses: docker/build-push-action@v5 with: context: . @@ -74,7 +74,7 @@ jobs: target: aider-full - name: Build Docker full image (Push) - if: ${{ secrets.DOCKERHUB_USERNAME != '' }} + if: ${{ github.event_name != 'pull_request' }} uses: docker/build-push-action@v5 with: context: . From 6451d59debfb84f53aa971211e6af916c172bbe3 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Thu, 16 Jan 2025 12:29:12 -0800 Subject: [PATCH 042/229] bump deps --- requirements.txt | 57 ++++++++++++++------------- requirements/requirements-browser.txt | 33 ++++++++-------- requirements/requirements-dev.txt | 26 ++++++------ requirements/requirements-help.txt | 42 ++++++++++---------- 4 files changed, 80 insertions(+), 78 deletions(-) diff --git a/requirements.txt b/requirements.txt index 1053368fc..41e197dba 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,18 +6,18 @@ # aiohappyeyeballs==2.4.4 # via aiohttp -aiohttp==3.11.10 +aiohttp==3.11.11 # via litellm -aiosignal==1.3.1 +aiosignal==1.3.2 # via aiohttp annotated-types==0.7.0 # via pydantic -anyio==4.7.0 +anyio==4.8.0 # via # httpx # openai # watchfiles -attrs==24.2.0 +attrs==24.3.0 # via # aiohttp # jsonschema @@ -28,7 +28,7 @@ backoff==2.2.1 # posthog beautifulsoup4==4.12.3 # via -r requirements/requirements.in -certifi==2024.8.30 +certifi==2024.12.14 # via # httpcore # httpx @@ -37,9 +37,9 @@ cffi==1.17.1 # via # sounddevice # soundfile -charset-normalizer==3.4.0 +charset-normalizer==3.4.1 # via requests -click==8.1.7 +click==8.1.8 # via litellm configargparse==1.7 # via -r requirements/requirements.in @@ -57,11 +57,11 @@ frozenlist==1.5.0 # via # aiohttp # aiosignal -fsspec==2024.10.0 +fsspec==2024.12.0 # via huggingface-hub -gitdb==4.0.11 +gitdb==4.0.12 # via gitpython -gitpython==3.1.43 +gitpython==3.1.44 # via -r requirements/requirements.in grep-ast==0.4.1 # via -r requirements/requirements.in @@ -73,7 +73,7 @@ httpx==0.27.2 # via # litellm # openai -huggingface-hub==0.26.5 +huggingface-hub==0.27.1 # via tokenizers idna==3.10 # via @@ -85,11 +85,11 @@ importlib-metadata==7.2.1 # via # -r requirements/requirements.in # litellm -importlib-resources==6.4.5 +importlib-resources==6.5.2 # via -r requirements/requirements.in -jinja2==3.1.4 +jinja2==3.1.5 # via litellm -jiter==0.8.0 +jiter==0.8.2 # via openai json5==0.10.0 # via -r requirements/requirements.in @@ -99,7 +99,7 @@ jsonschema==4.23.0 # litellm jsonschema-specifications==2024.10.1 # via jsonschema -litellm==1.53.9 +litellm==1.58.2 # via -r requirements/requirements.in markdown-it-py==3.0.0 # via rich @@ -123,7 +123,8 @@ numpy==1.26.4 # via # -r requirements/requirements.in # scipy -openai==1.57.0 + # soundfile +openai==1.59.7 # via litellm packaging==24.2 # via @@ -137,7 +138,7 @@ pexpect==4.9.0 # via -r requirements/requirements.in pillow==10.4.0 # via -r requirements/requirements.in -posthog==3.7.4 +posthog==3.8.3 # via -r requirements/requirements.in prompt-toolkit==3.0.48 # via -r requirements/requirements.in @@ -145,7 +146,7 @@ propcache==0.2.1 # via # aiohttp # yarl -psutil==6.1.0 +psutil==6.1.1 # via -r requirements/requirements.in ptyprocess==0.7.0 # via pexpect @@ -153,19 +154,19 @@ pycodestyle==2.12.1 # via flake8 pycparser==2.22 # via cffi -pydantic==2.10.3 +pydantic==2.10.5 # via # litellm # openai -pydantic-core==2.27.1 +pydantic-core==2.27.2 # via pydantic pydub==0.25.1 # via -r requirements/requirements.in pyflakes==3.2.0 # via flake8 -pygments==2.18.0 +pygments==2.19.1 # via rich -pypandoc==1.14 +pypandoc==1.15 # via -r requirements/requirements.in pyperclip==1.9.0 # via -r requirements/requirements.in @@ -177,7 +178,7 @@ pyyaml==6.0.2 # via # -r requirements/requirements.in # huggingface-hub -referencing==0.35.1 +referencing==0.36.0 # via # jsonschema # jsonschema-specifications @@ -186,7 +187,6 @@ regex==2024.11.6 requests==2.32.3 # via # huggingface-hub - # litellm # mixpanel # posthog # tiktoken @@ -203,7 +203,7 @@ six==1.17.0 # mixpanel # posthog # python-dateutil -smmap==5.0.1 +smmap==5.0.2 # via gitdb sniffio==1.3.1 # via @@ -212,7 +212,7 @@ sniffio==1.3.1 # openai sounddevice==0.5.1 # via -r requirements/requirements.in -soundfile==0.12.1 +soundfile==0.13.0 # via -r requirements/requirements.in soupsieve==2.6 # via beautifulsoup4 @@ -239,11 +239,12 @@ typing-extensions==4.12.2 # openai # pydantic # pydantic-core -urllib3==2.2.3 + # referencing +urllib3==2.3.0 # via # mixpanel # requests -watchfiles==1.0.0 +watchfiles==1.0.4 # via -r requirements/requirements.in wcwidth==0.2.13 # via prompt-toolkit diff --git a/requirements/requirements-browser.txt b/requirements/requirements-browser.txt index 7b2b9c46c..10489e8b1 100644 --- a/requirements/requirements-browser.txt +++ b/requirements/requirements-browser.txt @@ -6,7 +6,7 @@ # altair==5.5.0 # via streamlit -attrs==24.2.0 +attrs==24.3.0 # via # -c /Users/gauthier/Projects/aider/requirements.txt # -c requirements.txt @@ -17,33 +17,33 @@ blinker==1.9.0 # via streamlit cachetools==5.5.0 # via streamlit -certifi==2024.8.30 +certifi==2024.12.14 # via # -c /Users/gauthier/Projects/aider/requirements.txt # -c requirements.txt # -c requirements/requirements-dev.txt # -c requirements/requirements-help.txt # requests -charset-normalizer==3.4.0 +charset-normalizer==3.4.1 # via # -c /Users/gauthier/Projects/aider/requirements.txt # -c requirements.txt # -c requirements/requirements-dev.txt # -c requirements/requirements-help.txt # requests -click==8.1.7 +click==8.1.8 # via # -c /Users/gauthier/Projects/aider/requirements.txt # -c requirements.txt # -c requirements/requirements-dev.txt # -c requirements/requirements-help.txt # streamlit -gitdb==4.0.11 +gitdb==4.0.12 # via # -c /Users/gauthier/Projects/aider/requirements.txt # -c requirements.txt # gitpython -gitpython==3.1.43 +gitpython==3.1.44 # via # -c /Users/gauthier/Projects/aider/requirements.txt # -c requirements.txt @@ -55,7 +55,7 @@ idna==3.10 # -c requirements/requirements-dev.txt # -c requirements/requirements-help.txt # requests -jinja2==3.1.4 +jinja2==3.1.5 # via # -c /Users/gauthier/Projects/aider/requirements.txt # -c requirements.txt @@ -92,7 +92,7 @@ mdurl==0.1.2 # -c requirements.txt # -c requirements/requirements-dev.txt # markdown-it-py -narwhals==1.16.0 +narwhals==1.22.0 # via altair numpy==1.26.4 # via @@ -122,13 +122,13 @@ pillow==10.4.0 # -c requirements/requirements-dev.txt # -c requirements/requirements-help.txt # streamlit -protobuf==5.29.1 +protobuf==5.29.3 # via streamlit -pyarrow==18.1.0 +pyarrow==19.0.0 # via streamlit pydeck==0.9.1 # via streamlit -pygments==2.18.0 +pygments==2.19.1 # via # -c /Users/gauthier/Projects/aider/requirements.txt # -c requirements.txt @@ -144,7 +144,7 @@ pytz==2024.2 # via # -c requirements/requirements-dev.txt # pandas -referencing==0.35.1 +referencing==0.36.0 # via # -c /Users/gauthier/Projects/aider/requirements.txt # -c requirements.txt @@ -175,14 +175,14 @@ six==1.17.0 # -c requirements.txt # -c requirements/requirements-dev.txt # python-dateutil -smmap==5.0.1 +smmap==5.0.2 # via # -c /Users/gauthier/Projects/aider/requirements.txt # -c requirements.txt # gitdb -streamlit==1.40.2 +streamlit==1.41.1 # via -r requirements/requirements-browser.in -tenacity==8.5.0 +tenacity==9.0.0 # via # -c requirements/requirements-help.txt # streamlit @@ -197,12 +197,13 @@ typing-extensions==4.12.2 # -c requirements/requirements-dev.txt # -c requirements/requirements-help.txt # altair + # referencing # streamlit tzdata==2024.2 # via # -c requirements/requirements-dev.txt # pandas -urllib3==2.2.3 +urllib3==2.3.0 # via # -c /Users/gauthier/Projects/aider/requirements.txt # -c requirements.txt diff --git a/requirements/requirements-dev.txt b/requirements/requirements-dev.txt index 566454dd2..7c0cf2c7d 100644 --- a/requirements/requirements-dev.txt +++ b/requirements/requirements-dev.txt @@ -10,19 +10,19 @@ babel==2.16.0 # via sphinx build==1.2.2.post1 # via pip-tools -certifi==2024.8.30 +certifi==2024.12.14 # via # -c /Users/gauthier/Projects/aider/requirements.txt # -c requirements.txt # requests cfgv==3.4.0 # via pre-commit -charset-normalizer==3.4.0 +charset-normalizer==3.4.1 # via # -c /Users/gauthier/Projects/aider/requirements.txt # -c requirements.txt # requests -click==8.1.7 +click==8.1.8 # via # -c /Users/gauthier/Projects/aider/requirements.txt # -c requirements.txt @@ -51,9 +51,9 @@ filelock==3.16.1 # -c /Users/gauthier/Projects/aider/requirements.txt # -c requirements.txt # virtualenv -fonttools==4.55.2 +fonttools==4.55.3 # via matplotlib -identify==2.6.3 +identify==2.6.5 # via pre-commit idna==3.10 # via @@ -66,12 +66,12 @@ imgcat==0.6.0 # via -r requirements/requirements-dev.in iniconfig==2.0.0 # via pytest -jinja2==3.1.4 +jinja2==3.1.5 # via # -c /Users/gauthier/Projects/aider/requirements.txt # -c requirements.txt # sphinx -kiwisolver==1.4.7 +kiwisolver==1.4.8 # via matplotlib lox==0.12.0 # via -r requirements/requirements-dev.in @@ -85,7 +85,7 @@ markupsafe==3.0.2 # -c /Users/gauthier/Projects/aider/requirements.txt # -c requirements.txt # jinja2 -matplotlib==3.9.3 +matplotlib==3.10.0 # via -r requirements/requirements-dev.in mdurl==0.1.2 # via @@ -132,13 +132,13 @@ ppft==1.7.6.9 # via pathos pre-commit==4.0.1 # via -r requirements/requirements-dev.in -pygments==2.18.0 +pygments==2.19.1 # via # -c /Users/gauthier/Projects/aider/requirements.txt # -c requirements.txt # rich # sphinx -pyparsing==3.2.0 +pyparsing==3.2.1 # via matplotlib pyproject-hooks==1.2.0 # via @@ -213,12 +213,12 @@ typing-extensions==4.12.2 # typer tzdata==2024.2 # via pandas -urllib3==2.2.3 +urllib3==2.3.0 # via # -c /Users/gauthier/Projects/aider/requirements.txt # -c requirements.txt # requests -virtualenv==20.28.0 +virtualenv==20.29.0 # via pre-commit wheel==0.45.1 # via pip-tools @@ -229,5 +229,5 @@ pip==24.3.1 # -c /Users/gauthier/Projects/aider/requirements.txt # -c requirements.txt # pip-tools -setuptools==75.6.0 +setuptools==75.8.0 # via pip-tools diff --git a/requirements/requirements-help.txt b/requirements/requirements-help.txt index ddf1ad0b2..8088ab2fc 100644 --- a/requirements/requirements-help.txt +++ b/requirements/requirements-help.txt @@ -9,13 +9,13 @@ aiohappyeyeballs==2.4.4 # -c /Users/gauthier/Projects/aider/requirements.txt # -c requirements.txt # aiohttp -aiohttp==3.11.10 +aiohttp==3.11.11 # via # -c /Users/gauthier/Projects/aider/requirements.txt # -c requirements.txt # huggingface-hub # llama-index-core -aiosignal==1.3.1 +aiosignal==1.3.2 # via # -c /Users/gauthier/Projects/aider/requirements.txt # -c requirements.txt @@ -25,17 +25,17 @@ annotated-types==0.7.0 # -c /Users/gauthier/Projects/aider/requirements.txt # -c requirements.txt # pydantic -anyio==4.7.0 +anyio==4.8.0 # via # -c /Users/gauthier/Projects/aider/requirements.txt # -c requirements.txt # httpx -attrs==24.2.0 +attrs==24.3.0 # via # -c /Users/gauthier/Projects/aider/requirements.txt # -c requirements.txt # aiohttp -certifi==2024.8.30 +certifi==2024.12.14 # via # -c /Users/gauthier/Projects/aider/requirements.txt # -c requirements.txt @@ -43,13 +43,13 @@ certifi==2024.8.30 # httpcore # httpx # requests -charset-normalizer==3.4.0 +charset-normalizer==3.4.1 # via # -c /Users/gauthier/Projects/aider/requirements.txt # -c requirements.txt # -c requirements/requirements-dev.txt # requests -click==8.1.7 +click==8.1.8 # via # -c /Users/gauthier/Projects/aider/requirements.txt # -c requirements.txt @@ -77,7 +77,7 @@ frozenlist==1.5.0 # -c requirements.txt # aiohttp # aiosignal -fsspec==2024.10.0 +fsspec==2024.12.0 # via # -c /Users/gauthier/Projects/aider/requirements.txt # -c requirements.txt @@ -103,7 +103,7 @@ httpx==0.27.2 # -c /Users/gauthier/Projects/aider/requirements.txt # -c requirements.txt # llama-index-core -huggingface-hub[inference]==0.26.5 +huggingface-hub[inference]==0.27.1 # via # -c /Users/gauthier/Projects/aider/requirements.txt # -c requirements.txt @@ -120,7 +120,7 @@ idna==3.10 # httpx # requests # yarl -jinja2==3.1.4 +jinja2==3.1.5 # via # -c /Users/gauthier/Projects/aider/requirements.txt # -c requirements.txt @@ -130,11 +130,11 @@ joblib==1.4.2 # via # nltk # scikit-learn -llama-index-core==0.12.0 +llama-index-core==0.12.11 # via # -r requirements/requirements-help.in # llama-index-embeddings-huggingface -llama-index-embeddings-huggingface==0.4.0 +llama-index-embeddings-huggingface==0.5.0 # via -r requirements/requirements-help.in markupsafe==3.0.2 # via @@ -142,7 +142,7 @@ markupsafe==3.0.2 # -c requirements.txt # -c requirements/requirements-dev.txt # jinja2 -marshmallow==3.23.1 +marshmallow==3.25.1 # via dataclasses-json mpmath==1.3.0 # via sympy @@ -194,12 +194,12 @@ propcache==0.2.1 # -c requirements.txt # aiohttp # yarl -pydantic==2.10.3 +pydantic==2.10.5 # via # -c /Users/gauthier/Projects/aider/requirements.txt # -c requirements.txt # llama-index-core -pydantic-core==2.27.1 +pydantic-core==2.27.2 # via # -c /Users/gauthier/Projects/aider/requirements.txt # -c requirements.txt @@ -228,9 +228,9 @@ requests==2.32.3 # llama-index-core # tiktoken # transformers -safetensors==0.4.5 +safetensors==0.5.2 # via transformers -scikit-learn==1.5.2 +scikit-learn==1.6.1 # via sentence-transformers scipy==1.13.1 # via @@ -246,13 +246,13 @@ sniffio==1.3.1 # -c requirements.txt # anyio # httpx -sqlalchemy[asyncio]==2.0.36 +sqlalchemy[asyncio]==2.0.37 # via # llama-index-core # sqlalchemy sympy==1.13.3 # via torch -tenacity==8.5.0 +tenacity==9.0.0 # via llama-index-core threadpoolctl==3.5.0 # via scikit-learn @@ -296,13 +296,13 @@ typing-inspect==0.9.0 # via # dataclasses-json # llama-index-core -urllib3==2.2.3 +urllib3==2.3.0 # via # -c /Users/gauthier/Projects/aider/requirements.txt # -c requirements.txt # -c requirements/requirements-dev.txt # requests -wrapt==1.17.0 +wrapt==1.17.2 # via # deprecated # llama-index-core From 5b6c18612545a2978d2a2b4a06640958666d39a6 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Fri, 17 Jan 2025 13:35:36 -0800 Subject: [PATCH 043/229] copy --- aider/website/docs/config/aider_conf.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/aider/website/docs/config/aider_conf.md b/aider/website/docs/config/aider_conf.md index 91b88fe28..ce36e54cf 100644 --- a/aider/website/docs/config/aider_conf.md +++ b/aider/website/docs/config/aider_conf.md @@ -7,13 +7,15 @@ description: How to configure aider with a yaml config file. # YAML config file Most of aider's options can be set in an `.aider.conf.yml` file. -Aider will look for a this file in these locations and -load whichever is found first. +Aider will look for a this file in these locations: -- As specified with the `--config ` parameter. -- The current directory. -- The root of your git repo. - Your home directory. +- The root of your git repo. +- The current directory. + +If the files above exist, they will be loaded in that order. Files loaded last will take priority. + +You can also specify the `--config ` parameter, which will only load the one config file. {% include keys.md %} From a777f336e1d88a91a436a6082565e68085eb4d33 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Fri, 17 Jan 2025 13:37:02 -0800 Subject: [PATCH 044/229] chore: Update polyglot leaderboard test results and metadata --- aider/website/_data/polyglot_leaderboard.yml | 34 ++++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/aider/website/_data/polyglot_leaderboard.yml b/aider/website/_data/polyglot_leaderboard.yml index 8b52c1dbd..eb2b97b19 100644 --- a/aider/website/_data/polyglot_leaderboard.yml +++ b/aider/website/_data/polyglot_leaderboard.yml @@ -24,32 +24,32 @@ seconds_per_case: 17.3 total_cost: 0.3236 -- dirname: 2024-12-21-18-44-28--polyglot-sonnet +- dirname: 2025-01-17-19-44-33--sonnet-baseline-jan-17 test_cases: 225 model: claude-3-5-sonnet-20241022 edit_format: diff - commit_hash: a755079-dirty - pass_rate_1: 18.7 - pass_rate_2: 45.3 - pass_num_1: 42 - pass_num_2: 102 - percent_cases_well_formed: 100.0 - error_outputs: 1 - num_malformed_responses: 0 - num_with_malformed_responses: 0 - user_asks: 14 + commit_hash: 6451d59 + pass_rate_1: 22.2 + pass_rate_2: 51.6 + pass_num_1: 50 + pass_num_2: 116 + percent_cases_well_formed: 99.6 + error_outputs: 2 + num_malformed_responses: 1 + num_with_malformed_responses: 1 + user_asks: 11 lazy_comments: 0 syntax_errors: 0 indentation_errors: 0 exhausted_context_windows: 1 - test_timeouts: 12 + test_timeouts: 8 total_tests: 225 command: aider --model claude-3-5-sonnet-20241022 - date: 2024-12-21 - versions: 0.69.2.dev - seconds_per_case: 30.8 - total_cost: 13.4847 - + date: 2025-01-17 + versions: 0.71.2.dev + seconds_per_case: 21.4 + total_cost: 14.4063 + - dirname: 2024-12-30-20-57-12--gpt-4o-2024-11-20-ex-as-sys test_cases: 225 model: gpt-4o-2024-11-20 From 293c350fb7e031f8b15a3ab70cc86d7fc517c174 Mon Sep 17 00:00:00 2001 From: Paul Walker Date: Fri, 17 Jan 2025 19:33:40 -0500 Subject: [PATCH 045/229] Add tags.scm for Kotlin --- aider/queries/tree-sitter-kotlin-tags.scm | 27 +++++++++++++++++++++++ tests/basic/test_repomap.py | 1 + tests/fixtures/languages/kotlin/test.kt | 16 ++++++++++++++ 3 files changed, 44 insertions(+) create mode 100644 aider/queries/tree-sitter-kotlin-tags.scm create mode 100644 tests/fixtures/languages/kotlin/test.kt diff --git a/aider/queries/tree-sitter-kotlin-tags.scm b/aider/queries/tree-sitter-kotlin-tags.scm new file mode 100644 index 000000000..9770a4c0e --- /dev/null +++ b/aider/queries/tree-sitter-kotlin-tags.scm @@ -0,0 +1,27 @@ +; Definitions + +(class_declaration + (type_identifier) @name.definition.class) @definition.class + +(function_declaration + (simple_identifier) @name.definition.function) @definition.function + +(object_declaration + (type_identifier) @name.definition.object) @definition.object + +; References + +(call_expression + [ + (simple_identifier) @name.reference.call + (navigation_expression + (navigation_suffix + (simple_identifier) @name.reference.call)) + ]) @reference.call + +(delegation_specifier + [ + (user_type) @name.reference.type + (constructor_invocation + (user_type) @name.reference.type) + ]) @reference.type diff --git a/tests/basic/test_repomap.py b/tests/basic/test_repomap.py index 6f47cee09..a007ba3f0 100644 --- a/tests/basic/test_repomap.py +++ b/tests/basic/test_repomap.py @@ -290,6 +290,7 @@ class TestRepoMapAllLanguages(unittest.TestCase): "elixir": ("ex", "Greeter"), "java": ("java", "Greeting"), "javascript": ("js", "Person"), + "kotlin": ("kt", "Greeting"), "ocaml": ("ml", "Greeter"), "php": ("php", "greet"), "python": ("py", "Person"), diff --git a/tests/fixtures/languages/kotlin/test.kt b/tests/fixtures/languages/kotlin/test.kt new file mode 100644 index 000000000..c3f9772ac --- /dev/null +++ b/tests/fixtures/languages/kotlin/test.kt @@ -0,0 +1,16 @@ +interface Greeting { + fun greet(name: String): String +} + +class Test : Greeting { + private val prefix = "Hello" + + override fun greet(name: String): String { + return "$prefix, $name!" + } +} + +fun main(args: Array) { + val greeter = Test() + println(greeter.greet("World")) +} From 21d3703b69067c85b4ae7d8f4d59fca79fb1c9ba Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Mon, 20 Jan 2025 08:11:13 -0800 Subject: [PATCH 046/229] feat: Add deepseek-reasoner model settings and enable caching for deepseek-chat --- aider/models.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/aider/models.py b/aider/models.py index 9dd8d0720..892f83913 100644 --- a/aider/models.py +++ b/aider/models.py @@ -622,12 +622,27 @@ MODEL_SETTINGS = [ use_repo_map=True, send_undo_reply=False, ), + ModelSettings( + "deepseek/deepseek-reasoner", + "diff", + editor_model_name="deepseek/deepseek-chat", + editor_edit_format="editor-diff", + use_repo_map=True, + examples_as_sys_msg=True, + use_temperature=False, + reminder="user", + caches_by_default=True, + extra_params={ + "max_tokens": 8192, + }, + ), ModelSettings( "deepseek/deepseek-chat", "diff", use_repo_map=True, examples_as_sys_msg=True, reminder="sys", + caches_by_default=True, extra_params={ "max_tokens": 8192, }, From cdc9ec2854a3961986292f709c50f62e99838acd Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Mon, 20 Jan 2025 08:34:38 -0800 Subject: [PATCH 047/229] refactor: Add comment for `sanity_check_messages` function in `sendchat.py` --- aider/sendchat.py | 1 + 1 file changed, 1 insertion(+) diff --git a/aider/sendchat.py b/aider/sendchat.py index a61ac5549..8cd635d8c 100644 --- a/aider/sendchat.py +++ b/aider/sendchat.py @@ -15,6 +15,7 @@ CACHE = None RETRY_TIMEOUT = 60 +# sanity_check_messages(messages) -> check if messages alternate role=user and role=assistant (it's ok if role=system messages are interspersed) ai! def send_completion( model_name, From bb61be630a5f66126ed70c54b2481070ee38cf0a Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Mon, 20 Jan 2025 08:34:40 -0800 Subject: [PATCH 048/229] feat: add message role validation function --- aider/sendchat.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/aider/sendchat.py b/aider/sendchat.py index 8cd635d8c..07d31b421 100644 --- a/aider/sendchat.py +++ b/aider/sendchat.py @@ -15,7 +15,19 @@ CACHE = None RETRY_TIMEOUT = 60 -# sanity_check_messages(messages) -> check if messages alternate role=user and role=assistant (it's ok if role=system messages are interspersed) ai! +def sanity_check_messages(messages): + """Check if messages alternate between user and assistant roles. + System messages can be interspersed anywhere. + Returns True if valid, False otherwise.""" + last_role = None + for msg in messages: + role = msg.get("role") + if role == "system": + continue + if last_role and role == last_role: + return False + last_role = role + return True def send_completion( model_name, From fc431df2b414598cfd16d44d86a40d1d4ba636f8 Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Mon, 20 Jan 2025 08:34:44 -0800 Subject: [PATCH 049/229] style: Add blank lines for better readability in sendchat.py --- aider/sendchat.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/aider/sendchat.py b/aider/sendchat.py index 07d31b421..59f67c53e 100644 --- a/aider/sendchat.py +++ b/aider/sendchat.py @@ -15,6 +15,7 @@ CACHE = None RETRY_TIMEOUT = 60 + def sanity_check_messages(messages): """Check if messages alternate between user and assistant roles. System messages can be interspersed anywhere. @@ -29,6 +30,7 @@ def sanity_check_messages(messages): last_role = role return True + def send_completion( model_name, messages, From 7e5e1800005c14d96cdc9ba5df0d89aab77fa8bb Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Mon, 20 Jan 2025 08:35:21 -0800 Subject: [PATCH 050/229] feat: verify last non-system message is from user in sanity_check_messages --- aider/sendchat.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/aider/sendchat.py b/aider/sendchat.py index 59f67c53e..379ec62d7 100644 --- a/aider/sendchat.py +++ b/aider/sendchat.py @@ -19,16 +19,24 @@ RETRY_TIMEOUT = 60 def sanity_check_messages(messages): """Check if messages alternate between user and assistant roles. System messages can be interspersed anywhere. + Also verifies the last non-system message is from the user. Returns True if valid, False otherwise.""" last_role = None + last_non_system_role = None + for msg in messages: role = msg.get("role") if role == "system": continue + if last_role and role == last_role: return False + last_role = role - return True + last_non_system_role = role + + # Ensure last non-system message is from user + return last_non_system_role == "user" def send_completion( From 73bc0f62580f6fb152b1ef695c0840ccb1320aac Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Mon, 20 Jan 2025 08:35:24 -0800 Subject: [PATCH 051/229] style: Remove trailing whitespace in sendchat.py --- aider/sendchat.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/aider/sendchat.py b/aider/sendchat.py index 379ec62d7..4e88f3023 100644 --- a/aider/sendchat.py +++ b/aider/sendchat.py @@ -23,18 +23,18 @@ def sanity_check_messages(messages): Returns True if valid, False otherwise.""" last_role = None last_non_system_role = None - + for msg in messages: role = msg.get("role") if role == "system": continue - + if last_role and role == last_role: return False - + last_role = role last_non_system_role = role - + # Ensure last non-system message is from user return last_non_system_role == "user" From dff544cd5dea68807e5d2a66cfa3954c14102abc Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Mon, 20 Jan 2025 09:38:45 -0800 Subject: [PATCH 052/229] refactor: Split summarize method and add model metadata handling --- aider/history.py | 8 +++++++- aider/models.py | 1 + aider/resources/model-metadata.json | 16 ++++++++++++++++ aider/sendchat.py | 7 ++++++- aider/utils.py | 2 +- benchmark/benchmark.py | 7 +++++++ 6 files changed, 38 insertions(+), 3 deletions(-) diff --git a/aider/history.py b/aider/history.py index 2141a7f81..4f22f3a8e 100644 --- a/aider/history.py +++ b/aider/history.py @@ -26,6 +26,12 @@ class ChatSummary: return sized def summarize(self, messages, depth=0): + messages = self.summarize_real(messages) + if messages and messages[-1]["role"] != "assistant": + messages.append(dict(role="assistant", content="Ok.")) + return messages + + def summarize_real(self, messages, depth=0): if not self.models: raise ValueError("No models available for summarization") @@ -88,7 +94,7 @@ class ChatSummary: if summary_tokens + tail_tokens < self.max_tokens: return result - return self.summarize(result, depth + 1) + return self.summarize_real(result, depth + 1) def summarize_all(self, messages): content = "" diff --git a/aider/models.py b/aider/models.py index 892f83913..e9354213e 100644 --- a/aider/models.py +++ b/aider/models.py @@ -625,6 +625,7 @@ MODEL_SETTINGS = [ ModelSettings( "deepseek/deepseek-reasoner", "diff", + weak_model_name="deepseek/deepseek-chat", editor_model_name="deepseek/deepseek-chat", editor_edit_format="editor-diff", use_repo_map=True, diff --git a/aider/resources/model-metadata.json b/aider/resources/model-metadata.json index 2c63c0851..d8ab09461 100644 --- a/aider/resources/model-metadata.json +++ b/aider/resources/model-metadata.json @@ -1,2 +1,18 @@ { + "deepseek-reasoner": { + "max_tokens": 8192, + "max_input_tokens": 128000, + "max_output_tokens": 8192, + "input_cost_per_token": 0.00000055, + "input_cost_per_token_cache_hit": 0.00000014, + "cache_read_input_token_cost": 0.00000014, + "cache_creation_input_token_cost": 0.0, + "output_cost_per_token": 0.00000219, + "litellm_provider": "deepseek", + "mode": "chat", + //"supports_function_calling": true, + "supports_assistant_prefill": true, + //"supports_tool_choice": true, + "supports_prompt_caching": true + }, } diff --git a/aider/sendchat.py b/aider/sendchat.py index 4e88f3023..ccf1c9f50 100644 --- a/aider/sendchat.py +++ b/aider/sendchat.py @@ -5,6 +5,7 @@ import time from aider.dump import dump # noqa: F401 from aider.exceptions import LiteLLMExceptions from aider.llm import litellm +from aider.utils import format_messages # from diskcache import Cache @@ -30,7 +31,9 @@ def sanity_check_messages(messages): continue if last_role and role == last_role: - return False + print(format_messages(messages)) + # import sys ; sys.exit() + raise ValueError("Messages don't properly alternate user/assistant") last_role = role last_non_system_role = role @@ -47,6 +50,8 @@ def send_completion( temperature=0, extra_params=None, ): + # sanity_check_messages(messages) + kwargs = dict( model=model_name, messages=messages, diff --git a/aider/utils.py b/aider/utils.py index ae850248d..322a44316 100644 --- a/aider/utils.py +++ b/aider/utils.py @@ -112,7 +112,7 @@ def format_messages(messages, title=None): output.append(f"{title.upper()} {'*' * 50}") for msg in messages: - output.append("") + output.append("-------") role = msg["role"].upper() content = msg.get("content") if isinstance(content, list): # Handle list content (e.g., image messages) diff --git a/benchmark/benchmark.py b/benchmark/benchmark.py index a6840970e..6f9411113 100755 --- a/benchmark/benchmark.py +++ b/benchmark/benchmark.py @@ -16,6 +16,7 @@ from types import SimpleNamespace from typing import List, Optional import git +import importlib_resources import lox import pandas as pd import prompts @@ -737,6 +738,10 @@ def run_test_real( chat_history_file=history_fname, ) + resource_metadata = importlib_resources.files("aider.resources").joinpath("model-metadata.json") + model_metadata_files_loaded = models.register_litellm_models([resource_metadata]) + dump(model_metadata_files_loaded) + # weak_model_name = model_name weak_model_name = None @@ -747,6 +752,8 @@ def run_test_real( editor_edit_format=editor_edit_format, ) + dump(main_model.max_chat_history_tokens) + if num_ctx: if not main_model.extra_params: main_model.extra_params = {} From 06d5b14b86b643823905264660bdb994fd873360 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Mon, 20 Jan 2025 09:43:01 -0800 Subject: [PATCH 053/229] sanity_check_messages --- aider/sendchat.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aider/sendchat.py b/aider/sendchat.py index ccf1c9f50..410823405 100644 --- a/aider/sendchat.py +++ b/aider/sendchat.py @@ -50,7 +50,7 @@ def send_completion( temperature=0, extra_params=None, ): - # sanity_check_messages(messages) + sanity_check_messages(messages) kwargs = dict( model=model_name, From f0ba699463687ad6a594a3074e6b8526781286d1 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Mon, 20 Jan 2025 09:49:48 -0800 Subject: [PATCH 054/229] copy --- HISTORY.md | 8 +- aider/website/HISTORY.md | 8 +- aider/website/assets/sample-analytics.jsonl | 528 ++++++++++---------- aider/website/docs/faq.md | 18 +- aider/website/docs/leaderboards/index.md | 2 +- aider/website/docs/more/infinite-output.md | 1 + 6 files changed, 293 insertions(+), 272 deletions(-) diff --git a/HISTORY.md b/HISTORY.md index b0c445176..045001b29 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,12 +1,18 @@ # Release history +### main branch + +- Added `--line-endings` for file writing, by Titusz Pan. +- Added examples_as_sys_msg=True for GPT-4o models, improves benchmark scores. +- Bumped all dependencies, to pick up litellm support for o1 system messages. +- Aider wrote 70% of the code in this release. + ### Aider v0.71.1 - Fix permissions issue in Docker images. - Added read-only file announcements to chat. - Bugfix: ASCII fallback for unicode errors. - Bugfix: integer indices for list slicing in repomap calculations. -- Aider wrote 83% of the code in this release. ### Aider v0.71.0 diff --git a/aider/website/HISTORY.md b/aider/website/HISTORY.md index d97db8c0b..f8c402a78 100644 --- a/aider/website/HISTORY.md +++ b/aider/website/HISTORY.md @@ -23,13 +23,19 @@ cog.out(text) ]]]--> +### main branch + +- Added `--line-endings` for file writing, by Titusz Pan. +- Added examples_as_sys_msg=True for GPT-4o models, improves benchmark scores. +- Bumped all dependencies, to pick up litellm support for o1 system messages. +- Aider wrote 70% of the code in this release. + ### Aider v0.71.1 - Fix permissions issue in Docker images. - Added read-only file announcements to chat. - Bugfix: ASCII fallback for unicode errors. - Bugfix: integer indices for list slicing in repomap calculations. -- Aider wrote 83% of the code in this release. ### Aider v0.71.0 diff --git a/aider/website/assets/sample-analytics.jsonl b/aider/website/assets/sample-analytics.jsonl index b8314f3d1..ea41f20ab 100644 --- a/aider/website/assets/sample-analytics.jsonl +++ b/aider/website/assets/sample-analytics.jsonl @@ -1,267 +1,3 @@ -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736463690} -{"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736463692} -{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736463696} -{"event": "command_clear", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736464010} -{"event": "command_editor", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736464012} -{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736464108} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736464108} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 7604, "completion_tokens": 206, "total_tokens": 7810, "cost": 0.00112224, "total_cost": 0.00454398}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736464113} -{"event": "command_diff", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736464269} -{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736464784} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736464784} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 8077, "completion_tokens": 251, "total_tokens": 8328, "cost": 0.00120106, "total_cost": 0.005745040000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736464790} -{"event": "command_clear", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736464987} -{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736465010} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736465010} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "ask", "prompt_tokens": 3956, "completion_tokens": 278, "total_tokens": 4234, "cost": 0.00063168, "total_cost": 0.006376720000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736465016} -{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736465025} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736465025} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "ask", "prompt_tokens": 4251, "completion_tokens": 347, "total_tokens": 4598, "cost": 0.0006923000000000001, "total_cost": 0.0070690200000000005}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736465033} -{"event": "command_clear", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736465050} -{"event": "command_read-only", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736470870} -{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736470875} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736470950} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 6184, "completion_tokens": 800, "total_tokens": 6984, "cost": 0.00108976, "total_cost": 0.008158780000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736470968} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736471569} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 7644, "completion_tokens": 142, "total_tokens": 7786, "cost": 0.0011099200000000001, "total_cost": 0.009268700000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736471574} -{"event": "command_editor", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736471619} -{"event": "command_editor", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736471727} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736471761} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 7926, "completion_tokens": 553, "total_tokens": 8479, "cost": 0.0012644800000000001, "total_cost": 0.010533180000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736471774} -{"event": "command_read-only", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736471824} -{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736471827} -{"event": "command_editor", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736471833} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736471902} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 7149, "completion_tokens": 1656, "total_tokens": 8805, "cost": 0.00146454, "total_cost": 0.011997720000000002}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736471929} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736472022} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 7377, "completion_tokens": 172, "total_tokens": 7549, "cost": 0.00108094, "total_cost": 0.013078660000000002}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736472027} -{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736472149} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736473993} -{"event": "repo", "properties": {"num_files": 23}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736473996} -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736473996} -{"event": "ai-comments file-add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736473997} -{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736473997} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736473997} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 4007, "completion_tokens": 309, "total_tokens": 4316, "cost": 0.0006475, "total_cost": 0.0006475}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736474005} -{"event": "command_read-only", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736474267} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736474273} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 4380, "completion_tokens": 158, "total_tokens": 4538, "cost": 0.00065744, "total_cost": 0.00130494}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736474277} -{"event": "command_drop", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736474283} -{"event": "command_clear", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736474285} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736474287} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 4149, "completion_tokens": 107, "total_tokens": 4256, "cost": 0.00061082, "total_cost": 0.00191576}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736474290} -{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736474296} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736474296} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "ask", "prompt_tokens": 1913, "completion_tokens": 392, "total_tokens": 2305, "cost": 0.00037758, "total_cost": 0.00229334}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736474305} -{"event": "command_reset", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736474581} -{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736474590} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736474650} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 3821, "completion_tokens": 489, "total_tokens": 4310, "cost": 0.00067186, "total_cost": 0.0029652000000000003}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736474661} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736474688} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 4612, "completion_tokens": 159, "total_tokens": 4771, "cost": 0.0006902000000000001, "total_cost": 0.0036554000000000005}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736474694} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736475528} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 4813, "completion_tokens": 315, "total_tokens": 5128, "cost": 0.00076202, "total_cost": 0.00441742}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736475536} -{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736475769} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736475770} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "ask", "prompt_tokens": 3099, "completion_tokens": 415, "total_tokens": 3514, "cost": 0.00055006, "total_cost": 0.00496748}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736475780} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736475781} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 5672, "completion_tokens": 34, "total_tokens": 5706, "cost": 0.0008036, "total_cost": 0.00577108}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736475784} -{"event": "command_drop", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736475979} -{"event": "command_clear", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736475982} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736475991} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 3744, "completion_tokens": 209, "total_tokens": 3953, "cost": 0.0005826800000000001, "total_cost": 0.00635376}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736475998} -{"event": "command_reset", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736476175} -{"event": "command_read-only", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736476193} -{"event": "command_read-only", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736476197} -{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736476204} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736476215} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 7694, "completion_tokens": 118, "total_tokens": 7812, "cost": 0.0011102, "total_cost": 0.00746396}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736476220} -{"event": "command_reset", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736476378} -{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736476383} -{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736476410} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736476410} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "ask", "prompt_tokens": 1623, "completion_tokens": 438, "total_tokens": 2061, "cost": 0.00034986, "total_cost": 0.00781382}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736476421} -{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736476466} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736476466} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "ask", "prompt_tokens": 2087, "completion_tokens": 403, "total_tokens": 2490, "cost": 0.00040502, "total_cost": 0.008218840000000002}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736476476} -{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736476482} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736476799} -{"event": "repo", "properties": {"num_files": 196}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736476801} -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736476801} -{"event": "command_read-only", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736476804} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736476815} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 3852, "completion_tokens": 136, "total_tokens": 3988, "cost": 0.0005773600000000001, "total_cost": 0.0005773600000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736476820} -{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736476832} -{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736476832} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736479667} -{"event": "repo", "properties": {"num_files": 196}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736479669} -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736479669} -{"event": "command_read-only", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736479676} -{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736479679} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736479699} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 7935, "completion_tokens": 975, "total_tokens": 8910, "cost": 0.0013839000000000002, "total_cost": 0.0013839000000000002}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736479725} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736479738} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 9287, "completion_tokens": 496, "total_tokens": 9783, "cost": 0.0014390600000000003, "total_cost": 0.0028229600000000002}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736479752} -{"event": "command_undo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736479778} -{"event": "command_undo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736479779} -{"event": "command_undo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736479784} -{"event": "command_undo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736479786} -{"event": "command_clear", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736479788} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736479843} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 7956, "completion_tokens": 828, "total_tokens": 8784, "cost": 0.0013456800000000001, "total_cost": 0.00416864}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736479864} -{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736479884} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736479898} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 9002, "completion_tokens": 491, "total_tokens": 9493, "cost": 0.00139776, "total_cost": 0.005566400000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736479913} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736479914} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 10090, "completion_tokens": 329, "total_tokens": 10419, "cost": 0.0015047200000000002, "total_cost": 0.007071120000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736479925} -{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736480002} -{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736480002} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736480229} -{"event": "repo", "properties": {"num_files": 196}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736480231} -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736480231} -{"event": "ai-comments file-add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736480236} -{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736480236} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736480236} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 6875, "completion_tokens": 268, "total_tokens": 7143, "cost": 0.00103754, "total_cost": 0.00103754}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736480246} -{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736480315} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736480320} -{"event": "repo", "properties": {"num_files": 196}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736480322} -{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736480327} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736480904} -{"event": "repo", "properties": {"num_files": 196}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736480906} -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736480906} -{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736480909} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736480954} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 3777, "completion_tokens": 399, "total_tokens": 4176, "cost": 0.0006405000000000001, "total_cost": 0.0006405000000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736480965} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736481059} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 4276, "completion_tokens": 250, "total_tokens": 4526, "cost": 0.00066864, "total_cost": 0.00130914}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736481066} -{"event": "ai-comments file-add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736481440} -{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736481440} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736481440} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 7940, "completion_tokens": 168, "total_tokens": 8108, "cost": 0.00115864, "total_cost": 0.00246778}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736481445} -{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736481470} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736481536} -{"event": "repo", "properties": {"num_files": 196}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736481539} -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736481539} -{"event": "command_read-only", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736481554} -{"event": "ai-comments file-add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736481565} -{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736481565} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736481565} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 62215, "completion_tokens": 0, "total_tokens": 62215, "cost": 0.0087101, "total_cost": 0.0087101}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736481567} -{"event": "command_drop", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736481578} -{"event": "command_run", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736481581} -{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736481588} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736481588} -{"event": "command_clear", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736481598} -{"event": "command_run", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736481610} -{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736481617} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736481617} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 9383, "completion_tokens": 193, "total_tokens": 9576, "cost": 0.0013676600000000001, "total_cost": 0.01007776}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736481623} -{"event": "command_drop", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736481716} -{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736481718} -{"event": "command_clear", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736481720} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736481723} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 4074, "completion_tokens": 323, "total_tokens": 4397, "cost": 0.0006608, "total_cost": 0.01073856}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736481731} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736482181} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 4540, "completion_tokens": 238, "total_tokens": 4778, "cost": 0.00070224, "total_cost": 0.0114408}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736482187} -{"event": "command_undo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736482199} -{"event": "command_model", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736482204} -{"event": "command_clear", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736482206} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736482207} -{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 3962, "completion_tokens": 241, "total_tokens": 4203, "cost": 0.015501000000000001, "total_cost": 0.026941800000000002}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736482213} -{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736482232} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736482233} -{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "ask", "prompt_tokens": 2110, "completion_tokens": 263, "total_tokens": 2373, "cost": 0.010275, "total_cost": 0.0372168}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736482238} -{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736482255} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736482255} -{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "ask", "prompt_tokens": 2400, "completion_tokens": 187, "total_tokens": 2587, "cost": 0.010005, "total_cost": 0.0472218}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736482259} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736482268} -{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 4743, "completion_tokens": 308, "total_tokens": 5051, "cost": 0.018849, "total_cost": 0.0660708}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736482274} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736482509} -{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 5125, "completion_tokens": 165, "total_tokens": 5290, "cost": 0.01785, "total_cost": 0.0839208}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736482513} -{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736517456} -{"event": "command_clear", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736517462} -{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736517470} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736517470} -{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "ask", "prompt_tokens": 2082, "completion_tokens": 244, "total_tokens": 2326, "cost": 0.009906, "total_cost": 0.0938268}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736517476} -{"event": "command_drop", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736517485} -{"event": "command_clear", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736517488} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736517496} -{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 3771, "completion_tokens": 144, "total_tokens": 3915, "cost": 0.013473, "total_cost": 0.1072998}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736517501} -{"event": "ai-comments file-add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736520328} -{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736520328} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736520328} -{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 7240, "completion_tokens": 321, "total_tokens": 7561, "cost": 0.026535, "total_cost": 0.1338348}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736520335} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736520627} -{"event": "repo", "properties": {"num_files": 197}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736520629} -{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736520633} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736520766} -{"event": "repo", "properties": {"num_files": 197}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736520767} -{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736520770} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736520898} -{"event": "repo", "properties": {"num_files": 197}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736520900} -{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736520902} -{"event": "command_drop", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736521014} -{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736521016} -{"event": "command_clear", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736521018} -{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736521034} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736521034} -{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "ask", "prompt_tokens": 1660, "completion_tokens": 303, "total_tokens": 1963, "cost": 0.009525, "total_cost": 0.1433598}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736521041} -{"event": "command_read-only", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736521105} -{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736521118} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736521118} -{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "ask", "prompt_tokens": 2385, "completion_tokens": 274, "total_tokens": 2659, "cost": 0.011265, "total_cost": 0.1546248}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736521129} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736521149} -{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 4832, "completion_tokens": 315, "total_tokens": 5147, "cost": 0.019221000000000002, "total_cost": 0.1738458}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736521157} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736521158} -{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 5441, "completion_tokens": 120, "total_tokens": 5561, "cost": 0.018123, "total_cost": 0.1919688}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736521162} -{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736521191} -{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736521195} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736521199} -{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 5541, "completion_tokens": 285, "total_tokens": 5826, "cost": 0.020898, "total_cost": 0.2128668}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736521205} -{"event": "ai-comments file-add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736536711} -{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736536711} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736536711} -{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 6429, "completion_tokens": 202, "total_tokens": 6631, "cost": 0.022317000000000004, "total_cost": 0.2351838}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736536718} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736544490} -{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736544492} -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736544492} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736544493} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 2203, "completion_tokens": 36, "total_tokens": 2239, "cost": 0.0003185, "total_cost": 0.0003185}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736544496} -{"event": "command_model", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736544499} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736544500} -{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736544538} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736544540} -{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736544541} -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736544541} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736544543} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 2203, "completion_tokens": 36, "total_tokens": 2239, "cost": 0.0003185, "total_cost": 0.0003185}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736544545} -{"event": "command_model", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736544547} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736544548} -{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736544590} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736544591} -{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736544593} -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736544593} -{"event": "command_model", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736544594} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736544595} -{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736544608} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736544610} -{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736544611} -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "deepseek/deepseek-coder", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736544611} -{"event": "command_model", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736544612} -{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736544615} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736544622} -{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736544624} -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736544624} -{"event": "command_model", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736544627} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736544692} -{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736544694} -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736544694} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736544694} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 2347, "completion_tokens": 36, "total_tokens": 2383, "cost": 0.00033865999999804005, "total_cost": 0.00033865999999804005}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736544697} -{"event": "command_model", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736544698} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736544699} -{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736544703} {"event": "message_send", "properties": {"main_model": "o1", "weak_model": "gpt-4o-mini", "editor_model": "gpt-4o", "edit_format": "diff", "prompt_tokens": 2409, "completion_tokens": 181, "total_tokens": 2590, "cost": 0.046995, "total_cost": 0.04733365999999804}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736544703} {"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736544709} {"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736544711} @@ -998,3 +734,267 @@ {"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737044639} {"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737044641} {"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737044642} +{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737044676} +{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737044676} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737044745} +{"event": "gui session", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737044745} +{"event": "exit", "properties": {"reason": "GUI session ended"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737044745} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737044881} +{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737044881} +{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737044881} +{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737044889} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737044891} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 7550, "completion_tokens": 139, "total_tokens": 7689, "cost": 0.024735, "total_cost": 0.024735}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737044896} +{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737044899} +{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737044899} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737045175} +{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737045175} +{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737045175} +{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737045178} +{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737045179} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737045190} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "ask", "prompt_tokens": 5572, "completion_tokens": 148, "total_tokens": 5720, "cost": 0.018936, "total_cost": 0.018936}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737045194} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737045220} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "ask", "prompt_tokens": 5749, "completion_tokens": 129, "total_tokens": 5878, "cost": 0.019182, "total_cost": 0.038118}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737045223} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737045256} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "ask", "prompt_tokens": 5943, "completion_tokens": 239, "total_tokens": 6182, "cost": 0.021414000000000002, "total_cost": 0.059532}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737045261} +{"event": "command_commit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737045311} +{"event": "command_clear", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737045458} +{"event": "command_web", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737045461} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737045478} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "ask", "prompt_tokens": 11480, "completion_tokens": 298, "total_tokens": 11778, "cost": 0.03891, "total_cost": 0.098442}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737045486} +{"event": "command_code", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737045491} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737045492} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 13701, "completion_tokens": 155, "total_tokens": 13856, "cost": 0.043428, "total_cost": 0.14187}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737045497} +{"event": "command_code", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737045511} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737045511} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 14428, "completion_tokens": 115, "total_tokens": 14543, "cost": 0.045009, "total_cost": 0.186879}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737045516} +{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046179} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046209} +{"event": "command_code", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046218} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046218} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 15816, "completion_tokens": 371, "total_tokens": 16187, "cost": 0.053013000000000005, "total_cost": 0.239892}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046227} +{"event": "command_code", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046271} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046271} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 17124, "completion_tokens": 361, "total_tokens": 17485, "cost": 0.056787000000000004, "total_cost": 0.296679}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046282} +{"event": "command_reset", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046429} +{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046434} +{"event": "command_web", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046451} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046462} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "ask", "prompt_tokens": 11109, "completion_tokens": 365, "total_tokens": 11474, "cost": 0.038802, "total_cost": 0.33548100000000003}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046472} +{"event": "command_code", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046490} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046490} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 13758, "completion_tokens": 147, "total_tokens": 13905, "cost": 0.043479, "total_cost": 0.37896}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046495} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046565} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "ask", "prompt_tokens": 11825, "completion_tokens": 210, "total_tokens": 12035, "cost": 0.038625, "total_cost": 0.41758500000000004}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046571} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046631} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "ask", "prompt_tokens": 12287, "completion_tokens": 176, "total_tokens": 12463, "cost": 0.039500999999999994, "total_cost": 0.45708600000000005}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046636} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046653} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "ask", "prompt_tokens": 12473, "completion_tokens": 168, "total_tokens": 12641, "cost": 0.039939, "total_cost": 0.49702500000000005}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046657} +{"event": "command_code", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046661} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046661} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 15176, "completion_tokens": 127, "total_tokens": 15303, "cost": 0.047432999999999996, "total_cost": 0.544458}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046666} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046732} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "ask", "prompt_tokens": 13689, "completion_tokens": 159, "total_tokens": 13848, "cost": 0.043452, "total_cost": 0.58791}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046737} +{"event": "command_diff", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046754} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046767} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "ask", "prompt_tokens": 13867, "completion_tokens": 133, "total_tokens": 14000, "cost": 0.043595999999999996, "total_cost": 0.631506}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046771} +{"event": "command_undo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046789} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046857} +{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046857} +{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046861} +{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737053692} +{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737053692} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737056647} +{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737056647} +{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737056647} +{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737056648} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737056652} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "ask", "prompt_tokens": 4678, "completion_tokens": 299, "total_tokens": 4977, "cost": 0.018519, "total_cost": 0.018519}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737056665} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737056724} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "ask", "prompt_tokens": 4998, "completion_tokens": 338, "total_tokens": 5336, "cost": 0.020064, "total_cost": 0.038583}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737056731} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737056769} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "ask", "prompt_tokens": 5356, "completion_tokens": 453, "total_tokens": 5809, "cost": 0.022862999999999998, "total_cost": 0.061446}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737056777} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737056812} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "ask", "prompt_tokens": 5846, "completion_tokens": 376, "total_tokens": 6222, "cost": 0.023178, "total_cost": 0.084624}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737056819} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737056833} +{"event": "command_code", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737056838} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737056838} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 8847, "completion_tokens": 531, "total_tokens": 9378, "cost": 0.034506, "total_cost": 0.11913000000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737056847} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737056885} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "ask", "prompt_tokens": 7867, "completion_tokens": 578, "total_tokens": 8445, "cost": 0.032271, "total_cost": 0.151401}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737056894} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737056896} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "ask", "prompt_tokens": 8465, "completion_tokens": 469, "total_tokens": 8934, "cost": 0.03243, "total_cost": 0.18383100000000002}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737056903} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737056912} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "ask", "prompt_tokens": 8958, "completion_tokens": 136, "total_tokens": 9094, "cost": 0.028914000000000002, "total_cost": 0.21274500000000002}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737056917} +{"event": "command_code", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737056925} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737056925} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 11142, "completion_tokens": 668, "total_tokens": 11810, "cost": 0.043446, "total_cost": 0.256191}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737056937} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737057045} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "ask", "prompt_tokens": 9938, "completion_tokens": 475, "total_tokens": 10413, "cost": 0.036939, "total_cost": 0.29313}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737057055} +{"event": "command_code", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737057057} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737057058} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 12696, "completion_tokens": 686, "total_tokens": 13382, "cost": 0.048378000000000004, "total_cost": 0.34150800000000003}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737057068} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737057101} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "ask", "prompt_tokens": 11279, "completion_tokens": 761, "total_tokens": 12040, "cost": 0.045252, "total_cost": 0.38676000000000005}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737057112} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737057130} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "ask", "prompt_tokens": 12062, "completion_tokens": 468, "total_tokens": 12530, "cost": 0.043206, "total_cost": 0.42996600000000007}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737057138} +{"event": "command_code", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737057142} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737057142} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 14256, "completion_tokens": 695, "total_tokens": 14951, "cost": 0.053193000000000004, "total_cost": 0.48315900000000006}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737057153} +{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737059273} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737066817} +{"event": "model warning", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737066819} +{"event": "exit", "properties": {"reason": "Keyboard interrupt during model warnings"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737130145} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737144019} +{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737144020} +{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737144020} +{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737144021} +{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737144021} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737144038} +{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737144040} +{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737144040} +{"event": "exit", "properties": {"reason": "Completed main CLI coder.run"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737144048} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149251} +{"event": "model warning", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149253} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149269} +{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149271} +{"event": "cli session", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None", "edit_format": "whole"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149271} +{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149312} +{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149312} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149332} +{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149333} +{"event": "cli session", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None", "edit_format": "whole"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149333} +{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149339} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149344} +{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149346} +{"event": "cli session", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None", "edit_format": "whole"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149346} +{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149410} +{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149410} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149416} +{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149417} +{"event": "cli session", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None", "edit_format": "whole"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149417} +{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149426} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149429} +{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149430} +{"event": "cli session", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None", "edit_format": "whole"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149430} +{"event": "exit", "properties": {"reason": "Completed main CLI coder.run"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149450} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149452} +{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149454} +{"event": "cli session", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None", "edit_format": "whole"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149454} +{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149457} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149484} +{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149485} +{"event": "cli session", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None", "edit_format": "whole"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149485} +{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149525} +{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149525} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149529} +{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149530} +{"event": "cli session", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None", "edit_format": "whole"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149530} +{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149585} +{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149585} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149588} +{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149590} +{"event": "cli session", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None", "edit_format": "whole"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149590} +{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149611} +{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149611} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149615} +{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149616} +{"event": "exit", "properties": {"reason": "Exit flag set"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149616} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149652} +{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149653} +{"event": "exit", "properties": {"reason": "Exit flag set"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149653} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149669} +{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149671} +{"event": "exit", "properties": {"reason": "Exit flag set"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149671} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149818} +{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149820} +{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149822} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737157862} +{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737157864} +{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737157870} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737159856} +{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737159858} +{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737159858} +{"event": "ai-comments file-add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737159859} +{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737159859} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737159859} +{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 15329, "completion_tokens": 197, "total_tokens": 15526, "cost": 0.00220121999999804, "total_cost": 0.00220121999999804}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737159869} +{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737159900} +{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737159900} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737167868} +{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737167870} +{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737167876} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737170874} +{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737170876} +{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737170876} +{"event": "command_read-only", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737170888} +{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737170896} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737170970} +{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "ask", "prompt_tokens": 5604, "completion_tokens": 600, "total_tokens": 6204, "cost": 0.0009525599999980401, "total_cost": 0.0009525599999980401}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737170988} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737171218} +{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "ask", "prompt_tokens": 5643, "completion_tokens": 530, "total_tokens": 6173, "cost": 0.0009384199999980401, "total_cost": 0.0018909799999960802}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737171233} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737171262} +{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "ask", "prompt_tokens": 6194, "completion_tokens": 357, "total_tokens": 6551, "cost": 0.0009671199999980401, "total_cost": 0.0028580999999941203}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737171272} +{"event": "command_code", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737171284} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737171284} +{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 8860, "completion_tokens": 854, "total_tokens": 9714, "cost": 0.00147951999999804, "total_cost": 0.00433761999999216}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737171307} +{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737212408} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737316410} +{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737316413} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737316413} +{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 10031, "completion_tokens": 36, "total_tokens": 10067, "cost": 0.00141441999999804, "total_cost": 0.00141441999999804}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737316419} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737316419} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737316425} +{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737316426} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737316426} +{"event": "message_send", "properties": {"main_model": "claude-3-5-haiku-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-haiku-20241022", "edit_format": "diff", "prompt_tokens": 10028, "completion_tokens": 55, "total_tokens": 10083, "cost": 0.010302999999999998, "total_cost": 0.010302999999999998}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737316431} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737316431} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737389467} +{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737389469} +{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737389473} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737389491} +{"event": "model warning", "properties": {"main_model": "deepseek/REDACTED", "weak_model": "deepseek/REDACTED", "editor_model": "deepseek/deepseek-chat"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737389492} +{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737389500} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737389500} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737389516} +{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737389517} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737389517} +{"event": "message_send", "properties": {"main_model": "deepseek/REDACTED", "weak_model": "deepseek/REDACTED", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 3656, "completion_tokens": 95, "total_tokens": 3751, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737389523} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737389523} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737389624} +{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737389626} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737389626} +{"event": "message_send", "properties": {"main_model": "deepseek/REDACTED", "weak_model": "deepseek/REDACTED", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 3572, "completion_tokens": 109, "total_tokens": 3681, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737389635} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737389635} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737390822} +{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737390824} +{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737390824} +{"event": "ai-comments file-add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737390865} +{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737390865} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737390865} +{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 7042, "completion_tokens": 335, "total_tokens": 7377, "cost": 0.00107968, "total_cost": 0.00107968}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737390876} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737390906} +{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 7484, "completion_tokens": 526, "total_tokens": 8010, "cost": 0.00119504, "total_cost": 0.00227472}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737390919} +{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737392442} +{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737392442} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737394710} +{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737394712} +{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737394725} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737394995} +{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737394997} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737394997} +{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 7557, "completion_tokens": 258, "total_tokens": 7815, "cost": 0.0011302199999980401, "total_cost": 0.0011302199999980401}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737395006} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737395006} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737395164} +{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737395166} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737395166} +{"event": "message_send", "properties": {"main_model": "o1", "weak_model": "gpt-4o-mini", "editor_model": "gpt-4o", "edit_format": "diff", "prompt_tokens": 2366, "completion_tokens": 19, "total_tokens": 2385, "cost": 0.03663, "total_cost": 0.03663}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737395169} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737395169} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737395174} +{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737395175} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737395175} +{"event": "message_send", "properties": {"main_model": "o1-preview", "weak_model": "gpt-4o-mini", "editor_model": "gpt-4o", "edit_format": "architect", "prompt_tokens": 138, "completion_tokens": 37, "total_tokens": 175, "cost": 0.00429, "total_cost": 0.00429}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737395182} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737395183} +{"event": "message_send", "properties": {"main_model": "gpt-4o", "weak_model": "gpt-4o-mini", "editor_model": "None", "edit_format": "editor-diff", "prompt_tokens": 1734, "completion_tokens": 41, "total_tokens": 1775, "cost": 0.004745, "total_cost": 0.009035000000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737395184} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737395184} diff --git a/aider/website/docs/faq.md b/aider/website/docs/faq.md index 53e3454ba..751adf404 100644 --- a/aider/website/docs/faq.md +++ b/aider/website/docs/faq.md @@ -249,12 +249,20 @@ tr:hover { background-color: #f5f5f5; } - - - - - + + + + + + + + +
Model NameTotal TokensPercent
deepseek/deepseek-chat1,332,43574.1%
claude-3-5-sonnet-20241022422,46123.5%
o125,3261.4%
gemini/gemini-exp-120610,0680.6%
mistral/codestral-latest8,1370.5%
deepseek/deepseek-chat1,126,98259.6%
claude-3-5-sonnet-20241022699,67637.0%
o127,7111.5%
claude-3-5-haiku-2024102210,0830.5%
gemini/gemini-exp-120610,0680.5%
mistral/codestral-latest8,1370.4%
deepseek/REDACTED7,4320.4%
gpt-4o1,7750.1%
o1-preview1750.0%
+ +{: .note :} +Some models show as REDACTED, because they are new or unpopular models. +Aider's analytics only records the names of "well known" LLMs. ## How are the "aider wrote xx% of code" stats computed? diff --git a/aider/website/docs/leaderboards/index.md b/aider/website/docs/leaderboards/index.md index 681d73d1c..b7b72b48b 100644 --- a/aider/website/docs/leaderboards/index.md +++ b/aider/website/docs/leaderboards/index.md @@ -121,6 +121,6 @@ mod_dates = [get_last_modified_date(file) for file in files] latest_mod_date = max(mod_dates) cog.out(f"{latest_mod_date.strftime('%B %d, %Y.')}") ]]]--> -January 13, 2025. +January 17, 2025.

diff --git a/aider/website/docs/more/infinite-output.md b/aider/website/docs/more/infinite-output.md index 06b61c5cd..94c4d0cdd 100644 --- a/aider/website/docs/more/infinite-output.md +++ b/aider/website/docs/more/infinite-output.md @@ -67,6 +67,7 @@ cog.out(model_list) - codestral/codestral-latest - deepseek/deepseek-chat - deepseek/deepseek-coder +- eu.anthropic.claude-3-5-haiku-20241022-v1:0 - eu.anthropic.claude-3-5-sonnet-20241022-v2:0 - mistral/codestral-2405 - mistral/codestral-latest From 2968087d3787281cf500a059d69aa8d9ebb950ca Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Mon, 20 Jan 2025 10:09:48 -0800 Subject: [PATCH 055/229] more deepseek config --- HISTORY.md | 5 ++++- aider/models.py | 16 ++++++++++++++++ aider/resources/model-metadata.json | 18 +++++++++++++++++- 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/HISTORY.md b/HISTORY.md index 045001b29..248825ccb 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -2,6 +2,9 @@ ### main branch +- Support for DeepSeek R1. + - Use shortcut: `--model r1` + - Also via OpenRouter: `--model openrouter/deepseek/deepseek-r1` - Added `--line-endings` for file writing, by Titusz Pan. - Added examples_as_sys_msg=True for GPT-4o models, improves benchmark scores. - Bumped all dependencies, to pick up litellm support for o1 system messages. @@ -10,7 +13,7 @@ ### Aider v0.71.1 - Fix permissions issue in Docker images. -- Added read-only file announcements to chat. +- Added read-only file announcements. - Bugfix: ASCII fallback for unicode errors. - Bugfix: integer indices for list slicing in repomap calculations. diff --git a/aider/models.py b/aider/models.py index e9354213e..a75d604ce 100644 --- a/aider/models.py +++ b/aider/models.py @@ -76,6 +76,7 @@ MODEL_ALIASES = { "3": "gpt-3.5-turbo", # Other models "deepseek": "deepseek/deepseek-chat", + "r1": "deepseek/deepseek-reasoner", "flash": "gemini/gemini-2.0-flash-exp", } @@ -622,6 +623,21 @@ MODEL_SETTINGS = [ use_repo_map=True, send_undo_reply=False, ), + ModelSettings( + "openrouter/deepseek/deepseek-r1", + "diff", + weak_model_name="openrouter/deepseek/deepseek-chat", + editor_model_name="openrouter/deepseek/deepseek-chat", + editor_edit_format="editor-diff", + use_repo_map=True, + examples_as_sys_msg=True, + use_temperature=False, + reminder="user", + caches_by_default=True, + extra_params={ + "max_tokens": 8192, + }, + ), ModelSettings( "deepseek/deepseek-reasoner", "diff", diff --git a/aider/resources/model-metadata.json b/aider/resources/model-metadata.json index d8ab09461..7c46f948a 100644 --- a/aider/resources/model-metadata.json +++ b/aider/resources/model-metadata.json @@ -1,7 +1,23 @@ { "deepseek-reasoner": { "max_tokens": 8192, - "max_input_tokens": 128000, + "max_input_tokens": 64000, + "max_output_tokens": 8192, + "input_cost_per_token": 0.00000055, + "input_cost_per_token_cache_hit": 0.00000014, + "cache_read_input_token_cost": 0.00000014, + "cache_creation_input_token_cost": 0.0, + "output_cost_per_token": 0.00000219, + "litellm_provider": "deepseek", + "mode": "chat", + //"supports_function_calling": true, + "supports_assistant_prefill": true, + //"supports_tool_choice": true, + "supports_prompt_caching": true + }, + "openrouter/deepseek/deepseek-r1": { + "max_tokens": 8192, + "max_input_tokens": 64000, "max_output_tokens": 8192, "input_cost_per_token": 0.00000055, "input_cost_per_token_cache_hit": 0.00000014, From 56506974757bc03c00bc29d1874df00bbf733286 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Mon, 20 Jan 2025 11:10:43 -0800 Subject: [PATCH 056/229] no turn errors, with upd_cur_msgs fix and summarizer disabled --- aider/coders/base_coder.py | 17 ++++++++++------- aider/coders/single_wholefile_func_coder.py | 2 +- aider/coders/wholefile_func_coder.py | 2 +- aider/sendchat.py | 5 ++--- 4 files changed, 14 insertions(+), 12 deletions(-) diff --git a/aider/coders/base_coder.py b/aider/coders/base_coder.py index 8e7814372..d746673d6 100755 --- a/aider/coders/base_coder.py +++ b/aider/coders/base_coder.py @@ -459,6 +459,7 @@ class Coder: self.summarizer_thread = None self.summarized_done_messages = [] + self.summarizing_messages = None if not self.done_messages and restore_chat_history: history_md = self.io.read_text(self.io.chat_history_file) @@ -930,6 +931,7 @@ class Coder: self.last_keyboard_interrupt = now def summarize_start(self): + return if not self.summarizer.too_big(self.done_messages): return @@ -942,8 +944,9 @@ class Coder: self.summarizer_thread.start() def summarize_worker(self): + self.summarizing_messages = list(self.done_messages) try: - self.summarized_done_messages = self.summarizer.summarize(self.done_messages) + self.summarized_done_messages = self.summarizer.summarize(self.summarizing_messages) except ValueError as err: self.io.tool_warning(err.args[0]) @@ -957,7 +960,9 @@ class Coder: self.summarizer_thread.join() self.summarizer_thread = None - self.done_messages = self.summarized_done_messages + if self.summarizing_messages == self.done_messages: + self.done_messages = self.summarized_done_messages + self.summarizing_messages = None self.summarized_done_messages = [] def move_back_cur_messages(self, message): @@ -1327,6 +1332,8 @@ class Coder: self.num_exhausted_context_windows += 1 return + self.add_assistant_reply_to_cur_messages() + if self.partial_response_function_call: args = self.parse_partial_args() if args: @@ -1359,8 +1366,6 @@ class Coder: edited = self.apply_updates() - self.update_cur_messages() - if edited: self.aider_edited_files.update(edited) saved_message = self.auto_commit(edited) @@ -1381,7 +1386,6 @@ class Coder: ok = self.io.confirm_ask("Attempt to fix lint errors?") if ok: self.reflected_message = lint_errors - self.update_cur_messages() return shared_output = self.run_shell_commands() @@ -1398,7 +1402,6 @@ class Coder: ok = self.io.confirm_ask("Attempt to fix test errors?") if ok: self.reflected_message = test_errors - self.update_cur_messages() return def reply_completed(self): @@ -1474,7 +1477,7 @@ class Coder: return res - def update_cur_messages(self): + def add_assistant_reply_to_cur_messages(self): if self.partial_response_content: self.cur_messages += [dict(role="assistant", content=self.partial_response_content)] if self.partial_response_function_call: diff --git a/aider/coders/single_wholefile_func_coder.py b/aider/coders/single_wholefile_func_coder.py index a10efdbb4..493581c46 100644 --- a/aider/coders/single_wholefile_func_coder.py +++ b/aider/coders/single_wholefile_func_coder.py @@ -38,7 +38,7 @@ class SingleWholeFileFunctionCoder(Coder): self.gpt_prompts = SingleWholeFileFunctionPrompts() super().__init__(*args, **kwargs) - def update_cur_messages(self, edited): + def add_assistant_reply_to_cur_messages(self, edited): if edited: self.cur_messages += [ dict(role="assistant", content=self.gpt_prompts.redacted_edit_message) diff --git a/aider/coders/wholefile_func_coder.py b/aider/coders/wholefile_func_coder.py index 987010ea7..3c4fbd3ca 100644 --- a/aider/coders/wholefile_func_coder.py +++ b/aider/coders/wholefile_func_coder.py @@ -49,7 +49,7 @@ class WholeFileFunctionCoder(Coder): self.gpt_prompts = WholeFileFunctionPrompts() super().__init__(*args, **kwargs) - def update_cur_messages(self, edited): + def add_assistant_reply_to_cur_messages(self, edited): if edited: self.cur_messages += [ dict(role="assistant", content=self.gpt_prompts.redacted_edit_message) diff --git a/aider/sendchat.py b/aider/sendchat.py index 410823405..0158c52a4 100644 --- a/aider/sendchat.py +++ b/aider/sendchat.py @@ -31,9 +31,8 @@ def sanity_check_messages(messages): continue if last_role and role == last_role: - print(format_messages(messages)) - # import sys ; sys.exit() - raise ValueError("Messages don't properly alternate user/assistant") + turns = format_messages(messages) + raise ValueError("Messages don't properly alternate user/assistant:\n\n" + turns) last_role = role last_non_system_role = role From 163e6f56df4c7c67fe22968b463064c6fba0411c Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Mon, 20 Jan 2025 11:26:19 -0800 Subject: [PATCH 057/229] re-enable summaries --- aider/coders/base_coder.py | 1 - aider/sendchat.py | 4 ++++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/aider/coders/base_coder.py b/aider/coders/base_coder.py index d746673d6..2153fe527 100755 --- a/aider/coders/base_coder.py +++ b/aider/coders/base_coder.py @@ -931,7 +931,6 @@ class Coder: self.last_keyboard_interrupt = now def summarize_start(self): - return if not self.summarizer.too_big(self.done_messages): return diff --git a/aider/sendchat.py b/aider/sendchat.py index 0158c52a4..bd45cc13d 100644 --- a/aider/sendchat.py +++ b/aider/sendchat.py @@ -49,7 +49,11 @@ def send_completion( temperature=0, extra_params=None, ): + # + # sanity_check_messages(messages) + # + # kwargs = dict( model=model_name, From f5fd6833e23eb1ae4618d64eb87af2f87309051d Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Mon, 20 Jan 2025 11:30:21 -0800 Subject: [PATCH 058/229] copy --- HISTORY.md | 4 ++- aider/website/HISTORY.md | 9 +++-- aider/website/assets/sample-analytics.jsonl | 16 ++++----- .../website/docs/config/adv-model-settings.md | 36 ++++++++++++++++++- aider/website/docs/config/model-aliases.md | 1 + aider/website/docs/faq.md | 6 ++-- aider/website/docs/leaderboards/index.md | 2 +- 7 files changed, 58 insertions(+), 16 deletions(-) diff --git a/HISTORY.md b/HISTORY.md index 248825ccb..c1333ceda 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -8,7 +8,9 @@ - Added `--line-endings` for file writing, by Titusz Pan. - Added examples_as_sys_msg=True for GPT-4o models, improves benchmark scores. - Bumped all dependencies, to pick up litellm support for o1 system messages. -- Aider wrote 70% of the code in this release. +- Bugfix for turn taking when reflecting lint/test errors. +- Improved message validation with better error reporting for malformed chat turns. +- Aider wrote 58% of the code in this release. ### Aider v0.71.1 diff --git a/aider/website/HISTORY.md b/aider/website/HISTORY.md index f8c402a78..03c678784 100644 --- a/aider/website/HISTORY.md +++ b/aider/website/HISTORY.md @@ -25,15 +25,20 @@ cog.out(text) ### main branch +- Support for DeepSeek R1. + - Use shortcut: `--model r1` + - Also via OpenRouter: `--model openrouter/deepseek/deepseek-r1` - Added `--line-endings` for file writing, by Titusz Pan. - Added examples_as_sys_msg=True for GPT-4o models, improves benchmark scores. - Bumped all dependencies, to pick up litellm support for o1 system messages. -- Aider wrote 70% of the code in this release. +- Bugfix for turn taking when reflecting lint/test errors. +- Improved message validation with better error reporting for malformed chat turns. +- Aider wrote 58% of the code in this release. ### Aider v0.71.1 - Fix permissions issue in Docker images. -- Added read-only file announcements to chat. +- Added read-only file announcements. - Bugfix: ASCII fallback for unicode errors. - Bugfix: integer indices for list slicing in repomap calculations. diff --git a/aider/website/assets/sample-analytics.jsonl b/aider/website/assets/sample-analytics.jsonl index ea41f20ab..e6d8a8856 100644 --- a/aider/website/assets/sample-analytics.jsonl +++ b/aider/website/assets/sample-analytics.jsonl @@ -1,11 +1,3 @@ -{"event": "message_send", "properties": {"main_model": "o1", "weak_model": "gpt-4o-mini", "editor_model": "gpt-4o", "edit_format": "diff", "prompt_tokens": 2409, "completion_tokens": 181, "total_tokens": 2590, "cost": 0.046995, "total_cost": 0.04733365999999804}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736544703} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736544709} -{"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736544711} -{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736544715} -{"event": "ai-comments file-add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736544760} -{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736544939} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736544945} -{"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736544946} {"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736544946} {"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736544957} {"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 4798, "completion_tokens": 130, "total_tokens": 4928, "cost": 0.0007081199999980401, "total_cost": 0.0007081199999980401}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736544963} @@ -998,3 +990,11 @@ {"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737395183} {"event": "message_send", "properties": {"main_model": "gpt-4o", "weak_model": "gpt-4o-mini", "editor_model": "None", "edit_format": "editor-diff", "prompt_tokens": 1734, "completion_tokens": 41, "total_tokens": 1775, "cost": 0.004745, "total_cost": 0.009035000000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737395184} {"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737395184} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737396361} +{"event": "gui session", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737396362} +{"event": "exit", "properties": {"reason": "GUI session ended"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737396362} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737401397} +{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737401399} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737401399} +{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 12552, "completion_tokens": 375, "total_tokens": 12927, "cost": 0.0018622800000000002, "total_cost": 0.0018622800000000002}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737401412} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737401412} diff --git a/aider/website/docs/config/adv-model-settings.md b/aider/website/docs/config/adv-model-settings.md index 2367713be..2099c3a99 100644 --- a/aider/website/docs/config/adv-model-settings.md +++ b/aider/website/docs/config/adv-model-settings.md @@ -1080,7 +1080,41 @@ cog.out("```\n") use_temperature: true weak_model_name: null - cache_control: false - caches_by_default: false + caches_by_default: true + edit_format: diff + editor_edit_format: editor-diff + editor_model_name: openrouter/deepseek/deepseek-chat + examples_as_sys_msg: true + extra_params: + max_tokens: 8192 + lazy: false + name: openrouter/deepseek/deepseek-r1 + reminder: user + send_undo_reply: false + streaming: true + use_repo_map: true + use_system_prompt: true + use_temperature: false + weak_model_name: openrouter/deepseek/deepseek-chat +- cache_control: false + caches_by_default: true + edit_format: diff + editor_edit_format: editor-diff + editor_model_name: deepseek/deepseek-chat + examples_as_sys_msg: true + extra_params: + max_tokens: 8192 + lazy: false + name: deepseek/deepseek-reasoner + reminder: user + send_undo_reply: false + streaming: true + use_repo_map: true + use_system_prompt: true + use_temperature: false + weak_model_name: deepseek/deepseek-chat +- cache_control: false + caches_by_default: true edit_format: diff editor_edit_format: null editor_model_name: null diff --git a/aider/website/docs/config/model-aliases.md b/aider/website/docs/config/model-aliases.md index b805dce57..ae32c80b1 100644 --- a/aider/website/docs/config/model-aliases.md +++ b/aider/website/docs/config/model-aliases.md @@ -59,6 +59,7 @@ for alias, model in sorted(MODEL_ALIASES.items()): - `flash`: gemini/gemini-2.0-flash-exp - `haiku`: claude-3-5-haiku-20241022 - `opus`: claude-3-opus-20240229 +- `r1`: deepseek/deepseek-reasoner - `sonnet`: claude-3-5-sonnet-20241022 diff --git a/aider/website/docs/faq.md b/aider/website/docs/faq.md index 751adf404..26d3291e1 100644 --- a/aider/website/docs/faq.md +++ b/aider/website/docs/faq.md @@ -249,9 +249,9 @@ tr:hover { background-color: #f5f5f5; } - - - + + + diff --git a/aider/website/docs/leaderboards/index.md b/aider/website/docs/leaderboards/index.md index b7b72b48b..4085d04c8 100644 --- a/aider/website/docs/leaderboards/index.md +++ b/aider/website/docs/leaderboards/index.md @@ -121,6 +121,6 @@ mod_dates = [get_last_modified_date(file) for file in files] latest_mod_date = max(mod_dates) cog.out(f"{latest_mod_date.strftime('%B %d, %Y.')}") ]]]--> -January 17, 2025. +January 20, 2025.

From 61ab5d16527a57d5a0c6b288ca543342d2835d48 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Mon, 20 Jan 2025 11:35:54 -0800 Subject: [PATCH 059/229] disable sanity check --- aider/sendchat.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aider/sendchat.py b/aider/sendchat.py index bd45cc13d..e04008252 100644 --- a/aider/sendchat.py +++ b/aider/sendchat.py @@ -51,7 +51,7 @@ def send_completion( ): # # - sanity_check_messages(messages) + # sanity_check_messages(messages) # # From 32d025bcf2f43abd4033cbeda390b77d0fc9fbca Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Mon, 20 Jan 2025 11:37:09 -0800 Subject: [PATCH 060/229] r1 leaderboard --- aider/website/_data/polyglot_leaderboard.yml | 28 +++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/aider/website/_data/polyglot_leaderboard.yml b/aider/website/_data/polyglot_leaderboard.yml index eb2b97b19..c4de84159 100644 --- a/aider/website/_data/polyglot_leaderboard.yml +++ b/aider/website/_data/polyglot_leaderboard.yml @@ -386,4 +386,30 @@ date: 2025-01-13 versions: 0.71.2.dev seconds_per_case: 9.3 - total_cost: 1.9834 \ No newline at end of file + total_cost: 1.9834 + +- dirname: 2025-01-20-19-11-38--ds-turns-upd-cur-msgs-fix-with-summarizer + test_cases: 225 + model: DeepSeek R1 + edit_format: diff + commit_hash: 5650697-dirty + pass_rate_1: 26.7 + pass_rate_2: 56.9 + pass_num_1: 60 + pass_num_2: 128 + percent_cases_well_formed: 96.9 + error_outputs: 8 + num_malformed_responses: 7 + num_with_malformed_responses: 7 + user_asks: 15 + lazy_comments: 0 + syntax_errors: 0 + indentation_errors: 0 + exhausted_context_windows: 1 + test_timeouts: 5 + total_tests: 225 + command: aider --model deepseek/deepseek-reasoner + date: 2025-01-20 + versions: 0.71.2.dev + seconds_per_case: 113.7 + total_cost: 5.4193 \ No newline at end of file From 48f80b947b48555ffcd1f9ddfeac9230762c8c47 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Mon, 20 Jan 2025 11:43:38 -0800 Subject: [PATCH 061/229] copy --- HISTORY.md | 4 +++- aider/website/HISTORY.md | 4 +++- aider/website/assets/sample-analytics.jsonl | 16 ++++++++-------- aider/website/docs/faq.md | 4 ++-- aider/website/docs/languages.md | 2 +- 5 files changed, 17 insertions(+), 13 deletions(-) diff --git a/HISTORY.md b/HISTORY.md index c1333ceda..d2e87904b 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -5,12 +5,14 @@ - Support for DeepSeek R1. - Use shortcut: `--model r1` - Also via OpenRouter: `--model openrouter/deepseek/deepseek-r1` +- Added Kotlin syntax support to repo map, by Paul Walker. - Added `--line-endings` for file writing, by Titusz Pan. - Added examples_as_sys_msg=True for GPT-4o models, improves benchmark scores. - Bumped all dependencies, to pick up litellm support for o1 system messages. - Bugfix for turn taking when reflecting lint/test errors. - Improved message validation with better error reporting for malformed chat turns. -- Aider wrote 58% of the code in this release. +- Disabled summarization by default to improve chat stability. +- Aider wrote 52% of the code in this release. ### Aider v0.71.1 diff --git a/aider/website/HISTORY.md b/aider/website/HISTORY.md index 03c678784..7d3e68e30 100644 --- a/aider/website/HISTORY.md +++ b/aider/website/HISTORY.md @@ -28,12 +28,14 @@ cog.out(text) - Support for DeepSeek R1. - Use shortcut: `--model r1` - Also via OpenRouter: `--model openrouter/deepseek/deepseek-r1` +- Added Kotlin syntax support to repo map, by Paul Walker. - Added `--line-endings` for file writing, by Titusz Pan. - Added examples_as_sys_msg=True for GPT-4o models, improves benchmark scores. - Bumped all dependencies, to pick up litellm support for o1 system messages. - Bugfix for turn taking when reflecting lint/test errors. - Improved message validation with better error reporting for malformed chat turns. -- Aider wrote 58% of the code in this release. +- Disabled summarization by default to improve chat stability. +- Aider wrote 52% of the code in this release. ### Aider v0.71.1 diff --git a/aider/website/assets/sample-analytics.jsonl b/aider/website/assets/sample-analytics.jsonl index e6d8a8856..47aaf64aa 100644 --- a/aider/website/assets/sample-analytics.jsonl +++ b/aider/website/assets/sample-analytics.jsonl @@ -1,11 +1,3 @@ -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736544946} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736544957} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 4798, "completion_tokens": 130, "total_tokens": 4928, "cost": 0.0007081199999980401, "total_cost": 0.0007081199999980401}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736544963} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736544969} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 24424, "completion_tokens": 466, "total_tokens": 24890, "cost": 0.0035498399999980405, "total_cost": 0.00425795999999608}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736544985} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736545010} -{"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736545011} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736545011} {"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 3597, "completion_tokens": 85, "total_tokens": 3682, "cost": 0.0005273799999980401, "total_cost": 0.0005273799999980401}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736545016} {"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736545016} {"event": "command_diff", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736545021} @@ -998,3 +990,11 @@ {"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737401399} {"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 12552, "completion_tokens": 375, "total_tokens": 12927, "cost": 0.0018622800000000002, "total_cost": 0.0018622800000000002}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737401412} {"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737401412} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737402071} +{"event": "gui session", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737402071} +{"event": "exit", "properties": {"reason": "GUI session ended"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737402071} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737402163} +{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737402165} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737402166} +{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 13089, "completion_tokens": 422, "total_tokens": 13511, "cost": 0.0019506200000000001, "total_cost": 0.0019506200000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737402181} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737402181} diff --git a/aider/website/docs/faq.md b/aider/website/docs/faq.md index 26d3291e1..50a0ce4e2 100644 --- a/aider/website/docs/faq.md +++ b/aider/website/docs/faq.md @@ -249,8 +249,8 @@ tr:hover { background-color: #f5f5f5; }
Model NameTotal TokensPercent
deepseek/deepseek-chat1,126,98259.6%
claude-3-5-sonnet-20241022699,67637.0%
o127,7111.5%
deepseek/deepseek-chat1,139,90959.9%
claude-3-5-sonnet-20241022699,67636.8%
o125,1211.3%
claude-3-5-haiku-2024102210,0830.5%
gemini/gemini-exp-120610,0680.5%
mistral/codestral-latest8,1370.4%
- - + + diff --git a/aider/website/docs/languages.md b/aider/website/docs/languages.md index ac91ab537..d9e8f842c 100644 --- a/aider/website/docs/languages.md +++ b/aider/website/docs/languages.md @@ -81,7 +81,7 @@ cog.out(get_supported_languages_md()) | jsdoc | .jsdoc | | ✓ | | json | .json | | ✓ | | julia | .jl | | ✓ | -| kotlin | .kt | | ✓ | +| kotlin | .kt | ✓ | ✓ | | lua | .lua | | ✓ | | make | .mk | | ✓ | | objc | .m | | ✓ | From 1c3e0ba6565ae84588a21a4a2070a52d8e5960ef Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Mon, 20 Jan 2025 11:48:46 -0800 Subject: [PATCH 062/229] version bump to 0.72.0 --- aider/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aider/__init__.py b/aider/__init__.py index daea92549..471498249 100644 --- a/aider/__init__.py +++ b/aider/__init__.py @@ -1,6 +1,6 @@ from packaging import version -__version__ = "0.71.2.dev" +__version__ = "0.72.0" safe_version = __version__ try: From 03652a003063a56ac620d3c02ae10428f2726f93 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Mon, 20 Jan 2025 11:51:13 -0800 Subject: [PATCH 063/229] set version to 0.72.1.dev --- aider/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aider/__init__.py b/aider/__init__.py index 471498249..c5d055108 100644 --- a/aider/__init__.py +++ b/aider/__init__.py @@ -1,6 +1,6 @@ from packaging import version -__version__ = "0.72.0" +__version__ = "0.72.1.dev" safe_version = __version__ try: From 83f08cffeefe390cfb3397bea57fe8b8b9643c27 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Mon, 20 Jan 2025 11:51:32 -0800 Subject: [PATCH 064/229] copy --- HISTORY.md | 2 +- aider/website/HISTORY.md | 2 +- aider/website/assets/sample-analytics.jsonl | 12 ++++++------ aider/website/docs/faq.md | 4 ++-- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/HISTORY.md b/HISTORY.md index d2e87904b..6a19dca02 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,6 +1,6 @@ # Release history -### main branch +### v0.72.0 - Support for DeepSeek R1. - Use shortcut: `--model r1` diff --git a/aider/website/HISTORY.md b/aider/website/HISTORY.md index 7d3e68e30..df8522d47 100644 --- a/aider/website/HISTORY.md +++ b/aider/website/HISTORY.md @@ -23,7 +23,7 @@ cog.out(text) ]]]--> -### main branch +### v0.72.0 - Support for DeepSeek R1. - Use shortcut: `--model r1` diff --git a/aider/website/assets/sample-analytics.jsonl b/aider/website/assets/sample-analytics.jsonl index 47aaf64aa..cef862a38 100644 --- a/aider/website/assets/sample-analytics.jsonl +++ b/aider/website/assets/sample-analytics.jsonl @@ -1,9 +1,3 @@ -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 3597, "completion_tokens": 85, "total_tokens": 3682, "cost": 0.0005273799999980401, "total_cost": 0.0005273799999980401}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736545016} -{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736545016} -{"event": "command_diff", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736545021} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736545052} -{"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736545054} -{"event": "command_tokens", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736545054} {"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736545054} {"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736545065} {"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736545067} @@ -998,3 +992,9 @@ {"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737402166} {"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 13089, "completion_tokens": 422, "total_tokens": 13511, "cost": 0.0019506200000000001, "total_cost": 0.0019506200000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737402181} {"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737402181} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737402282} +{"event": "gui session", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737402282} +{"event": "exit", "properties": {"reason": "GUI session ended"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737402282} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737402651} +{"event": "gui session", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737402652} +{"event": "exit", "properties": {"reason": "GUI session ended"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737402652} diff --git a/aider/website/docs/faq.md b/aider/website/docs/faq.md index 50a0ce4e2..0774738cb 100644 --- a/aider/website/docs/faq.md +++ b/aider/website/docs/faq.md @@ -249,8 +249,8 @@ tr:hover { background-color: #f5f5f5; }
Model NameTotal TokensPercent
deepseek/deepseek-chat1,139,90959.9%
claude-3-5-sonnet-20241022699,67636.8%
deepseek/deepseek-chat1,123,60259.6%
claude-3-5-sonnet-20241022699,67637.1%
o125,1211.3%
claude-3-5-haiku-2024102210,0830.5%
gemini/gemini-exp-120610,0680.5%
- - + + From b0fa646de9f3e6b2cf2b1c335233c68af43669de Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Mon, 20 Jan 2025 14:19:30 -0800 Subject: [PATCH 065/229] fix litellm_provider --- aider/resources/model-metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aider/resources/model-metadata.json b/aider/resources/model-metadata.json index 7c46f948a..a2e2812a2 100644 --- a/aider/resources/model-metadata.json +++ b/aider/resources/model-metadata.json @@ -24,7 +24,7 @@ "cache_read_input_token_cost": 0.00000014, "cache_creation_input_token_cost": 0.0, "output_cost_per_token": 0.00000219, - "litellm_provider": "deepseek", + "litellm_provider": "openrouter", "mode": "chat", //"supports_function_calling": true, "supports_assistant_prefill": true, From c5e2d80fc0972ade1fa1daa1bdd577499ec5022e Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Mon, 20 Jan 2025 14:20:56 -0800 Subject: [PATCH 066/229] blame --- HISTORY.md | 4 + aider/website/_data/blame.yml | 142 ++++++++++++++++++++++++++++++++++ 2 files changed, 146 insertions(+) diff --git a/HISTORY.md b/HISTORY.md index 6a19dca02..f9979cad7 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,5 +1,9 @@ # Release history +### v0.71.1 + +- Fix model metadata for `openrouter/deepseek/deepseek-r1` + ### v0.72.0 - Support for DeepSeek R1. diff --git a/aider/website/_data/blame.yml b/aider/website/_data/blame.yml index a807dcb89..42345cf76 100644 --- a/aider/website/_data/blame.yml +++ b/aider/website/_data/blame.yml @@ -3545,3 +3545,145 @@ mdk: 34 start_tag: v0.69.0 total_lines: 1179 +- aider_percentage: 60.36 + aider_total: 236 + end_date: '2025-01-10' + end_tag: v0.71.0 + file_counts: + aider/__init__.py: + Paul Gauthier: 1 + aider/args.py: + Paul Gauthier: 2 + aider/coders/base_coder.py: + Paul Gauthier: 7 + Paul Gauthier (aider): 13 + aider/commands.py: + Paul Gauthier: 1 + Paul Gauthier (aider): 22 + aider/io.py: + Paul Gauthier: 3 + Paul Gauthier (aider): 16 + aider/linter.py: + Aaron Weisberg: 5 + aider/main.py: + Paul Gauthier: 7 + Paul Gauthier (aider): 13 + apaz-cli: 18 + aider/mdstream.py: + Paul Gauthier: 38 + Paul Gauthier (aider): 58 + aider/models.py: + Paul Gauthier: 11 + Paul Gauthier (aider): 2 + aider/repo.py: + Krazer: 10 + Paul Gauthier: 5 + aider/run_cmd.py: + Aaron Weisberg: 2 + aider/utils.py: + Paul Gauthier: 9 + aider/voice.py: + Paul Gauthier: 11 + Paul Gauthier (aider): 13 + aider/watch.py: + Paul Gauthier: 1 + benchmark/Dockerfile: + Josh Vera: 1 + Paul Maunders: 12 + benchmark/benchmark.py: + Nimesh Ghelani: 1 + Paul Gauthier: 6 + Paul Gauthier (aider): 30 + benchmark/problem_stats.py: + Paul Gauthier (aider): 5 + docker/Dockerfile: + Paul Gauthier (aider): 32 + scripts/update-history.py: + Paul Gauthier (aider): 1 + tests/basic/test_commands.py: + Paul Gauthier: 2 + tests/basic/test_io.py: + Paul Gauthier (aider): 6 + tests/basic/test_linter.py: + Aaron Weisberg: 2 + tests/basic/test_models.py: + Paul Gauthier (aider): 25 + grand_total: + Aaron Weisberg: 9 + Josh Vera: 1 + Krazer: 10 + Nimesh Ghelani: 1 + Paul Gauthier: 104 + Paul Gauthier (aider): 236 + Paul Maunders: 12 + apaz-cli: 18 + start_tag: v0.70.0 + total_lines: 391 +- aider_percentage: 51.69 + aider_total: 138 + end_date: '2025-01-20' + end_tag: v0.72.0 + file_counts: + .github/workflows/docker-build-test.yml: + Paul Gauthier (aider): 38 + .github/workflows/pages.yml: + Paul Gauthier: 3 + Paul Gauthier (aider): 1 + .github/workflows/ubuntu-tests.yml: + Paul Gauthier (aider): 8 + .github/workflows/windows-tests.yml: + Paul Gauthier (aider): 8 + aider/__init__.py: + Paul Gauthier: 1 + aider/args.py: + Titusz Pan: 6 + aider/coders/base_coder.py: + Paul Gauthier: 11 + aider/coders/single_wholefile_func_coder.py: + Paul Gauthier: 1 + aider/coders/wholefile_func_coder.py: + Paul Gauthier: 1 + aider/commands.py: + Paul Gauthier: 3 + aider/history.py: + Paul Gauthier: 7 + aider/io.py: + Paul Gauthier (aider): 14 + Titusz Pan: 2 + aider/main.py: + Titusz Pan: 1 + aider/models.py: + Paul Gauthier: 16 + aider/queries/tree-sitter-kotlin-tags.scm: + Paul Walker: 27 + aider/repomap.py: + Paul Gauthier (aider): 2 + aider/sendchat.py: + Paul Gauthier: 9 + Paul Gauthier (aider): 22 + aider/utils.py: + Paul Gauthier: 1 + aider/website/docs/leaderboards/index.md: + Paul Gauthier: 2 + benchmark/benchmark.py: + Paul Gauthier: 9 + benchmark/rsync.sh: + Paul Gauthier: 21 + docker/Dockerfile: + Paul Gauthier: 2 + Paul Gauthier (aider): 6 + scripts/my_models.py: + Paul Gauthier: 3 + scripts/update-docs.sh: + Paul Gauthier: 2 + tests/basic/test_io.py: + Paul Gauthier (aider): 39 + tests/basic/test_repomap.py: + Paul Walker: 1 + grand_total: + Paul Gauthier: 92 + Paul Gauthier (aider): 138 + Paul Walker: 28 + Titusz Pan: 9 + start_tag: v0.71.0 + total_lines: 267 From 7e155dc87b1b93bd22146591ce684a5c9f1dabb8 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Mon, 20 Jan 2025 14:21:05 -0800 Subject: [PATCH 067/229] copy --- aider/website/HISTORY.md | 4 ++++ aider/website/assets/sample-analytics.jsonl | 10 +++++----- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/aider/website/HISTORY.md b/aider/website/HISTORY.md index df8522d47..008d96a66 100644 --- a/aider/website/HISTORY.md +++ b/aider/website/HISTORY.md @@ -23,6 +23,10 @@ cog.out(text) ]]]--> +### v0.71.1 + +- Fix model metadata for `openrouter/deepseek/deepseek-r1` + ### v0.72.0 - Support for DeepSeek R1. diff --git a/aider/website/assets/sample-analytics.jsonl b/aider/website/assets/sample-analytics.jsonl index cef862a38..34d1357eb 100644 --- a/aider/website/assets/sample-analytics.jsonl +++ b/aider/website/assets/sample-analytics.jsonl @@ -1,8 +1,3 @@ -{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736545054} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736545065} -{"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736545067} -{"event": "command_tokens", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736545067} -{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736545067} {"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736545090} {"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736545092} {"event": "command_tokens", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736545092} @@ -998,3 +993,8 @@ {"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737402651} {"event": "gui session", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737402652} {"event": "exit", "properties": {"reason": "GUI session ended"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737402652} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737411600} +{"event": "repo", "properties": {"num_files": 426}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737411602} +{"event": "cli session", "properties": {"main_model": "openrouter/REDACTED", "weak_model": "openrouter/deepseek/deepseek-chat", "editor_model": "openrouter/deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737411602} +{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737411603} +{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737411603} From 9ced96a1c921353d0a0efabee1e9a486bb533b6a Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Mon, 20 Jan 2025 14:23:00 -0800 Subject: [PATCH 068/229] copy --- HISTORY.md | 2 +- aider/website/HISTORY.md | 2 +- aider/website/assets/sample-analytics.jsonl | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/HISTORY.md b/HISTORY.md index f9979cad7..8899d89f0 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,6 +1,6 @@ # Release history -### v0.71.1 +### v0.72.1 - Fix model metadata for `openrouter/deepseek/deepseek-r1` diff --git a/aider/website/HISTORY.md b/aider/website/HISTORY.md index 008d96a66..328ecf039 100644 --- a/aider/website/HISTORY.md +++ b/aider/website/HISTORY.md @@ -23,7 +23,7 @@ cog.out(text) ]]]--> -### v0.71.1 +### v0.72.1 - Fix model metadata for `openrouter/deepseek/deepseek-r1` diff --git a/aider/website/assets/sample-analytics.jsonl b/aider/website/assets/sample-analytics.jsonl index 34d1357eb..0cd2703c0 100644 --- a/aider/website/assets/sample-analytics.jsonl +++ b/aider/website/assets/sample-analytics.jsonl @@ -1,6 +1,3 @@ -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736545090} -{"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736545092} -{"event": "command_tokens", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736545092} {"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736545093} {"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736545111} {"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736545113} @@ -998,3 +995,6 @@ {"event": "cli session", "properties": {"main_model": "openrouter/REDACTED", "weak_model": "openrouter/deepseek/deepseek-chat", "editor_model": "openrouter/deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737411602} {"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737411603} {"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737411603} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737411741} +{"event": "gui session", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737411741} +{"event": "exit", "properties": {"reason": "GUI session ended"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737411741} From adb951426a1a91ef8c039c70b72120b440e94257 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Mon, 20 Jan 2025 14:23:06 -0800 Subject: [PATCH 069/229] version bump to 0.72.1 --- aider/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aider/__init__.py b/aider/__init__.py index c5d055108..952d9366f 100644 --- a/aider/__init__.py +++ b/aider/__init__.py @@ -1,6 +1,6 @@ from packaging import version -__version__ = "0.72.1.dev" +__version__ = "0.72.1" safe_version = __version__ try: From 8b963ed63c244e3c109335d35b52cbd4466bb96c Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Mon, 20 Jan 2025 14:24:39 -0800 Subject: [PATCH 070/229] set version to 0.72.2.dev --- aider/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aider/__init__.py b/aider/__init__.py index 952d9366f..1e6077bb3 100644 --- a/aider/__init__.py +++ b/aider/__init__.py @@ -1,6 +1,6 @@ from packaging import version -__version__ = "0.72.1" +__version__ = "0.72.2.dev" safe_version = __version__ try: From 2873f6c1935fe6b673e0b81dae57e9098f0c38ea Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Mon, 20 Jan 2025 14:25:36 -0800 Subject: [PATCH 071/229] copy --- HISTORY.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/HISTORY.md b/HISTORY.md index 8899d89f0..ec1678318 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -14,8 +14,6 @@ - Added examples_as_sys_msg=True for GPT-4o models, improves benchmark scores. - Bumped all dependencies, to pick up litellm support for o1 system messages. - Bugfix for turn taking when reflecting lint/test errors. -- Improved message validation with better error reporting for malformed chat turns. -- Disabled summarization by default to improve chat stability. - Aider wrote 52% of the code in this release. ### Aider v0.71.1 From cfdca6a8946e578652a8850fdcb05f83d08ff050 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Mon, 20 Jan 2025 17:28:54 -0800 Subject: [PATCH 072/229] copy --- HISTORY.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/HISTORY.md b/HISTORY.md index ec1678318..1e41ba501 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,10 +1,10 @@ # Release history -### v0.72.1 +### Aider v0.72.1 - Fix model metadata for `openrouter/deepseek/deepseek-r1` -### v0.72.0 +### Aider v0.72.0 - Support for DeepSeek R1. - Use shortcut: `--model r1` From 06fa0c17a4ff11505e163c120fa4539f94521155 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Mon, 20 Jan 2025 17:35:40 -0800 Subject: [PATCH 073/229] docs: Add usage documentation for non-code interactions --- aider/website/docs/usage/not-code.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 aider/website/docs/usage/not-code.md diff --git a/aider/website/docs/usage/not-code.md b/aider/website/docs/usage/not-code.md new file mode 100644 index 000000000..e69de29bb From 29a2db65525a930833c4933487b2c198656b1ab0 Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Mon, 20 Jan 2025 17:35:42 -0800 Subject: [PATCH 074/229] docs: add examples for editing non-code files with aider --- aider/website/docs/usage/not-code.md | 177 +++++++++++++++++++++++++++ 1 file changed, 177 insertions(+) diff --git a/aider/website/docs/usage/not-code.md b/aider/website/docs/usage/not-code.md index e69de29bb..b24610f7d 100644 --- a/aider/website/docs/usage/not-code.md +++ b/aider/website/docs/usage/not-code.md @@ -0,0 +1,177 @@ +# Editing Configuration and Text Files + +Aider isn't just for code! Here are practical examples of modifying common config/text files: + +## Shell Configuration +```bash +$ aider .bashrc + +Added .bashrc to the chat. +──────────────────────────────────────────────────────────────── +.bashrc +> Add an alias 'll' that runs 'ls -alh' and update PATH to include ~/.local/bin + ++ alias ll='ls -alh' ++ export PATH="$HOME/.local/bin:$PATH" +``` + +## SSH Configurations +```bash +$ aider ~/.ssh/config + +Added config to the chat. +──────────────────────────────────────────────────────────────── +config +> Create a Host entry 'my-server' using bastion.example.com as JumpHost + ++ Host my-server ++ HostName 192.168.1.100 ++ User deploy ++ Port 2222 ++ IdentityFile ~/.ssh/deploy_key ++ ProxyJump bastion.example.com +``` + +## Docker Setup +```bash +$ aider Dockerfile docker-compose.yml + +Added Dockerfile and docker-compose.yml to the chat. +──────────────────────────────────────────────────────────────── +Dockerfile +> Set non-root user and enable healthchecks + ++ USER appuser ++ HEALTHCHECK --interval=30s --timeout=3s \ ++ CMD curl -f http://localhost:8000/health || exit 1 + +docker-compose.yml +> Expose port 5432 and add volume for postgres data + + services: + postgres: + image: postgres:15 ++ ports: ++ - "5432:5432" ++ volumes: ++ - pgdata:/var/lib/postgresql/data +``` + +## Git Configuration +```bash +$ aider .gitconfig + +Added .gitconfig to the chat. +──────────────────────────────────────────────────────────────── +.gitconfig +> Set default push behavior to current branch and enable color UI + ++ [push] ++ default = current ++ [color] ++ ui = auto +``` + +## System Configuration +```bash +$ aider /etc/hosts # May need sudo + +Added hosts to the chat. +──────────────────────────────────────────────────────────────── +hosts +> Block tracking domains by pointing them to 127.0.0.1 + ++ 127.0.0.1 ads.example.com ++ 127.0.0.1 track.analytics.co +``` + +## Cron Jobs +```bash +$ aider mycron + +Added mycron to the chat. +──────────────────────────────────────────────────────────────── +mycron +> Add daily backup at 2am and weekly log rotation + ++ 0 2 * * * /usr/local/bin/backup --incremental ++ 0 3 * * 6 /usr/sbin/logrotate /etc/logrotate.conf +``` + +## Editor Configs +```bash +$ aider .vimrc + +Added .vimrc to the chat. +──────────────────────────────────────────────────────────────── +.vimrc +> Enable line numbers and set 4-space tabs for Python + ++ set number ++ autocmd FileType python set tabstop=4 shiftwidth=4 expandtab +``` + +## Application Configuration +```bash +$ aider settings.json + +Added settings.json to the chat. +──────────────────────────────────────────────────────────────── +settings.json (VSCode) +> Enable auto-format on save and set default formatter + ++ "editor.formatOnSave": true, ++ "editor.defaultFormatter": "esbenp.prettier-vscode" +``` + +## Environment Files +```bash +$ aider .env + +Added .env to the chat. +──────────────────────────────────────────────────────────────── +.env +> Configure database connection with SSL + ++ DB_HOST=db.example.com ++ DB_PORT=5432 ++ DB_SSL=true +``` + +## Markdown Documentation +```bash +$ aider README.md + +Added README.md to the chat. +──────────────────────────────────────────────────────────────── +README.md +> Add installation section with brew and pip options + ++ ## Installation ++ ```bash ++ # Homebrew ++ brew install aider ++ ++ # PyPI ++ pipx install aider-chat ++ ``` +``` + +## XML Configuration +```bash +$ aider pom.xml + +Added pom.xml to the chat. +──────────────────────────────────────────────────────────────── +pom.xml +> Add JUnit 5 dependency with test scope + ++ ++ org.junit.jupiter ++ junit-jupiter-api ++ 5.9.2 ++ test ++ +``` + +> **Note**: Aider works with any text-based format. For system files requiring elevated privileges, use `sudo aider` as needed. From 4262fa863739a47114e447fd06947d2773e34003 Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Mon, 20 Jan 2025 17:39:05 -0800 Subject: [PATCH 075/229] docs: add Jekyll front matter to not-code.md --- aider/website/docs/usage/not-code.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/aider/website/docs/usage/not-code.md b/aider/website/docs/usage/not-code.md index b24610f7d..caebb6675 100644 --- a/aider/website/docs/usage/not-code.md +++ b/aider/website/docs/usage/not-code.md @@ -1,3 +1,9 @@ +--- +parent: Usage +nav_order: 901 +description: Edit configuration files, documentation, and other text-based formats. +--- + # Editing Configuration and Text Files Aider isn't just for code! Here are practical examples of modifying common config/text files: From 0884dd88d6ad184e82ae29636ffeb60285216ca0 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Mon, 20 Jan 2025 17:44:17 -0800 Subject: [PATCH 076/229] docs: Update usage documentation for config & text files --- aider/website/docs/usage/not-code.md | 20 ++++---------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/aider/website/docs/usage/not-code.md b/aider/website/docs/usage/not-code.md index caebb6675..5abce95ce 100644 --- a/aider/website/docs/usage/not-code.md +++ b/aider/website/docs/usage/not-code.md @@ -4,7 +4,7 @@ nav_order: 901 description: Edit configuration files, documentation, and other text-based formats. --- -# Editing Configuration and Text Files +# Editing config & text files Aider isn't just for code! Here are practical examples of modifying common config/text files: @@ -91,18 +91,6 @@ hosts + 127.0.0.1 track.analytics.co ``` -## Cron Jobs -```bash -$ aider mycron - -Added mycron to the chat. -──────────────────────────────────────────────────────────────── -mycron -> Add daily backup at 2am and weekly log rotation - -+ 0 2 * * * /usr/local/bin/backup --incremental -+ 0 3 * * 6 /usr/sbin/logrotate /etc/logrotate.conf -``` ## Editor Configs ```bash @@ -156,10 +144,10 @@ README.md + ## Installation + ```bash + # Homebrew -+ brew install aider ++ brew install cool-app-10k + + # PyPI -+ pipx install aider-chat ++ pipx install cool-app-10k + ``` ``` @@ -180,4 +168,4 @@ pom.xml + ``` -> **Note**: Aider works with any text-based format. For system files requiring elevated privileges, use `sudo aider` as needed. + From 843720a671a21463bbeee599635de817b8e50376 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Mon, 20 Jan 2025 17:44:36 -0800 Subject: [PATCH 077/229] copy --- aider/website/HISTORY.md | 6 +-- aider/website/assets/sample-analytics.jsonl | 50 ++++++++++----------- aider/website/docs/faq.md | 6 +-- 3 files changed, 30 insertions(+), 32 deletions(-) diff --git a/aider/website/HISTORY.md b/aider/website/HISTORY.md index 328ecf039..560a7079d 100644 --- a/aider/website/HISTORY.md +++ b/aider/website/HISTORY.md @@ -23,11 +23,11 @@ cog.out(text) ]]]--> -### v0.72.1 +### Aider v0.72.1 - Fix model metadata for `openrouter/deepseek/deepseek-r1` -### v0.72.0 +### Aider v0.72.0 - Support for DeepSeek R1. - Use shortcut: `--model r1` @@ -37,8 +37,6 @@ cog.out(text) - Added examples_as_sys_msg=True for GPT-4o models, improves benchmark scores. - Bumped all dependencies, to pick up litellm support for o1 system messages. - Bugfix for turn taking when reflecting lint/test errors. -- Improved message validation with better error reporting for malformed chat turns. -- Disabled summarization by default to improve chat stability. - Aider wrote 52% of the code in this release. ### Aider v0.71.1 diff --git a/aider/website/assets/sample-analytics.jsonl b/aider/website/assets/sample-analytics.jsonl index 0cd2703c0..a48b3a521 100644 --- a/aider/website/assets/sample-analytics.jsonl +++ b/aider/website/assets/sample-analytics.jsonl @@ -1,28 +1,3 @@ -{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736545093} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736545111} -{"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736545113} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736545113} -{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736545118} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736545121} -{"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736545123} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736545123} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 4713, "completion_tokens": 128, "total_tokens": 4841, "cost": 0.00069565999999804, "total_cost": 0.00069565999999804}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736545128} -{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736545128} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736545148} -{"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736545149} -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736545149} -{"event": "command_tokens", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736545154} -{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736545156} -{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736545156} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736545166} -{"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736545167} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736545167} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 4573, "completion_tokens": 136, "total_tokens": 4709, "cost": 0.00067829999999804, "total_cost": 0.00067829999999804}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736545173} -{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736545173} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736545218} -{"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736545220} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736545220} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 4580, "completion_tokens": 52, "total_tokens": 4632, "cost": 0.0006557599999980401, "total_cost": 0.0006557599999980401}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736545224} {"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736545224} {"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546050} {"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546052} @@ -998,3 +973,28 @@ {"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737411741} {"event": "gui session", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737411741} {"event": "exit", "properties": {"reason": "GUI session ended"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737411741} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737411858} +{"event": "gui session", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737411858} +{"event": "exit", "properties": {"reason": "GUI session ended"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737411858} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737422948} +{"event": "repo", "properties": {"num_files": 426}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737422951} +{"event": "cli session", "properties": {"main_model": "deepseek/REDACTED", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737422951} +{"event": "command_read-only", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737422981} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737422984} +{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737422992} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737422993} +{"event": "message_send", "properties": {"main_model": "deepseek/REDACTED", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "ask", "prompt_tokens": 4864, "completion_tokens": 703, "total_tokens": 5567, "cost": 0.00421477, "total_cost": 0.00421477}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737423010} +{"event": "command_editor", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737423094} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737423296} +{"event": "message_send", "properties": {"main_model": "deepseek/REDACTED", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "ask", "prompt_tokens": 5714, "completion_tokens": 1089, "total_tokens": 6803, "cost": 0.0055276100000000005, "total_cost": 0.00974238}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737423315} +{"event": "command_code", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737423319} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737423319} +{"event": "message_send", "properties": {"main_model": "deepseek/REDACTED", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 9191, "completion_tokens": 1051, "total_tokens": 10242, "cost": 0.0073567400000000005, "total_cost": 0.017099120000000002}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737423338} +{"event": "command_code", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737423533} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737423533} +{"event": "message_send", "properties": {"main_model": "deepseek/REDACTED", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 11198, "completion_tokens": 128, "total_tokens": 11326, "cost": 0.00643922, "total_cost": 0.02353834}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737423544} +{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737423847} +{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737423847} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737423852} +{"event": "repo", "properties": {"num_files": 427}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737423855} +{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737423857} diff --git a/aider/website/docs/faq.md b/aider/website/docs/faq.md index 0774738cb..bc9c89909 100644 --- a/aider/website/docs/faq.md +++ b/aider/website/docs/faq.md @@ -249,13 +249,13 @@ tr:hover { background-color: #f5f5f5; }
Model NameTotal TokensPercent
deepseek/deepseek-chat1,123,60259.6%
claude-3-5-sonnet-20241022699,67637.1%
deepseek/deepseek-chat1,119,92059.5%
claude-3-5-sonnet-20241022699,67637.2%
o125,1211.3%
claude-3-5-haiku-2024102210,0830.5%
gemini/gemini-exp-120610,0680.5%
- - + + + -
Model NameTotal TokensPercent
deepseek/deepseek-chat1,119,92059.5%
claude-3-5-sonnet-20241022699,67637.2%
deepseek/deepseek-chat1,105,73858.1%
claude-3-5-sonnet-20241022699,67636.8%
deepseek/REDACTED41,3702.2%
o125,1211.3%
claude-3-5-haiku-2024102210,0830.5%
gemini/gemini-exp-120610,0680.5%
mistral/codestral-latest8,1370.4%
deepseek/REDACTED7,4320.4%
gpt-4o1,7750.1%
o1-preview1750.0%
From 42ef4352f4b0bd2d05629e0c12bd6409ea8f7b74 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 22 Jan 2025 09:02:45 -0800 Subject: [PATCH 078/229] refactor: Handle KeyboardInterrupt with user-assistant message pair and add env check for sanity_check_messages --- aider/coders/base_coder.py | 6 ++++-- aider/sendchat.py | 4 +++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/aider/coders/base_coder.py b/aider/coders/base_coder.py index 2153fe527..7f5f613c9 100755 --- a/aider/coders/base_coder.py +++ b/aider/coders/base_coder.py @@ -1359,8 +1359,10 @@ class Coder: interrupted = True if interrupted: - content += "\n^C KeyboardInterrupt" - self.cur_messages += [dict(role="assistant", content=content)] + self.cur_messages += [ + dict(role="user", content="^C KeyboardInterrupt"), + dict(role="assistant", content="I see that you interrupted my previous reply."), + ] return edited = self.apply_updates() diff --git a/aider/sendchat.py b/aider/sendchat.py index e04008252..2cf7086aa 100644 --- a/aider/sendchat.py +++ b/aider/sendchat.py @@ -1,5 +1,6 @@ import hashlib import json +import os import time from aider.dump import dump # noqa: F401 @@ -51,7 +52,8 @@ def send_completion( ): # # - # sanity_check_messages(messages) + if os.environ.get("AIDER_SANITY_CHECK_TURNS"): + sanity_check_messages(messages) # # From 13d24278f287f7313c8ceddf4622d5f778d91611 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 22 Jan 2025 09:30:05 -0800 Subject: [PATCH 079/229] feat: Add assistant reply for token limit exhaustion in base_coder --- aider/coders/base_coder.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/aider/coders/base_coder.py b/aider/coders/base_coder.py index 7f5f613c9..52754309e 100755 --- a/aider/coders/base_coder.py +++ b/aider/coders/base_coder.py @@ -1326,13 +1326,21 @@ class Coder: self.show_usage_report() + self.add_assistant_reply_to_cur_messages() + if exhausted: + if not self.cur_messages or self.cur_messages[-1]["role"] == "user": + self.cur_messages += [ + dict( + role="assistant", + content="FinishReasonLength exception: you sent too many tokens", + ), + ] + self.show_exhausted_error() self.num_exhausted_context_windows += 1 return - self.add_assistant_reply_to_cur_messages() - if self.partial_response_function_call: args = self.parse_partial_args() if args: From 02f28d12e3464ce1e9cf0bc7d1692f0f095ff0ce Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 22 Jan 2025 09:53:32 -0800 Subject: [PATCH 080/229] fix: Correct condition for adding assistant reply in Coder class --- aider/coders/base_coder.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aider/coders/base_coder.py b/aider/coders/base_coder.py index 52754309e..a8fb3250e 100755 --- a/aider/coders/base_coder.py +++ b/aider/coders/base_coder.py @@ -1329,7 +1329,7 @@ class Coder: self.add_assistant_reply_to_cur_messages() if exhausted: - if not self.cur_messages or self.cur_messages[-1]["role"] == "user": + if self.cur_messages and self.cur_messages[-1]["role"] == "user": self.cur_messages += [ dict( role="assistant", From 0c464d0220c9f0dadf18662afed3a8a3ea8feb11 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 22 Jan 2025 09:54:55 -0800 Subject: [PATCH 081/229] copy --- HISTORY.md | 7 +- aider/website/HISTORY.md | 7 +- aider/website/assets/sample-analytics.jsonl | 276 ++++++++++---------- aider/website/docs/faq.md | 8 +- 4 files changed, 152 insertions(+), 146 deletions(-) diff --git a/HISTORY.md b/HISTORY.md index 1e41ba501..00ce44644 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,11 +1,14 @@ # Release history -### Aider v0.72.1 +### Aider v0.72.2 +- Harden against user/assistant turn order problems which cause R1 errors. +- Added environment variable AIDER_SANITY_CHECK_TURNS for turn order validation. + +### Aider v0.72.1 - Fix model metadata for `openrouter/deepseek/deepseek-r1` ### Aider v0.72.0 - - Support for DeepSeek R1. - Use shortcut: `--model r1` - Also via OpenRouter: `--model openrouter/deepseek/deepseek-r1` diff --git a/aider/website/HISTORY.md b/aider/website/HISTORY.md index 560a7079d..12d9cfe9d 100644 --- a/aider/website/HISTORY.md +++ b/aider/website/HISTORY.md @@ -23,12 +23,15 @@ cog.out(text) ]]]--> -### Aider v0.72.1 +### Aider v0.72.2 +- Harden against user/assistant turn order problems which cause R1 errors. +- Added environment variable AIDER_SANITY_CHECK_TURNS for turn order validation. + +### Aider v0.72.1 - Fix model metadata for `openrouter/deepseek/deepseek-r1` ### Aider v0.72.0 - - Support for DeepSeek R1. - Use shortcut: `--model r1` - Also via OpenRouter: `--model openrouter/deepseek/deepseek-r1` diff --git a/aider/website/assets/sample-analytics.jsonl b/aider/website/assets/sample-analytics.jsonl index a48b3a521..78f55e40a 100644 --- a/aider/website/assets/sample-analytics.jsonl +++ b/aider/website/assets/sample-analytics.jsonl @@ -1,141 +1,3 @@ -{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736545224} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546050} -{"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546052} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546052} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 4572, "completion_tokens": 54, "total_tokens": 4626, "cost": 0.0006551999999980401, "total_cost": 0.0006551999999980401}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546056} -{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546056} -{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546317} -{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546317} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546322} -{"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546323} -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546323} -{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546325} -{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546325} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546328} -{"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546330} -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546330} -{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546345} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546370} -{"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546371} -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546372} -{"event": "ai-comments file-add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546418} -{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546425} -{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546425} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546440} -{"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546442} -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546442} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546444} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 4360, "completion_tokens": 71, "total_tokens": 4431, "cost": 0.0006302799999980401, "total_cost": 0.0006302799999980401}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546449} -{"event": "ai-comments file-add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546463} -{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546467} -{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546467} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546508} -{"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546510} -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546510} -{"event": "ai-comments file-add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546518} -{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546557} -{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546557} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546560} -{"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546562} -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546562} -{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546565} -{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546595} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546595} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "ask", "prompt_tokens": 8007, "completion_tokens": 308, "total_tokens": 8315, "cost": 0.0012072199999980401, "total_cost": 0.0012072199999980401}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546605} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546619} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 10363, "completion_tokens": 365, "total_tokens": 10728, "cost": 0.00155301999999804, "total_cost": 0.00276023999999608}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546631} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546639} -{"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546641} -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546641} -{"event": "ai-comments file-add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546647} -{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546664} -{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546668} -{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546668} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546670} -{"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546672} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546682} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 11845, "completion_tokens": 300, "total_tokens": 12145, "cost": 0.00174229999999804, "total_cost": 0.00174229999999804}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546692} -{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546697} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546785} -{"event": "gui session", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546785} -{"event": "exit", "properties": {"reason": "GUI session ended"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546785} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546786} -{"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546788} -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546788} -{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546791} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546831} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 14491, "completion_tokens": 256, "total_tokens": 14747, "cost": 0.00210041999999804, "total_cost": 0.00210041999999804}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546842} -{"event": "ai-comments file-add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546853} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546856} -{"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546857} -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546857} -{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546858} -{"event": "command_code", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546861} -{"event": "command_architect", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546865} -{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546867} -{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546867} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546871} -{"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546872} -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546872} -{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546877} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546877} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "ask", "prompt_tokens": 2155, "completion_tokens": 225, "total_tokens": 2380, "cost": 0.00036469999999804006, "total_cost": 0.00036469999999804006}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546885} -{"event": "command_diff", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546886} -{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546889} -{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546898} -{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736546898} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547107} -{"event": "gui session", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547107} -{"event": "exit", "properties": {"reason": "GUI session ended"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547107} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547255} -{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547256} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547256} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 25808, "completion_tokens": 632, "total_tokens": 26440, "cost": 0.00379007999999804, "total_cost": 0.00379007999999804}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547278} -{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547278} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547430} -{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547432} -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547432} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547435} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 2402, "completion_tokens": 107, "total_tokens": 2509, "cost": 0.00036623999999804, "total_cost": 0.00036623999999804}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547439} -{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547443} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547464} -{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547465} -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547465} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547466} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 2437, "completion_tokens": 101, "total_tokens": 2538, "cost": 0.00036945999999804004, "total_cost": 0.00036945999999804004}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547470} -{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547481} -{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547481} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547505} -{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547506} -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547506} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547508} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 2622, "completion_tokens": 79, "total_tokens": 2701, "cost": 0.00038919999999804, "total_cost": 0.00038919999999804}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547511} -{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547520} -{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547520} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547546} -{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547547} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547547} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 2622, "completion_tokens": 74, "total_tokens": 2696, "cost": 0.00038779999999804003, "total_cost": 0.00038779999999804003}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547551} -{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547551} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547593} -{"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547595} -{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547602} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547817} -{"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547819} -{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547822} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547835} -{"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547837} -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547837} -{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547844} -{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547846} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547854} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 12535, "completion_tokens": 284, "total_tokens": 12819, "cost": 0.00183441999999804, "total_cost": 0.00183441999999804}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547865} -{"event": "command_run", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547885} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547890} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 13599, "completion_tokens": 195, "total_tokens": 13794, "cost": 0.00195845999999804, "total_cost": 0.00379287999999608}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547897} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547925} -{"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547926} -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547926} {"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547927} {"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547927} {"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547952} @@ -998,3 +860,141 @@ {"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737423852} {"event": "repo", "properties": {"num_files": 427}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737423855} {"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737423857} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737426234} +{"event": "repo", "properties": {"num_files": 427}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737426236} +{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737426236} +{"event": "ai-comments file-add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737426272} +{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737426272} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737426272} +{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 11196, "completion_tokens": 282, "total_tokens": 11478, "cost": 0.0016464000000000001, "total_cost": 0.0016464000000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737426283} +{"event": "command_model", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737426294} +{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737426308} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737426308} +{"event": "message_send", "properties": {"main_model": "deepseek/REDACTED", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "ask", "prompt_tokens": 9247, "completion_tokens": 214, "total_tokens": 9461, "cost": 0.00555451, "total_cost": 0.0072009100000000005}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737426317} +{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737426334} +{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737426334} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737426447} +{"event": "model warning", "properties": {"main_model": "openai/REDACTED", "weak_model": "openai/REDACTED", "editor_model": "openai/REDACTED"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737426449} +{"event": "repo", "properties": {"num_files": 427}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737426453} +{"event": "cli session", "properties": {"main_model": "openai/REDACTED", "weak_model": "openai/REDACTED", "editor_model": "openai/REDACTED", "edit_format": "whole"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737426453} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737426454} +{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737426486} +{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737426486} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737426495} +{"event": "repo", "properties": {"num_files": 427}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737426497} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737426497} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737426498} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737426601} +{"event": "repo", "properties": {"num_files": 427}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737426603} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737426603} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737426604} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737426814} +{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737426816} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737426816} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737426887} +{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737426889} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737426889} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737426892} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737483818} +{"event": "repo", "properties": {"num_files": 197}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737483820} +{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737483824} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737494990} +{"event": "repo", "properties": {"num_files": 427}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737494992} +{"event": "command_tokens", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737494992} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737494993} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737495000} +{"event": "repo", "properties": {"num_files": 427}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737495001} +{"event": "command_tokens", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737495001} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737495002} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737565134} +{"event": "repo", "properties": {"num_files": 427}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737565137} +{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737565137} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737565140} +{"event": "message_send_exception", "properties": {"exception": "name 'os' is not defined"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737565141} +{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737565148} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737565150} +{"event": "repo", "properties": {"num_files": 427}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737565152} +{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737565152} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737565153} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737565162} +{"event": "message_send_exception", "properties": {"exception": "Messages don't properly alternate user/assistant:\n\n-------\nSYSTEM Act as an expert software developer.\nSYSTEM Always use best practices when coding.\nSYSTEM Respect and use existing conventions, libraries, etc that are already present in the code base.\nSYSTEM \nSYSTEM Take requests for changes to the supplied code.\nSYSTEM If the request is ambiguous, ask questions.\nSYSTEM \nSYSTEM Always reply to the user in the same language they are using.\nSYSTEM \nSYSTEM Once you understand the request you MUST:\nSYSTEM \nSYSTEM 1. Decide if you need to propose *SEARCH/REPLACE* edits to any files that haven't been added to the chat. You can create new files without asking!\nSYSTEM \nSYSTEM But if you need to propose edits to existing files not already added to the chat, you *MUST* tell the user their full path names and ask them to *add the files to the chat*.\nSYSTEM End your reply and wait for their approval.\nSYSTEM You can keep asking if you then decide you need to edit more files.\nSYSTEM \nSYSTEM 2. Think step-by-step and explain the needed changes in a few short sentences.\nSYSTEM \nSYSTEM 3. Describe each change with a *SEARCH/REPLACE block* per the examples below.\nSYSTEM \nSYSTEM All changes to files must use this *SEARCH/REPLACE block* format.\nSYSTEM ONLY EVER RETURN CODE IN A *SEARCH/REPLACE BLOCK*!\nSYSTEM \nSYSTEM 4. *Concisely* suggest any shell commands the user might want to run in ```bash blocks.\nSYSTEM \nSYSTEM Just suggest shell commands this way, not example code.\nSYSTEM Only suggest complete shell commands that are ready to execute, without placeholders.\nSYSTEM Only suggest at most a few shell commands at a time, not more than 1-3, one per line.\nSYSTEM Do not suggest multi-line shell commands.\nSYSTEM All shell commands will run from the root directory of the user's project.\nSYSTEM \nSYSTEM Use the appropriate shell based on the user's system info:\nSYSTEM - Platform: macOS-15.2-x86_64-i386-64bit\nSYSTEM - Shell: SHELL=/usr/local/Cellar/bash/5.2.26/bin/bash\nSYSTEM - Language: en_US\nSYSTEM - Current date: 2025-01-22\nSYSTEM - The user is operating inside a git repository\nSYSTEM - The user's pre-commit runs these lint commands, don't suggest running them:\nSYSTEM - /Users/gauthier/Projects/aider/tmp.lint.sh\nSYSTEM \nSYSTEM Examples of when to suggest shell commands:\nSYSTEM \nSYSTEM - If you changed a self-contained html file, suggest an OS-appropriate command to open a browser to view it to see the updated content.\nSYSTEM - If you changed a CLI program, suggest the command to run it to see the new behavior.\nSYSTEM - If you added a test, suggest how to run it with the testing tool used by the project.\nSYSTEM - Suggest OS-appropriate commands to delete or rename files/directories, or other file system operations.\nSYSTEM - If your code changes add new dependencies, suggest the command to install them.\nSYSTEM - Etc.\nSYSTEM \nSYSTEM \nSYSTEM # Example conversations:\nSYSTEM \nSYSTEM ## USER: Change get_factorial() to use math.factorial\nSYSTEM \nSYSTEM ## ASSISTANT: To make this change we need to modify `mathweb/flask/app.py` to:\nSYSTEM \nSYSTEM 1. Import the math package.\nSYSTEM 2. Remove the existing factorial() function.\nSYSTEM 3. Update get_factorial() to call math.factorial instead.\nSYSTEM \nSYSTEM Here are the *SEARCH/REPLACE* blocks:\nSYSTEM \nSYSTEM mathweb/flask/app.py\nSYSTEM ```python\nSYSTEM <<<<<<< SEARCH\nSYSTEM from flask import Flask\nSYSTEM =======\nSYSTEM import math\nSYSTEM from flask import Flask\nSYSTEM >>>>>>> REPLACE\nSYSTEM ```\nSYSTEM \nSYSTEM mathweb/flask/app.py\nSYSTEM ```python\nSYSTEM <<<<<<< SEARCH\nSYSTEM def factorial(n):\nSYSTEM \"compute factorial\"\nSYSTEM \nSYSTEM if n == 0:\nSYSTEM return 1\nSYSTEM else:\nSYSTEM return n * factorial(n-1)\nSYSTEM \nSYSTEM =======\nSYSTEM >>>>>>> REPLACE\nSYSTEM ```\nSYSTEM \nSYSTEM mathweb/flask/app.py\nSYSTEM ```python\nSYSTEM <<<<<<< SEARCH\nSYSTEM return str(factorial(n))\nSYSTEM =======\nSYSTEM return str(math.factorial(n))\nSYSTEM >>>>>>> REPLACE\nSYSTEM ```\nSYSTEM \nSYSTEM \nSYSTEM ## USER: Refactor hello() into its own file.\nSYSTEM \nSYSTEM ## ASSISTANT: To make this change we need to modify `main.py` and make a new file `hello.py`:\nSYSTEM \nSYSTEM 1. Make a new hello.py file with hello() in it.\nSYSTEM 2. Remove hello() from main.py and replace it with an import.\nSYSTEM \nSYSTEM Here are the *SEARCH/REPLACE* blocks:\nSYSTEM \nSYSTEM hello.py\nSYSTEM ```python\nSYSTEM <<<<<<< SEARCH\nSYSTEM =======\nSYSTEM def hello():\nSYSTEM \"print a greeting\"\nSYSTEM \nSYSTEM print(\"hello\")\nSYSTEM >>>>>>> REPLACE\nSYSTEM ```\nSYSTEM \nSYSTEM main.py\nSYSTEM ```python\nSYSTEM <<<<<<< SEARCH\nSYSTEM def hello():\nSYSTEM \"print a greeting\"\nSYSTEM \nSYSTEM print(\"hello\")\nSYSTEM =======\nSYSTEM from hello import hello\nSYSTEM >>>>>>> REPLACE\nSYSTEM ```\nSYSTEM # *SEARCH/REPLACE block* Rules:\nSYSTEM \nSYSTEM Every *SEARCH/REPLACE block* must use this format:\nSYSTEM 1. The *FULL* file path alone on a line, verbatim. No bold asterisks, no quotes around it, no escaping of characters, etc.\nSYSTEM 2. The opening fence and code language, eg: ```python\nSYSTEM 3. The start of search block: <<<<<<< SEARCH\nSYSTEM 4. A contiguous chunk of lines to search for in the existing source code\nSYSTEM 5. The dividing line: =======\nSYSTEM 6. The lines to replace into the source code\nSYSTEM 7. The end of the replace block: >>>>>>> REPLACE\nSYSTEM 8. The closing fence: ```\nSYSTEM \nSYSTEM Use the *FULL* file path, as shown to you by the user.\nSYSTEM \nSYSTEM Every *SEARCH* section must *EXACTLY MATCH* the existing file content, character for character, including all comments, docstrings, etc.\nSYSTEM If the file contains code or other data wrapped/escaped in json/xml/quotes or other containers, you need to propose edits to the literal contents of the file, including the container markup.\nSYSTEM \nSYSTEM *SEARCH/REPLACE* blocks will *only* replace the first match occurrence.\nSYSTEM Including multiple unique *SEARCH/REPLACE* blocks if needed.\nSYSTEM Include enough lines in each SEARCH section to uniquely match each set of lines that need to change.\nSYSTEM \nSYSTEM Keep *SEARCH/REPLACE* blocks concise.\nSYSTEM Break large *SEARCH/REPLACE* blocks into a series of smaller blocks that each change a small portion of the file.\nSYSTEM Include just the changing lines, and a few surrounding lines if needed for uniqueness.\nSYSTEM Do not include long runs of unchanging lines in *SEARCH/REPLACE* blocks.\nSYSTEM \nSYSTEM Only create *SEARCH/REPLACE* blocks for files that the user has added to the chat!\nSYSTEM \nSYSTEM To move code within a file, use 2 *SEARCH/REPLACE* blocks: 1 to delete it from its current location, 1 to insert it in the new location.\nSYSTEM \nSYSTEM Pay attention to which filenames the user wants you to edit, especially if they are asking you to create a new file.\nSYSTEM \nSYSTEM If you want to put code in a new file, use a *SEARCH/REPLACE block* with:\nSYSTEM - A new file path, including dir name if needed\nSYSTEM - An empty `SEARCH` section\nSYSTEM - The new file's contents in the `REPLACE` section\nSYSTEM \nSYSTEM To rename files which have been added to the chat, use shell commands at the end of your response.\nSYSTEM \nSYSTEM If the user just says something like \"ok\" or \"go ahead\" or \"do that\" they probably want you to make SEARCH/REPLACE blocks for the code changes you just proposed.\nSYSTEM The user will say when they've applied your edits. If they haven't explicitly confirmed the edits have been applied, they probably want proper SEARCH/REPLACE blocks.\nSYSTEM \nSYSTEM \nSYSTEM ONLY EVER RETURN CODE IN A *SEARCH/REPLACE BLOCK*!\nSYSTEM \nSYSTEM Examples of when to suggest shell commands:\nSYSTEM \nSYSTEM - If you changed a self-contained html file, suggest an OS-appropriate command to open a browser to view it to see the updated content.\nSYSTEM - If you changed a CLI program, suggest the command to run it to see the new behavior.\nSYSTEM - If you added a test, suggest how to run it with the testing tool used by the project.\nSYSTEM - Suggest OS-appropriate commands to delete or rename files/directories, or other file system operations.\nSYSTEM - If your code changes add new dependencies, suggest the command to install them.\nSYSTEM - Etc.\nSYSTEM \n-------\nUSER Here are summaries of some files present in my git repository.\nUSER Do not propose changes to these files, treat them as *read-only*.\nUSER If you need to edit any of these files, ask me to *add them to the chat* first.\nUSER \nUSER aider/analytics.py:\nUSER \u22ee...\nUSER \u2502def compute_hex_threshold(percent):\nUSER \u22ee...\nUSER \u2502def is_uuid_in_percentage(uuid_str, percent):\nUSER \u22ee...\nUSER \u2502class Analytics:\nUSER \u2502 # providers\nUSER \u2502 mp = None\nUSER \u22ee...\nUSER \u2502 def disable(self, permanently):\nUSER \u22ee...\nUSER \u2502 def need_to_ask(self, args_analytics):\nUSER \u22ee...\nUSER \u2502 def get_data_file_path(self):\nUSER \u22ee...\nUSER \u2502 def get_or_create_uuid(self):\nUSER \u22ee...\nUSER \u2502 def load_data(self):\nUSER \u22ee...\nUSER \u2502 def save_data(self):\nUSER \u22ee...\nUSER \u2502 def get_system_info(self):\nUSER \u22ee...\nUSER \u2502 def event(self, event_name, main_model=None, **kwargs):\nUSER \u22ee...\nUSER \nUSER aider/args.py:\nUSER \u22ee...\nUSER \u2502def get_parser(default_config_files, git_root):\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER aider/args_formatter.py:\nUSER \u22ee...\nUSER \u2502class DotEnvFormatter(argparse.HelpFormatter):\nUSER \u2502 def start_section(self, heading):\nUSER \u2502 res = \"\\n\\n\"\nUSER \u2502 res += \"#\" * (len(heading) + 3)\nUSER \u2502 res += f\"\\n# {heading}\"\nUSER \u22ee...\nUSER \u2502 def _format_usage(self, usage, actions, groups, prefix):\nUSER \u22ee...\nUSER \u2502class YamlHelpFormatter(argparse.HelpFormatter):\nUSER \u2502 def start_section(self, heading):\nUSER \u2502 res = \"\\n\\n\"\nUSER \u2502 res += \"#\" * (len(heading) + 3)\nUSER \u2502 res += f\"\\n# {heading}\"\nUSER \u22ee...\nUSER \u2502 def _format_usage(self, usage, actions, groups, prefix):\nUSER \u22ee...\nUSER \u2502class MarkdownHelpFormatter(argparse.HelpFormatter):\nUSER \u2502 def start_section(self, heading):\nUSER \u22ee...\nUSER \u2502 def _format_usage(self, usage, actions, groups, prefix):\nUSER \u22ee...\nUSER \nUSER aider/coders/architect_prompts.py:\nUSER \u22ee...\nUSER \u2502class ArchitectPrompts(CoderPrompts):\nUSER \u22ee...\nUSER \nUSER aider/coders/ask_prompts.py:\nUSER \u22ee...\nUSER \u2502class AskPrompts(CoderPrompts):\nUSER \u22ee...\nUSER \nUSER aider/coders/base_coder.py:\nUSER \u22ee...\nUSER \u2502class Coder:\nUSER \u2502 abs_fnames = None\nUSER \u22ee...\nUSER \u2502 @classmethod\nUSER \u2502 def create(\nUSER \u2502 self,\nUSER \u2502 main_model=None,\nUSER \u2502 edit_format=None,\nUSER \u2502 io=None,\nUSER \u2502 from_coder=None,\nUSER \u2502 summarize_from_coder=True,\nUSER \u2502 **kwargs,\nUSER \u22ee...\nUSER \u2502 def get_announcements(self):\nUSER \u22ee...\nUSER \u2502 def show_announcements(self):\nUSER \u22ee...\nUSER \u2502 def add_rel_fname(self, rel_fname):\nUSER \u22ee...\nUSER \u2502 def drop_rel_fname(self, fname):\nUSER \u22ee...\nUSER \u2502 def abs_root_path(self, path):\nUSER \u22ee...\nUSER \u2502 def get_repo_map(self, force_refresh=False):\nUSER \u22ee...\nUSER \u2502 def run_stream(self, user_message):\nUSER \u22ee...\nUSER \u2502 def run(self, with_message=None, preproc=True):\nUSER \u22ee...\nUSER \u2502 def fmt_system_prompt(self, prompt):\nUSER \u22ee...\nUSER \u2502 def format_messages(self):\nUSER \u22ee...\nUSER \u2502 def get_multi_response_content(self, final=False):\nUSER \u22ee...\nUSER \u2502 def get_rel_fname(self, fname):\nUSER \u22ee...\nUSER \u2502 def get_inchat_relative_files(self):\nUSER \u22ee...\nUSER \u2502 def get_all_relative_files(self):\nUSER \u22ee...\nUSER \u2502 def allowed_to_edit(self, path):\nUSER \u22ee...\nUSER \u2502 def check_added_files(self):\nUSER \u22ee...\nUSER \u2502 def apply_updates(self):\nUSER \u22ee...\nUSER \u2502 def parse_partial_args(self):\nUSER \u22ee...\nUSER \nUSER aider/coders/base_prompts.py:\nUSER \u2502class CoderPrompts:\nUSER \u22ee...\nUSER \nUSER aider/coders/chat_chunks.py:\nUSER \u22ee...\nUSER \u2502@dataclass\nUSER \u2502class ChatChunks:\nUSER \u2502 system: List = field(default_factory=list)\nUSER \u22ee...\nUSER \u2502 def all_messages(self):\nUSER \u22ee...\nUSER \u2502 def add_cache_control(self, messages):\nUSER \u22ee...\nUSER \nUSER aider/coders/editblock_coder.py:\nUSER \u22ee...\nUSER \u2502def do_replace(fname, content, before_text, after_text, fence=None):\nUSER \u22ee...\nUSER \u2502def find_original_update_blocks(content, fence=DEFAULT_FENCE, valid_fnames=None):\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER aider/coders/editblock_fenced_prompts.py:\nUSER \u22ee...\nUSER \u2502class EditBlockFencedPrompts(EditBlockPrompts):\nUSER \u22ee...\nUSER \nUSER aider/coders/editblock_func_prompts.py:\nUSER \u22ee...\nUSER \u2502class EditBlockFunctionPrompts(CoderPrompts):\nUSER \u22ee...\nUSER \nUSER aider/coders/editblock_prompts.py:\nUSER \u22ee...\nUSER \u2502class EditBlockPrompts(CoderPrompts):\nUSER \u22ee...\nUSER \nUSER aider/coders/editor_editblock_prompts.py:\nUSER \u22ee...\nUSER \u2502class EditorEditBlockPrompts(EditBlockPrompts):\nUSER \u22ee...\nUSER \nUSER aider/coders/editor_whole_prompts.py:\nUSER \u22ee...\nUSER \u2502class EditorWholeFilePrompts(WholeFilePrompts):\nUSER \u22ee...\nUSER \nUSER aider/coders/help_prompts.py:\nUSER \u22ee...\nUSER \u2502class HelpPrompts(CoderPrompts):\nUSER \u22ee...\nUSER \nUSER aider/coders/search_replace.py:\nUSER \u22ee...\nUSER \u2502def try_strategy(texts, strategy, preproc):\nUSER \u22ee...\nUSER \u2502def read_text(fname):\nUSER \u22ee...\nUSER \u2502def main(dnames):\nUSER \u22ee...\nUSER \nUSER aider/coders/single_wholefile_func_prompts.py:\nUSER \u22ee...\nUSER \u2502class SingleWholeFileFunctionPrompts(CoderPrompts):\nUSER \u22ee...\nUSER \nUSER aider/coders/udiff_coder.py:\nUSER \u22ee...\nUSER \u2502def do_replace(fname, content, hunk):\nUSER \u22ee...\nUSER \u2502def directly_apply_hunk(content, hunk):\nUSER \u22ee...\nUSER \u2502def hunk_to_before_after(hunk, lines=False):\nUSER \u22ee...\nUSER \nUSER aider/coders/wholefile_func_prompts.py:\nUSER \u22ee...\nUSER \u2502class WholeFileFunctionPrompts(CoderPrompts):\nUSER \u22ee...\nUSER \nUSER aider/coders/wholefile_prompts.py:\nUSER \u22ee...\nUSER \u2502class WholeFilePrompts(CoderPrompts):\nUSER \u22ee...\nUSER \nUSER aider/commands.py:\nUSER \u22ee...\nUSER \u2502class Commands:\nUSER \u2502 voice = None\nUSER \u22ee...\nUSER \u2502 def get_raw_completions(self, cmd):\nUSER \u22ee...\nUSER \u2502 def get_completions(self, cmd):\nUSER \u22ee...\nUSER \u2502 def get_commands(self):\nUSER \u22ee...\nUSER \u2502 def matching_commands(self, inp):\nUSER \u22ee...\nUSER \u2502 def run(self, inp):\nUSER \u22ee...\nUSER \u2502 def cmd_tokens(self, args):\nUSER \u2502 \"Report on the number of tokens used by the current chat context\"\nUSER \u2502\nUSER \u22ee...\nUSER \u2502 def fmt(v):\nUSER \u22ee...\nUSER \u2502 def cmd_undo(self, args):\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER aider/copypaste.py:\nUSER \u22ee...\nUSER \u2502class ClipboardWatcher:\nUSER \u2502 \"\"\"Watches clipboard for changes and updates IO placeholder\"\"\"\nUSER \u2502\nUSER \u22ee...\nUSER \u2502 def start(self):\nUSER \u22ee...\nUSER \u2502 def stop(self):\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER aider/diffs.py:\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \u2502def diff_partial_update(lines_orig, lines_updated, final=False, fname=None):\nUSER \u22ee...\nUSER \nUSER aider/dump.py:\nUSER \u22ee...\nUSER \u2502def cvt(s):\nUSER \u22ee...\nUSER \u2502def dump(*vals):\nUSER \u22ee...\nUSER \nUSER aider/editor.py:\nUSER \u22ee...\nUSER \u2502def print_status_message(success, message, style=None):\nUSER \u22ee...\nUSER \u2502def write_temp_file(\nUSER \u2502 input_data=\"\",\nUSER \u2502 suffix=None,\nUSER \u2502 prefix=None,\nUSER \u2502 dir=None,\nUSER \u22ee...\nUSER \u2502def get_environment_editor(default=None):\nUSER \u22ee...\nUSER \u2502def discover_editor(editor_override=None):\nUSER \u22ee...\nUSER \u2502def pipe_editor(input_data=\"\", suffix=None, editor=None):\nUSER \u22ee...\nUSER \nUSER aider/exceptions.py:\nUSER \u22ee...\nUSER \u2502@dataclass\nUSER \u2502class ExInfo:\nUSER \u22ee...\nUSER \u2502class LiteLLMExceptions:\nUSER \u2502 exceptions = dict()\nUSER \u2502\nUSER \u22ee...\nUSER \u2502 def _load(self, strict=False):\nUSER \u22ee...\nUSER \u2502 def exceptions_tuple(self):\nUSER \u22ee...\nUSER \u2502 def get_ex_info(self, ex):\nUSER \u22ee...\nUSER \nUSER aider/format_settings.py:\nUSER \u2502def scrub_sensitive_info(args, text):\nUSER \u22ee...\nUSER \nUSER aider/gui.py:\nUSER \u22ee...\nUSER \u2502class CaptureIO(InputOutput):\nUSER \u2502 lines = []\nUSER \u2502\nUSER \u2502 def tool_output(self, msg, log_only=False):\nUSER \u22ee...\nUSER \u2502 def tool_error(self, msg):\nUSER \u22ee...\nUSER \u2502 def tool_warning(self, msg):\nUSER \u22ee...\nUSER \u2502 def get_captured_lines(self):\nUSER \u22ee...\nUSER \u2502def search(text=None):\nUSER \u22ee...\nUSER \u2502class State:\nUSER \u2502 keys = set()\nUSER \u2502\nUSER \u2502 def init(self, key, val=None):\nUSER \u22ee...\nUSER \u2502@st.cache_resource\nUSER \u2502def get_state():\nUSER \u22ee...\nUSER \u2502@st.cache_resource\nUSER \u2502def get_coder():\nUSER \u22ee...\nUSER \u2502class GUI:\nUSER \u2502 prompt = None\nUSER \u22ee...\nUSER \u2502 def announce(self):\nUSER \u22ee...\nUSER \u2502 def show_edit_info(self, edit):\nUSER \u22ee...\nUSER \u2502 def add_undo(self, commit_hash):\nUSER \u22ee...\nUSER \u2502 def do_sidebar(self):\nUSER \u22ee...\nUSER \u2502 def do_add_to_chat(self):\nUSER \u22ee...\nUSER \u2502 def do_add_files(self):\nUSER \u22ee...\nUSER \u2502 def do_add_web_page(self):\nUSER \u22ee...\nUSER \u2502 def do_clear_chat_history(self):\nUSER \u22ee...\nUSER \u2502 def do_recent_msgs(self):\nUSER \u22ee...\nUSER \u2502 def do_messages_container(self):\nUSER \u22ee...\nUSER \u2502 def initialize_state(self):\nUSER \u22ee...\nUSER \u2502 def button(self, args, **kwargs):\nUSER \u22ee...\nUSER \u2502 def prompt_pending(self):\nUSER \u22ee...\nUSER \u2502 def process_chat(self):\nUSER \u22ee...\nUSER \u2502 def info(self, message, echo=True):\nUSER \u22ee...\nUSER \u2502 def do_web(self):\nUSER \u22ee...\nUSER \u2502 def do_undo(self, commit_hash):\nUSER \u22ee...\nUSER \u2502def gui_main():\nUSER \u22ee...\nUSER \nUSER aider/help.py:\nUSER \u22ee...\nUSER \u2502def get_package_files():\nUSER \u22ee...\nUSER \u2502def fname_to_url(filepath):\nUSER \u22ee...\nUSER \u2502def get_index():\nUSER \u22ee...\nUSER \nUSER aider/history.py:\nUSER \u22ee...\nUSER \u2502class ChatSummary:\nUSER \u2502 def __init__(self, models=None, max_tokens=1024):\nUSER \u2502 if not models:\nUSER \u2502 raise ValueError(\"At least one model must be provided\")\nUSER \u2502 self.models = models if isinstance(models, list) else [models]\nUSER \u2502 self.max_tokens = max_tokens\nUSER \u22ee...\nUSER \u2502 def too_big(self, messages):\nUSER \u22ee...\nUSER \u2502 def tokenize(self, messages):\nUSER \u22ee...\nUSER \u2502 def summarize(self, messages, depth=0):\nUSER \u22ee...\nUSER \u2502 def summarize_real(self, messages, depth=0):\nUSER \u22ee...\nUSER \u2502 def summarize_all(self, messages):\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER aider/io.py:\nUSER \u22ee...\nUSER \u2502class AutoCompleter(Completer):\nUSER \u2502 def __init__(\nUSER \u2502 self, root, rel_fnames, addable_rel_fnames, commands, encoding, abs_read_only_fnames=None\nUSER \u22ee...\nUSER \u2502 def tokenize(self):\nUSER \u22ee...\nUSER \u2502 def get_command_completions(self, document, complete_event, text, words):\nUSER \u22ee...\nUSER \u2502 def get_completions(self, document, complete_event):\nUSER \u22ee...\nUSER \u2502class InputOutput:\nUSER \u2502 num_error_outputs = 0\nUSER \u22ee...\nUSER \u2502 def _get_style(self):\nUSER \u22ee...\nUSER \u2502 def read_image(self, filename):\nUSER \u22ee...\nUSER \u2502 def read_text(self, filename, silent=False):\nUSER \u22ee...\nUSER \u2502 def write_text(self, filename, content, max_retries=5, initial_delay=0.1):\nUSER \u22ee...\nUSER \u2502 def rule(self):\nUSER \u22ee...\nUSER \u2502 def interrupt_input(self):\nUSER \u22ee...\nUSER \u2502 def get_input(\nUSER \u2502 self,\nUSER \u2502 root,\nUSER \u2502 rel_fnames,\nUSER \u2502 addable_rel_fnames,\nUSER \u2502 commands,\nUSER \u2502 abs_read_only_fnames=None,\nUSER \u2502 edit_format=None,\nUSER \u2502 ):\nUSER \u2502 self.rule()\nUSER \u2502\nUSER \u22ee...\nUSER \u2502 def suspend_to_bg(event):\nUSER \u22ee...\nUSER \u2502 def add_to_input_history(self, inp):\nUSER \u22ee...\nUSER \u2502 def get_input_history(self):\nUSER \u22ee...\nUSER \u2502 def display_user_input(self, inp):\nUSER \u22ee...\nUSER \u2502 def user_input(self, inp, log_only=True):\nUSER \u22ee...\nUSER \u2502 def offer_url(self, url, prompt=\"Open URL for more info?\", allow_never=True):\nUSER \u22ee...\nUSER \u2502 def confirm_ask(\nUSER \u2502 self,\nUSER \u2502 question,\nUSER \u2502 default=\"y\",\nUSER \u2502 subject=None,\nUSER \u2502 explicit_yes_required=False,\nUSER \u2502 group=None,\nUSER \u2502 allow_never=False,\nUSER \u22ee...\nUSER \u2502 def tool_error(self, message=\"\", strip=True):\nUSER \u22ee...\nUSER \u2502 def tool_warning(self, message=\"\", strip=True):\nUSER \u22ee...\nUSER \u2502 def tool_output(self, *messages, log_only=False, bold=False):\nUSER \u22ee...\nUSER \u2502 def print(self, message=\"\"):\nUSER \u22ee...\nUSER \u2502 def append_chat_history(self, text, linebreak=False, blockquote=False, strip=True):\nUSER \u22ee...\nUSER \u2502 def format_files_for_input(self, rel_fnames, rel_read_only_fnames):\nUSER \u22ee...\nUSER \u2502def get_rel_fname(fname, root):\nUSER \u22ee...\nUSER \nUSER aider/linter.py:\nUSER \u22ee...\nUSER \u2502class Linter:\nUSER \u2502 def __init__(self, encoding=\"utf-8\", root=None):\nUSER \u2502 self.encoding = encoding\nUSER \u2502 self.root = root\nUSER \u2502\nUSER \u2502 self.languages = dict(\nUSER \u2502 python=self.py_lint,\nUSER \u2502 )\nUSER \u22ee...\nUSER \u2502 def get_rel_fname(self, fname):\nUSER \u22ee...\nUSER \u2502 def run_cmd(self, cmd, rel_fname, code):\nUSER \u22ee...\nUSER \u2502 def lint(self, fname, cmd=None):\nUSER \u22ee...\nUSER \u2502@dataclass\nUSER \u2502class LintResult:\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER aider/llm.py:\nUSER \u22ee...\nUSER \u2502class LazyLiteLLM:\nUSER \u22ee...\nUSER \nUSER aider/main.py:\nUSER \u22ee...\nUSER \u2502def sanity_check_repo(repo, io):\nUSER \u22ee...\nUSER \u2502def main(argv=None, input=None, output=None, force_git_root=None, return_coder=False):\nUSER \u22ee...\nUSER \nUSER aider/mdstream.py:\nUSER \u22ee...\nUSER \u2502class MarkdownStream:\nUSER \u2502 \"\"\"Streaming markdown renderer that progressively displays content with a live updating window.\nUSER \u2502\nUSER \u2502 Uses rich.console and rich.live to render markdown content with smooth scrolling\nUSER \u2502 and partial updates. Maintains a sliding window of visible content while streaming\nUSER \u2502 in new markdown text.\nUSER \u22ee...\nUSER \u2502 def update(self, text, final=False):\nUSER \u22ee...\nUSER \nUSER aider/models.py:\nUSER \u22ee...\nUSER \u2502@dataclass\nUSER \u2502class ModelSettings:\nUSER \u22ee...\nUSER \u2502class ModelInfoManager:\nUSER \u2502 MODEL_INFO_URL = (\nUSER \u2502 \"https://raw.githubusercontent.com/BerriAI/litellm/main/\"\nUSER \u2502 \"model_prices_and_context_window.json\"\nUSER \u22ee...\nUSER \u2502 def get_model_from_cached_json_db(self, model):\nUSER \u22ee...\nUSER \u2502 def get_model_info(self, model):\nUSER \u22ee...\nUSER \u2502class Model(ModelSettings):\nUSER \u2502 def __init__(self, model, weak_model=None, editor_model=None, editor_edit_format=None):\nUSER \u2502 # Map any alias to its canonical name\nUSER \u2502 model = MODEL_ALIASES.get(model, model)\nUSER \u2502\nUSER \u2502 self.name = model\nUSER \u2502\nUSER \u2502 self.max_chat_history_tokens = 1024\nUSER \u2502 self.weak_model = None\nUSER \u2502 self.editor_model = None\nUSER \u2502\nUSER \u22ee...\nUSER \u2502 def get_model_info(self, model):\nUSER \u22ee...\nUSER \u2502 def token_count(self, messages):\nUSER \u22ee...\nUSER \u2502 def validate_environment(self):\nUSER \u22ee...\nUSER \u2502def validate_variables(vars):\nUSER \u22ee...\nUSER \u2502def sanity_check_model(io, model):\nUSER \u22ee...\nUSER \u2502def fuzzy_match_models(name):\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER aider/repo.py:\nUSER \u22ee...\nUSER \u2502class GitRepo:\nUSER \u2502 repo = None\nUSER \u22ee...\nUSER \u2502 def commit(self, fnames=None, context=None, message=None, aider_edits=False):\nUSER \u22ee...\nUSER \u2502 def get_commit_message(self, diffs, context):\nUSER \u22ee...\nUSER \u2502 def get_diffs(self, fnames=None):\nUSER \u22ee...\nUSER \u2502 def diff_commits(self, pretty, from_commit, to_commit):\nUSER \u22ee...\nUSER \u2502 def get_tracked_files(self):\nUSER \u22ee...\nUSER \u2502 def normalize_path(self, path):\nUSER \u22ee...\nUSER \u2502 def refresh_aider_ignore(self):\nUSER \u22ee...\nUSER \u2502 def git_ignored_file(self, path):\nUSER \u22ee...\nUSER \u2502 def ignored_file(self, fname):\nUSER \u22ee...\nUSER \u2502 def ignored_file_raw(self, fname):\nUSER \u22ee...\nUSER \u2502 def path_in_repo(self, path):\nUSER \u22ee...\nUSER \u2502 def abs_root_path(self, path):\nUSER \u22ee...\nUSER \u2502 def is_dirty(self, path=None):\nUSER \u22ee...\nUSER \u2502 def get_head_commit(self):\nUSER \u22ee...\nUSER \u2502 def get_head_commit_sha(self, short=False):\nUSER \u22ee...\nUSER \nUSER aider/repomap.py:\nUSER \u22ee...\nUSER \u2502class RepoMap:\nUSER \u2502 CACHE_VERSION = 3\nUSER \u22ee...\nUSER \u2502 def token_count(self, text):\nUSER \u22ee...\nUSER \u2502 def get_repo_map(\nUSER \u2502 self,\nUSER \u2502 chat_files,\nUSER \u2502 other_files,\nUSER \u2502 mentioned_fnames=None,\nUSER \u2502 mentioned_idents=None,\nUSER \u2502 force_refresh=False,\nUSER \u22ee...\nUSER \u2502 def get_rel_fname(self, fname):\nUSER \u22ee...\nUSER \u2502 def tags_cache_error(self, original_error=None):\nUSER \u22ee...\nUSER \nUSER aider/report.py:\nUSER \u22ee...\nUSER \u2502def report_github_issue(issue_text, title=None, confirm=True):\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER aider/run_cmd.py:\nUSER \u22ee...\nUSER \u2502def run_cmd(command, verbose=False, error_print=None, cwd=None):\nUSER \u22ee...\nUSER \u2502def get_windows_parent_process_name():\nUSER \u22ee...\nUSER \u2502def run_cmd_subprocess(command, verbose=False, cwd=None, encoding=sys.stdout.encoding):\nUSER \u22ee...\nUSER \u2502def run_cmd_pexpect(command, verbose=False, cwd=None):\nUSER \u22ee...\nUSER \nUSER aider/scrape.py:\nUSER \u22ee...\nUSER \u2502class Scraper:\nUSER \u2502 pandoc_available = None\nUSER \u22ee...\nUSER \u2502 def scrape(self, url):\nUSER \u22ee...\nUSER \u2502def main(url):\nUSER \u22ee...\nUSER \nUSER aider/sendchat.py:\nUSER \u22ee...\nUSER \u2502def sanity_check_messages(messages):\nUSER \u22ee...\nUSER \u2502def send_completion(\nUSER \u2502 model_name,\nUSER \u2502 messages,\nUSER \u2502 functions,\nUSER \u2502 stream,\nUSER \u2502 temperature=0,\nUSER \u2502 extra_params=None,\nUSER \u22ee...\nUSER \u2502def simple_send_with_retries(model, messages):\nUSER \u22ee...\nUSER \nUSER aider/special.py:\nUSER \u22ee...\nUSER \u2502def is_important(file_path):\nUSER \u22ee...\nUSER \u2502def filter_important_files(file_paths):\nUSER \u22ee...\nUSER \nUSER aider/utils.py:\nUSER \u22ee...\nUSER \u2502class IgnorantTemporaryDirectory:\nUSER \u2502 def __init__(self):\nUSER \u2502 if sys.version_info >= (3, 10):\nUSER \u2502 self.temp_dir = tempfile.TemporaryDirectory(ignore_cleanup_errors=True)\nUSER \u2502 else:\nUSER \u22ee...\nUSER \u2502 def cleanup(self):\nUSER \u22ee...\nUSER \u2502class GitTemporaryDirectory(ChdirTemporaryDirectory):\nUSER \u22ee...\nUSER \u2502def make_repo(path=None):\nUSER \u22ee...\nUSER \u2502def is_image_file(file_name):\nUSER \u22ee...\nUSER \u2502def safe_abs_path(res):\nUSER \u22ee...\nUSER \u2502def format_content(role, content):\nUSER \u22ee...\nUSER \u2502def format_messages(messages, title=None):\nUSER \u22ee...\nUSER \u2502def split_chat_history_markdown(text, include_tool=False):\nUSER \u2502 messages = []\nUSER \u22ee...\nUSER \u2502 def append_msg(role, lines):\nUSER \u22ee...\nUSER \u2502def get_pip_install(args):\nUSER \u22ee...\nUSER \u2502def run_install(cmd):\nUSER \u22ee...\nUSER \u2502class Spinner:\nUSER \u2502 unicode_spinner = [\"\u280b\", \"\u2819\", \"\u2839\", \"\u2838\", \"\u283c\", \"\u2834\", \"\u2826\", \"\u2827\", \"\u2807\", \"\u280f\"]\nUSER \u22ee...\nUSER \u2502 def step(self):\nUSER \u22ee...\nUSER \u2502 def end(self):\nUSER \u22ee...\nUSER \u2502def check_pip_install_extra(io, module, prompt, pip_install_cmd, self_update=False):\nUSER \u22ee...\nUSER \u2502def printable_shell_command(cmd_list):\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER aider/voice.py:\nUSER \u22ee...\nUSER \u2502class SoundDeviceError(Exception):\nUSER \u22ee...\nUSER \u2502class Voice:\nUSER \u2502 max_rms = 0\nUSER \u22ee...\nUSER \u2502 def record_and_transcribe(self, history=None, language=None):\nUSER \u22ee...\nUSER \u2502 def raw_record_and_transcribe(self, history, language):\nUSER \u22ee...\nUSER \nUSER aider/watch.py:\nUSER \u22ee...\nUSER \u2502def load_gitignores(gitignore_paths: list[Path]) -> Optional[PathSpec]:\nUSER \u22ee...\nUSER \u2502class FileWatcher:\nUSER \u2502 \"\"\"Watches source files for changes and AI comments\"\"\"\nUSER \u2502\nUSER \u22ee...\nUSER \u2502 def start(self):\nUSER \u22ee...\nUSER \u2502 def stop(self):\nUSER \u22ee...\nUSER \u2502 def process_changes(self):\nUSER \u22ee...\nUSER \u2502 def get_ai_comments(self, filepath):\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER aider/website/_includes/code-in-json-benchmark.js:\nUSER \u22ee...\nUSER \u2502 function getAspectRatio() {\nUSER \u2502 var width = chartContainer.offsetWidth;\nUSER \u2502 // Gradually change aspect ratio from 2 (landscape) to 1 (square)\nUSER \u2502 return Math.max(1, Math.min(2, width / 300));\nUSER \u22ee...\nUSER \u2502 function resizeChart() {\nUSER \u2502 chart.options.aspectRatio = getAspectRatio();\nUSER \u2502 chart.resize();\nUSER \u22ee...\nUSER \u2502function createStripedCanvas(isStrict) {\nUSER \u2502 const patternCanvas = document.createElement('canvas');\nUSER \u2502 const patternContext = patternCanvas.getContext('2d');\nUSER \u2502 const size = 10;\nUSER \u2502 patternCanvas.width = size;\nUSER \u2502 patternCanvas.height = size;\nUSER \u2502\nUSER \u2502 patternContext.fillStyle = 'rgba(255, 99, 132, 0.8)';\nUSER \u2502 patternContext.fillRect(0, 0, size, size);\nUSER \u2502\nUSER \u22ee...\nUSER \nUSER aider/website/_includes/code-in-json-syntax.js:\nUSER \u22ee...\nUSER \u2502 function getAspectRatio() {\nUSER \u2502 var width = chartContainer.offsetWidth;\nUSER \u2502 // Gradually change aspect ratio from 2 (landscape) to 1 (square)\nUSER \u2502 return Math.max(1, Math.min(2, width / 300));\nUSER \u22ee...\nUSER \u2502 function resizeChart() {\nUSER \u2502 chart.options.aspectRatio = getAspectRatio();\nUSER \u2502 chart.resize();\nUSER \u22ee...\nUSER \nUSER aider/website/_includes/leaderboard.js:\nUSER \u22ee...\nUSER \u2502 function updateChart() {\nUSER \u2502 var selectedRows = document.querySelectorAll('tr.selected');\nUSER \u2502 var showAll = selectedRows.length === 0;\nUSER \u2502\nUSER \u2502 displayedData = [];\nUSER \u2502 leaderboardData.labels = [];\nUSER \u2502 leaderboardData.datasets[0].data = [];\nUSER \u2502\nUSER \u2502 allData.forEach(function(row, index) {\nUSER \u2502 var rowElement = document.getElementById('edit-row-' + index);\nUSER \u22ee...\nUSER \nUSER aider/website/_includes/quant-chart.js:\nUSER \u22ee...\nUSER \u2502 function updateChart(filterText) {\nUSER \u2502 var filteredData = allData.filter(row => \nUSER \u2502 row.model.toLowerCase().includes(filterText.toLowerCase())\nUSER \u2502 );\nUSER \u2502 \nUSER \u2502 var chartData = {\nUSER \u2502 labels: filteredData.map(row => row.model),\nUSER \u2502 datasets: [{\nUSER \u2502 label: 'Percent completed correctly',\nUSER \u2502 data: filteredData.map(row => row.pass_rate_2),\nUSER \u22ee...\nUSER \nUSER aider/website/_includes/qwq-chart.js:\nUSER \u22ee...\nUSER \u2502 function updateChart(filterText) {\nUSER \u2502 var filteredData = allData.filter(row => \nUSER \u2502 row.model.toLowerCase().includes(filterText.toLowerCase())\nUSER \u2502 );\nUSER \u2502 \nUSER \u2502 var chartData = {\nUSER \u2502 labels: filteredData.map(row => row.model),\nUSER \u2502 datasets: [{\nUSER \u2502 data: filteredData.map(row => row.pass_rate_2),\nUSER \u2502 backgroundColor: filteredData.map(row => \nUSER \u22ee...\nUSER \nUSER benchmark/benchmark.py:\nUSER \u22ee...\nUSER \u2502@app.command()\nUSER \u2502def main(\nUSER \u2502 dirnames: Optional[List[str]] = typer.Argument(None, help=\"Directory names\"),\nUSER \u2502 graphs: bool = typer.Option(False, \"--graphs\", help=\"Generate graphs\"),\nUSER \u2502 model: str = typer.Option(\"gpt-3.5-turbo\", \"--model\", \"-m\", help=\"Model name\"),\nUSER \u2502 sleep: float = typer.Option(\nUSER \u2502 0, \"--sleep\", help=\"Sleep seconds between tests when single threaded\"\nUSER \u2502 ),\nUSER \u2502 languages: str = typer.Option(\nUSER \u2502 None, \"--languages\", \"-l\", help=\"Only run tests for specific languages (comma separated)\"\nUSER \u2502 ),\nUSER \u22ee...\nUSER \u2502def load_results(dirname, stats_languages=None):\nUSER \u22ee...\nUSER \u2502def summarize_results(dirname, stats_languages=None):\nUSER \u2502 all_results = load_results(dirname, stats_languages)\nUSER \u2502\nUSER \u22ee...\nUSER \u2502 def show(stat, red=\"red\"):\nUSER \u22ee...\nUSER \u2502def cleanup_test_output(output, testdir):\nUSER \u22ee...\nUSER \nUSER benchmark/over_time.py:\nUSER \u22ee...\nUSER \u2502class BenchmarkPlotter:\nUSER \u2502 LABEL_FONT_SIZE = 16\nUSER \u2502\nUSER \u22ee...\nUSER \u2502 def load_data(self, yaml_file: str) -> List[ModelData]:\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER benchmark/problem_stats.py:\nUSER \u22ee...\nUSER \u2502def load_results(dirname):\nUSER \u22ee...\nUSER \nUSER benchmark/refactor_tools.py:\nUSER \u22ee...\nUSER \u2502class ParentNodeTransformer(ast.NodeTransformer):\nUSER \u2502 \"\"\"\nUSER \u2502 This transformer sets the 'parent' attribute on each node.\nUSER \u22ee...\nUSER \u2502 def generic_visit(self, node):\nUSER \u22ee...\nUSER \u2502def main(paths):\nUSER \u22ee...\nUSER \nUSER benchmark/rungrid.py:\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \u2502def run(dirname, model, edit_format):\nUSER \u22ee...\nUSER \nUSER benchmark/swe_bench.py:\nUSER \u22ee...\nUSER \u2502def plot_swe_bench(data_file, is_lite):\nUSER \u22ee...\nUSER \nUSER scripts/blame.py:\nUSER \u22ee...\nUSER \u2502def run(cmd):\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER scripts/issues.py:\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER scripts/my_models.py:\nUSER \u22ee...\nUSER \u2502def collect_model_stats(n_lines=1000):\nUSER \u22ee...\nUSER \u2502def format_text_table(model_stats):\nUSER \u22ee...\nUSER \nUSER scripts/update-history.py:\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER scripts/versionbump.py:\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER scripts/yank-old-versions.py:\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER tests/basic/test_sanity_check_repo.py:\nUSER \u22ee...\nUSER \u2502def mock_repo_wrapper(repo_obj, git_repo_error=None):\nUSER \u22ee...\nUSER \nUSER tests/basic/test_watch.py:\nUSER \u22ee...\nUSER \u2502def test_ai_comment_pattern():\nUSER \u2502 # Create minimal IO and Coder instances for testing\nUSER \u2502 class MinimalCoder:\nUSER \u2502 def __init__(self, io):\nUSER \u2502 self.io = io\nUSER \u2502 self.root = \".\"\nUSER \u2502 self.abs_fnames = set()\nUSER \u2502\nUSER \u2502 def get_rel_fname(self, fname):\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/c/test.c:\nUSER \u22ee...\nUSER \u2502int main() {\nUSER \u2502 printf(\"Hello, World!\\n\");\nUSER \u2502 return 0;\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/cpp/test.cpp:\nUSER \u22ee...\nUSER \u2502int main() {\nUSER \u2502 std::cout << \"Hello, World!\" << std::endl;\nUSER \u2502 return 0;\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/csharp/test.cs:\nUSER \u22ee...\nUSER \u2502namespace Greetings {\nUSER \u2502 public interface IGreeter {\nUSER \u2502 string Greet(string name);\nUSER \u2502 }\nUSER \u2502\nUSER \u2502 public class Person {\nUSER \u2502 public string Name { get; set; }\nUSER \u2502 public int Age { get; set; }\nUSER \u2502\nUSER \u2502 public Person(string name, int age) {\nUSER \u2502 Name = name;\nUSER \u2502 Age = age;\nUSER \u2502 }\nUSER \u22ee...\nUSER \u2502 public class FormalGreeter : IGreeter {\nUSER \u2502 private const string PREFIX = \"Good day\";\nUSER \u2502 private static readonly int MAX_AGE = 150;\nUSER \u2502\nUSER \u2502 public string Greet(string name) {\nUSER \u2502 return $\"{PREFIX}, {name}!\";\nUSER \u2502 }\nUSER \u2502\nUSER \u2502 public string GreetPerson(Person person) {\nUSER \u2502 return $\"{PREFIX}, {person.Name} ({person.Age})!\";\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/elisp/test.el:\nUSER \u22ee...\nUSER \u2502(defun create-formal-greeter ()\nUSER \u22ee...\nUSER \u2502(defun main ()\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/elixir/test.ex:\nUSER \u2502defmodule Greeter do\nUSER \u2502 def hello(name) do\nUSER \u2502 IO.puts(\"Hello, #{name}!\")\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/elm/test.elm:\nUSER \u22ee...\nUSER \u2502type Greeting\nUSER \u2502 = Formal\nUSER \u22ee...\nUSER \u2502greet style person =\nUSER \u2502 let\nUSER \u2502 prefix =\nUSER \u22ee...\nUSER \u2502defaultPerson =\nUSER \u22ee...\nUSER \u2502main =\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/go/test.go:\nUSER \u22ee...\nUSER \u2502type Person struct {\nUSER \u2502 Name string\nUSER \u2502 Age int\nUSER \u22ee...\nUSER \u2502type Greeter interface {\nUSER \u2502 Greet(p Person) string\nUSER \u22ee...\nUSER \u2502type FormalGreeter struct {\nUSER \u2502 Prefix string\nUSER \u22ee...\nUSER \u2502)\nUSER \u2502\nUSER \u2502func (g FormalGreeter) Greet(p Person) string {\nUSER \u2502 return fmt.Sprintf(\"%s, %s! You are %d years old.\",\nUSER \u2502 g.Prefix, p.Name, p.Age)\nUSER \u2502}\nUSER \u2502\nUSER \u2502func NewFormalGreeter() *FormalGreeter {\nUSER \u2502 return &FormalGreeter{Prefix: \"Good day\"}\nUSER \u2502}\nUSER \u2502\nUSER \u2502func main() {\nUSER \u2502 greeter := NewFormalGreeter()\nUSER \u2502 person := Person{Name: DefaultName, Age: 42}\nUSER \u2502 fmt.Println(greeter.Greet(person))\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/java/test.java:\nUSER \u2502public interface Greeting {\nUSER \u2502 String greet(String name);\nUSER \u22ee...\nUSER \u2502public class Test implements Greeting {\nUSER \u2502 private String prefix = \"Hello\";\nUSER \u2502\nUSER \u2502 public String greet(String name) {\nUSER \u2502 return prefix + \", \" + name + \"!\";\nUSER \u2502 }\nUSER \u2502\nUSER \u2502 public static void main(String[] args) {\nUSER \u2502 Test greeter = new Test();\nUSER \u2502 System.out.println(greeter.greet(\"World\"));\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/javascript/test.js:\nUSER \u22ee...\nUSER \u2502class Person {\nUSER \u2502 constructor(name) {\nUSER \u2502 this.name = name;\nUSER \u2502 }\nUSER \u2502\nUSER \u2502 sayHello() {\nUSER \u2502 return `Hello, ${this.name}!`;\nUSER \u2502 }\nUSER \u22ee...\nUSER \u2502function greet(person) {\nUSER \u2502 return person.sayHello();\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/kotlin/test.kt:\nUSER \u2502interface Greeting {\nUSER \u2502 fun greet(name: String): String\nUSER \u22ee...\nUSER \u2502class Test : Greeting {\nUSER \u2502 private val prefix = \"Hello\"\nUSER \u2502\nUSER \u2502 override fun greet(name: String): String {\nUSER \u2502 return \"$prefix, $name!\"\nUSER \u2502 }\nUSER \u22ee...\nUSER \u2502fun main(args: Array) {\nUSER \u2502 val greeter = Test()\nUSER \u2502 println(greeter.greet(\"World\"))\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/ocaml/test.ml:\nUSER \u22ee...\nUSER \u2502module Greeter = struct\nUSER \u2502 type person = {\nUSER \u2502 name: string;\nUSER \u2502 age: int\nUSER \u2502 }\nUSER \u2502\nUSER \u2502 let create_person name age =\nUSER \u2502 {name; age}\nUSER \u2502\nUSER \u2502 let greet person =\nUSER \u2502 Printf.printf \"Hello, %s! You are %d years old.\\n\"\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/php/test.php:\nUSER \u22ee...\nUSER \u2502function greet($name) {\nUSER \u2502 echo \"Hello, $name!\";\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/python/test.py:\nUSER \u22ee...\nUSER \u2502class Person:\nUSER \u2502 \"\"\"A class representing a person.\"\"\"\nUSER \u2502\nUSER \u22ee...\nUSER \u2502 def greet(self, formal: bool = False) -> str:\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/ql/test.ql:\nUSER \u2502predicate greet(string name) {\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/ruby/test.rb:\nUSER \u2502def greet(name)\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/rust/test.rs:\nUSER \u22ee...\nUSER \u2502trait Greeting {\nUSER \u2502 fn greet(&self) -> String;\nUSER \u22ee...\nUSER \u2502struct Person {\nUSER \u2502 name: String,\nUSER \u2502 age: u32,\nUSER \u22ee...\nUSER \u2502impl Greeting for Person {\nUSER \u2502 fn greet(&self) -> String {\nUSER \u2502 format!(\"Hello, {}! You are {} years old.\", self.name, self.age)\nUSER \u2502 }\nUSER \u22ee...\nUSER \u2502fn main() {\nUSER \u2502 let person = Person::new(DEFAULT_NAME.to_string(), 30);\nUSER \u2502 println!(\"{}\", person.greet());\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/typescript/test.ts:\nUSER \u2502function greet(name: string): void {\nUSER \u22ee...\nUSER \nUSER tests/fixtures/sample-code-base/sample.js:\nUSER \u22ee...\nUSER \u2502function greet(name) {\nUSER \u2502 return `Hello, ${name}!`;\nUSER \u22ee...\nUSER \u2502function calculateCircleArea(radius) {\nUSER \u2502 return Math.PI * radius * radius;\nUSER \u22ee...\nUSER \u2502function isPrime(number) {\nUSER \u2502 if (number <= 1) return false;\nUSER \u2502 for (let i = 2; i <= Math.sqrt(number); i++) {\nUSER \u2502 if (number % i === 0) return false;\nUSER \u2502 }\nUSER \u2502 return true;\nUSER \u22ee...\nUSER \u2502function reverseString(str) {\nUSER \u2502 return str.split('').reverse().join('');\nUSER \u22ee...\nUSER \u2502function getRandomNumber(min, max) {\nUSER \u2502 return Math.floor(Math.random() * (max - min + 1)) + min;\nUSER \u22ee...\nUSER \u2502function filterEvenNumbers(numbers) {\nUSER \u2502 return numbers.filter(num => num % 2 !== 0);\nUSER \u22ee...\nUSER \u2502function factorial(n) {\nUSER \u2502 if (n === 0 || n === 1) return 1;\nUSER \u2502 return n * factorial(n - 1);\nUSER \u22ee...\nUSER \nUSER tests/fixtures/sample-code-base/sample.py:\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\n-------\nASSISTANT Ok, I won't try and edit those files without asking first.\n-------\nUSER Don't try and edit any existing code without asking me to add the files to the chat!\nUSER Tell me which files in my repo are the most likely to **need changes** to solve the requests I make, and then stop so I can add them to the chat.\nUSER Only include the files that are most likely to actually need to be edited.\nUSER Don't include files that might contain relevant context, just files that will need to be changed.\n-------\nASSISTANT Ok, based on your requests I will suggest which files need to be edited and then stop and wait for your approval.\n-------\nUSER what is this repo?\n-------\nASSISTANT Based on the file summaries, this appears to be a repository for an AI coding assistant tool called \"aider\". The key components I can identify are:\nASSISTANT \nASSISTANT 1. A core AI coding assistant framework with:\nASSISTANT - Multiple coder implementations (editblock, udiff, wholefile etc)\nASSISTANT - Prompt management system\nASSISTANT - Repository interaction (git integration, file watching)\nASSISTANT - Voice input support\nASSISTANT - GUI interface\nASSISTANT - Analytics tracking\nASSISTANT \nASSISTANT 2. Benchmarking system for evaluating coding assistant performance:\nASSISTANT - Language-specific test fixtures\nASSISTANT - Performance measurement tools\nASSISTANT - Result visualization\nASSISTANT \nASSISTANT 3. Supporting infrastructure:\nASSISTANT - Command line interface\nASSISTANT - Configuration management\nASSISTANT - Error handling\nASSISTANT - Utility functions\nASSISTANT - Documentation/website\nASSISTANT \nASSISTANT The tool seems focused\n-------\nASSISTANT Based on the file summaries, this appears to be a repository for an AI coding assistant tool called \"aider\". The key components I can identify are:\nASSISTANT \nASSISTANT 1. A core AI coding assistant framework with:\nASSISTANT - Multiple coder implementations (editblock, udiff, wholefile etc)\nASSISTANT - Prompt management system\nASSISTANT - Repository interaction (git integration, file watching)\nASSISTANT - Voice input support\nASSISTANT - GUI interface\nASSISTANT - Analytics tracking\nASSISTANT \nASSISTANT 2. Benchmarking system for evaluating coding assistant performance:\nASSISTANT - Language-specific test fixtures\nASSISTANT - Performance measurement tools\nASSISTANT - Result visualization\nASSISTANT \nASSISTANT 3. Supporting infrastructure:\nASSISTANT - Command line interface\nASSISTANT - Configuration management\nASSISTANT - Error handling\nASSISTANT - Utility functions\nASSISTANT - Documentation/website\nASSISTANT \nASSISTANT The tool seems focused\nASSISTANT ^C KeyboardInterrupt\n-------\nUSER pardon?\n-------\nSYSTEM # *SEARCH/REPLACE block* Rules:\nSYSTEM \nSYSTEM Every *SEARCH/REPLACE block* must use this format:\nSYSTEM 1. The *FULL* file path alone on a line, verbatim. No bold asterisks, no quotes around it, no escaping of characters, etc.\nSYSTEM 2. The opening fence and code language, eg: ```python\nSYSTEM 3. The start of search block: <<<<<<< SEARCH\nSYSTEM 4. A contiguous chunk of lines to search for in the existing source code\nSYSTEM 5. The dividing line: =======\nSYSTEM 6. The lines to replace into the source code\nSYSTEM 7. The end of the replace block: >>>>>>> REPLACE\nSYSTEM 8. The closing fence: ```\nSYSTEM \nSYSTEM Use the *FULL* file path, as shown to you by the user.\nSYSTEM \nSYSTEM Every *SEARCH* section must *EXACTLY MATCH* the existing file content, character for character, including all comments, docstrings, etc.\nSYSTEM If the file contains code or other data wrapped/escaped in json/xml/quotes or other containers, you need to propose edits to the literal contents of the file, including the container markup.\nSYSTEM \nSYSTEM *SEARCH/REPLACE* blocks will *only* replace the first match occurrence.\nSYSTEM Including multiple unique *SEARCH/REPLACE* blocks if needed.\nSYSTEM Include enough lines in each SEARCH section to uniquely match each set of lines that need to change.\nSYSTEM \nSYSTEM Keep *SEARCH/REPLACE* blocks concise.\nSYSTEM Break large *SEARCH/REPLACE* blocks into a series of smaller blocks that each change a small portion of the file.\nSYSTEM Include just the changing lines, and a few surrounding lines if needed for uniqueness.\nSYSTEM Do not include long runs of unchanging lines in *SEARCH/REPLACE* blocks.\nSYSTEM \nSYSTEM Only create *SEARCH/REPLACE* blocks for files that the user has added to the chat!\nSYSTEM \nSYSTEM To move code within a file, use 2 *SEARCH/REPLACE* blocks: 1 to delete it from its current location, 1 to insert it in the new location.\nSYSTEM \nSYSTEM Pay attention to which filenames the user wants you to edit, especially if they are asking you to create a new file.\nSYSTEM \nSYSTEM If you want to put code in a new file, use a *SEARCH/REPLACE block* with:\nSYSTEM - A new file path, including dir name if needed\nSYSTEM - An empty `SEARCH` section\nSYSTEM - The new file's contents in the `REPLACE` section\nSYSTEM \nSYSTEM To rename files which have been added to the chat, use shell commands at the end of your response.\nSYSTEM \nSYSTEM If the user just says something like \"ok\" or \"go ahead\" or \"do that\" they probably want you to make SEARCH/REPLACE blocks for the code changes you just proposed.\nSYSTEM The user will say when they've applied your edits. If they haven't explicitly confirmed the edits have been applied, they probably want proper SEARCH/REPLACE blocks.\nSYSTEM \nSYSTEM \nSYSTEM ONLY EVER RETURN CODE IN A *SEARCH/REPLACE BLOCK*!\nSYSTEM \nSYSTEM Examples of when to suggest shell commands:\nSYSTEM \nSYSTEM - If you changed a self-contained html file, suggest an OS-appropriate command to open a browser to view it to see the updated content.\nSYSTEM - If you changed a CLI program, suggest the command to run it to see the new behavior.\nSYSTEM - If you added a test, suggest how to run it with the testing tool used by the project.\nSYSTEM - Suggest OS-appropriate commands to delete or rename files/directories, or other file system operations.\nSYSTEM - If your code changes add new dependencies, suggest the command to install them.\nSYSTEM - Etc.\nSYSTEM "}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737565163} +{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737565178} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737565184} +{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737565186} +{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737565186} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737565191} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737565196} +{"event": "message_send_exception", "properties": {"exception": "Messages don't properly alternate user/assistant:\n\n-------\nSYSTEM Act as an expert software developer.\nSYSTEM Always use best practices when coding.\nSYSTEM Respect and use existing conventions, libraries, etc that are already present in the code base.\nSYSTEM \nSYSTEM Take requests for changes to the supplied code.\nSYSTEM If the request is ambiguous, ask questions.\nSYSTEM \nSYSTEM Always reply to the user in the same language they are using.\nSYSTEM \nSYSTEM Once you understand the request you MUST:\nSYSTEM \nSYSTEM 1. Decide if you need to propose *SEARCH/REPLACE* edits to any files that haven't been added to the chat. You can create new files without asking!\nSYSTEM \nSYSTEM But if you need to propose edits to existing files not already added to the chat, you *MUST* tell the user their full path names and ask them to *add the files to the chat*.\nSYSTEM End your reply and wait for their approval.\nSYSTEM You can keep asking if you then decide you need to edit more files.\nSYSTEM \nSYSTEM 2. Think step-by-step and explain the needed changes in a few short sentences.\nSYSTEM \nSYSTEM 3. Describe each change with a *SEARCH/REPLACE block* per the examples below.\nSYSTEM \nSYSTEM All changes to files must use this *SEARCH/REPLACE block* format.\nSYSTEM ONLY EVER RETURN CODE IN A *SEARCH/REPLACE BLOCK*!\nSYSTEM \nSYSTEM 4. *Concisely* suggest any shell commands the user might want to run in ```bash blocks.\nSYSTEM \nSYSTEM Just suggest shell commands this way, not example code.\nSYSTEM Only suggest complete shell commands that are ready to execute, without placeholders.\nSYSTEM Only suggest at most a few shell commands at a time, not more than 1-3, one per line.\nSYSTEM Do not suggest multi-line shell commands.\nSYSTEM All shell commands will run from the root directory of the user's project.\nSYSTEM \nSYSTEM Use the appropriate shell based on the user's system info:\nSYSTEM - Platform: macOS-15.2-x86_64-i386-64bit\nSYSTEM - Shell: SHELL=/usr/local/Cellar/bash/5.2.26/bin/bash\nSYSTEM - Language: en_US\nSYSTEM - Current date: 2025-01-22\nSYSTEM - The user's pre-commit runs these lint commands, don't suggest running them:\nSYSTEM - /Users/gauthier/Projects/aider/tmp.lint.sh\nSYSTEM \nSYSTEM Examples of when to suggest shell commands:\nSYSTEM \nSYSTEM - If you changed a self-contained html file, suggest an OS-appropriate command to open a browser to view it to see the updated content.\nSYSTEM - If you changed a CLI program, suggest the command to run it to see the new behavior.\nSYSTEM - If you added a test, suggest how to run it with the testing tool used by the project.\nSYSTEM - Suggest OS-appropriate commands to delete or rename files/directories, or other file system operations.\nSYSTEM - If your code changes add new dependencies, suggest the command to install them.\nSYSTEM - Etc.\nSYSTEM \nSYSTEM \nSYSTEM # Example conversations:\nSYSTEM \nSYSTEM ## USER: Change get_factorial() to use math.factorial\nSYSTEM \nSYSTEM ## ASSISTANT: To make this change we need to modify `mathweb/flask/app.py` to:\nSYSTEM \nSYSTEM 1. Import the math package.\nSYSTEM 2. Remove the existing factorial() function.\nSYSTEM 3. Update get_factorial() to call math.factorial instead.\nSYSTEM \nSYSTEM Here are the *SEARCH/REPLACE* blocks:\nSYSTEM \nSYSTEM mathweb/flask/app.py\nSYSTEM ```python\nSYSTEM <<<<<<< SEARCH\nSYSTEM from flask import Flask\nSYSTEM =======\nSYSTEM import math\nSYSTEM from flask import Flask\nSYSTEM >>>>>>> REPLACE\nSYSTEM ```\nSYSTEM \nSYSTEM mathweb/flask/app.py\nSYSTEM ```python\nSYSTEM <<<<<<< SEARCH\nSYSTEM def factorial(n):\nSYSTEM \"compute factorial\"\nSYSTEM \nSYSTEM if n == 0:\nSYSTEM return 1\nSYSTEM else:\nSYSTEM return n * factorial(n-1)\nSYSTEM \nSYSTEM =======\nSYSTEM >>>>>>> REPLACE\nSYSTEM ```\nSYSTEM \nSYSTEM mathweb/flask/app.py\nSYSTEM ```python\nSYSTEM <<<<<<< SEARCH\nSYSTEM return str(factorial(n))\nSYSTEM =======\nSYSTEM return str(math.factorial(n))\nSYSTEM >>>>>>> REPLACE\nSYSTEM ```\nSYSTEM \nSYSTEM \nSYSTEM ## USER: Refactor hello() into its own file.\nSYSTEM \nSYSTEM ## ASSISTANT: To make this change we need to modify `main.py` and make a new file `hello.py`:\nSYSTEM \nSYSTEM 1. Make a new hello.py file with hello() in it.\nSYSTEM 2. Remove hello() from main.py and replace it with an import.\nSYSTEM \nSYSTEM Here are the *SEARCH/REPLACE* blocks:\nSYSTEM \nSYSTEM hello.py\nSYSTEM ```python\nSYSTEM <<<<<<< SEARCH\nSYSTEM =======\nSYSTEM def hello():\nSYSTEM \"print a greeting\"\nSYSTEM \nSYSTEM print(\"hello\")\nSYSTEM >>>>>>> REPLACE\nSYSTEM ```\nSYSTEM \nSYSTEM main.py\nSYSTEM ```python\nSYSTEM <<<<<<< SEARCH\nSYSTEM def hello():\nSYSTEM \"print a greeting\"\nSYSTEM \nSYSTEM print(\"hello\")\nSYSTEM =======\nSYSTEM from hello import hello\nSYSTEM >>>>>>> REPLACE\nSYSTEM ```\nSYSTEM # *SEARCH/REPLACE block* Rules:\nSYSTEM \nSYSTEM Every *SEARCH/REPLACE block* must use this format:\nSYSTEM 1. The *FULL* file path alone on a line, verbatim. No bold asterisks, no quotes around it, no escaping of characters, etc.\nSYSTEM 2. The opening fence and code language, eg: ```python\nSYSTEM 3. The start of search block: <<<<<<< SEARCH\nSYSTEM 4. A contiguous chunk of lines to search for in the existing source code\nSYSTEM 5. The dividing line: =======\nSYSTEM 6. The lines to replace into the source code\nSYSTEM 7. The end of the replace block: >>>>>>> REPLACE\nSYSTEM 8. The closing fence: ```\nSYSTEM \nSYSTEM Use the *FULL* file path, as shown to you by the user.\nSYSTEM \nSYSTEM Every *SEARCH* section must *EXACTLY MATCH* the existing file content, character for character, including all comments, docstrings, etc.\nSYSTEM If the file contains code or other data wrapped/escaped in json/xml/quotes or other containers, you need to propose edits to the literal contents of the file, including the container markup.\nSYSTEM \nSYSTEM *SEARCH/REPLACE* blocks will *only* replace the first match occurrence.\nSYSTEM Including multiple unique *SEARCH/REPLACE* blocks if needed.\nSYSTEM Include enough lines in each SEARCH section to uniquely match each set of lines that need to change.\nSYSTEM \nSYSTEM Keep *SEARCH/REPLACE* blocks concise.\nSYSTEM Break large *SEARCH/REPLACE* blocks into a series of smaller blocks that each change a small portion of the file.\nSYSTEM Include just the changing lines, and a few surrounding lines if needed for uniqueness.\nSYSTEM Do not include long runs of unchanging lines in *SEARCH/REPLACE* blocks.\nSYSTEM \nSYSTEM Only create *SEARCH/REPLACE* blocks for files that the user has added to the chat!\nSYSTEM \nSYSTEM To move code within a file, use 2 *SEARCH/REPLACE* blocks: 1 to delete it from its current location, 1 to insert it in the new location.\nSYSTEM \nSYSTEM Pay attention to which filenames the user wants you to edit, especially if they are asking you to create a new file.\nSYSTEM \nSYSTEM If you want to put code in a new file, use a *SEARCH/REPLACE block* with:\nSYSTEM - A new file path, including dir name if needed\nSYSTEM - An empty `SEARCH` section\nSYSTEM - The new file's contents in the `REPLACE` section\nSYSTEM \nSYSTEM To rename files which have been added to the chat, use shell commands at the end of your response.\nSYSTEM \nSYSTEM If the user just says something like \"ok\" or \"go ahead\" or \"do that\" they probably want you to make SEARCH/REPLACE blocks for the code changes you just proposed.\nSYSTEM The user will say when they've applied your edits. If they haven't explicitly confirmed the edits have been applied, they probably want proper SEARCH/REPLACE blocks.\nSYSTEM \nSYSTEM \nSYSTEM ONLY EVER RETURN CODE IN A *SEARCH/REPLACE BLOCK*!\nSYSTEM \nSYSTEM Examples of when to suggest shell commands:\nSYSTEM \nSYSTEM - If you changed a self-contained html file, suggest an OS-appropriate command to open a browser to view it to see the updated content.\nSYSTEM - If you changed a CLI program, suggest the command to run it to see the new behavior.\nSYSTEM - If you added a test, suggest how to run it with the testing tool used by the project.\nSYSTEM - Suggest OS-appropriate commands to delete or rename files/directories, or other file system operations.\nSYSTEM - If your code changes add new dependencies, suggest the command to install them.\nSYSTEM - Etc.\nSYSTEM \n-------\nUSER I am not sharing any files that you can edit yet.\n-------\nASSISTANT Ok.\n-------\nUSER tell me a story\n-------\nASSISTANT Once upon a time, in a small village nestled between rolling green hills, there lived a young girl named Elara who had a peculiar gift - she could hear the whispers of the wind. \nASSISTANT \nASSISTANT Each morning, as the first\n-------\nASSISTANT Once upon a time, in a small village nestled between rolling green hills, there lived a young girl named Elara who had a peculiar gift - she could hear the whispers of the wind. \nASSISTANT \nASSISTANT Each morning, as the first\nASSISTANT ^C KeyboardInterrupt\n-------\nUSER ?\n-------\nSYSTEM # *SEARCH/REPLACE block* Rules:\nSYSTEM \nSYSTEM Every *SEARCH/REPLACE block* must use this format:\nSYSTEM 1. The *FULL* file path alone on a line, verbatim. No bold asterisks, no quotes around it, no escaping of characters, etc.\nSYSTEM 2. The opening fence and code language, eg: ```python\nSYSTEM 3. The start of search block: <<<<<<< SEARCH\nSYSTEM 4. A contiguous chunk of lines to search for in the existing source code\nSYSTEM 5. The dividing line: =======\nSYSTEM 6. The lines to replace into the source code\nSYSTEM 7. The end of the replace block: >>>>>>> REPLACE\nSYSTEM 8. The closing fence: ```\nSYSTEM \nSYSTEM Use the *FULL* file path, as shown to you by the user.\nSYSTEM \nSYSTEM Every *SEARCH* section must *EXACTLY MATCH* the existing file content, character for character, including all comments, docstrings, etc.\nSYSTEM If the file contains code or other data wrapped/escaped in json/xml/quotes or other containers, you need to propose edits to the literal contents of the file, including the container markup.\nSYSTEM \nSYSTEM *SEARCH/REPLACE* blocks will *only* replace the first match occurrence.\nSYSTEM Including multiple unique *SEARCH/REPLACE* blocks if needed.\nSYSTEM Include enough lines in each SEARCH section to uniquely match each set of lines that need to change.\nSYSTEM \nSYSTEM Keep *SEARCH/REPLACE* blocks concise.\nSYSTEM Break large *SEARCH/REPLACE* blocks into a series of smaller blocks that each change a small portion of the file.\nSYSTEM Include just the changing lines, and a few surrounding lines if needed for uniqueness.\nSYSTEM Do not include long runs of unchanging lines in *SEARCH/REPLACE* blocks.\nSYSTEM \nSYSTEM Only create *SEARCH/REPLACE* blocks for files that the user has added to the chat!\nSYSTEM \nSYSTEM To move code within a file, use 2 *SEARCH/REPLACE* blocks: 1 to delete it from its current location, 1 to insert it in the new location.\nSYSTEM \nSYSTEM Pay attention to which filenames the user wants you to edit, especially if they are asking you to create a new file.\nSYSTEM \nSYSTEM If you want to put code in a new file, use a *SEARCH/REPLACE block* with:\nSYSTEM - A new file path, including dir name if needed\nSYSTEM - An empty `SEARCH` section\nSYSTEM - The new file's contents in the `REPLACE` section\nSYSTEM \nSYSTEM To rename files which have been added to the chat, use shell commands at the end of your response.\nSYSTEM \nSYSTEM If the user just says something like \"ok\" or \"go ahead\" or \"do that\" they probably want you to make SEARCH/REPLACE blocks for the code changes you just proposed.\nSYSTEM The user will say when they've applied your edits. If they haven't explicitly confirmed the edits have been applied, they probably want proper SEARCH/REPLACE blocks.\nSYSTEM \nSYSTEM \nSYSTEM ONLY EVER RETURN CODE IN A *SEARCH/REPLACE BLOCK*!\nSYSTEM \nSYSTEM Examples of when to suggest shell commands:\nSYSTEM \nSYSTEM - If you changed a self-contained html file, suggest an OS-appropriate command to open a browser to view it to see the updated content.\nSYSTEM - If you changed a CLI program, suggest the command to run it to see the new behavior.\nSYSTEM - If you added a test, suggest how to run it with the testing tool used by the project.\nSYSTEM - Suggest OS-appropriate commands to delete or rename files/directories, or other file system operations.\nSYSTEM - If your code changes add new dependencies, suggest the command to install them.\nSYSTEM - Etc.\nSYSTEM "}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737565196} +{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737565320} +{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737565320} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737565337} +{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737565339} +{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737565339} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737565341} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737565345} +{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737565348} +{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737565348} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737565351} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737565356} +{"event": "repo", "properties": {"num_files": 427}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737565359} +{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737565365} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737565516} +{"event": "gui session", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737565517} +{"event": "exit", "properties": {"reason": "GUI session ended"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737565517} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737566658} +{"event": "repo", "properties": {"num_files": 427}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737566660} +{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737566661} +{"event": "command_tokens", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737566662} +{"event": "command_read-only", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737566670} +{"event": "command_tokens", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737566673} +{"event": "command_read-only", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737566684} +{"event": "command_read-only", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737566687} +{"event": "command_tokens", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737566693} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737566698} +{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 105579, "completion_tokens": 0, "total_tokens": 105579, "cost": 0.01478106, "total_cost": 0.01478106}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737566700} +{"event": "command_drop", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737566710} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737566711} +{"event": "message_send_exception", "properties": {"exception": "Messages don't properly alternate user/assistant:\n\n-------\nSYSTEM Act as an expert software developer.\nSYSTEM Always use best practices when coding.\nSYSTEM Respect and use existing conventions, libraries, etc that are already present in the code base.\nSYSTEM \nSYSTEM Take requests for changes to the supplied code.\nSYSTEM If the request is ambiguous, ask questions.\nSYSTEM \nSYSTEM Always reply to the user in the same language they are using.\nSYSTEM \nSYSTEM Once you understand the request you MUST:\nSYSTEM \nSYSTEM 1. Decide if you need to propose *SEARCH/REPLACE* edits to any files that haven't been added to the chat. You can create new files without asking!\nSYSTEM \nSYSTEM But if you need to propose edits to existing files not already added to the chat, you *MUST* tell the user their full path names and ask them to *add the files to the chat*.\nSYSTEM End your reply and wait for their approval.\nSYSTEM You can keep asking if you then decide you need to edit more files.\nSYSTEM \nSYSTEM 2. Think step-by-step and explain the needed changes in a few short sentences.\nSYSTEM \nSYSTEM 3. Describe each change with a *SEARCH/REPLACE block* per the examples below.\nSYSTEM \nSYSTEM All changes to files must use this *SEARCH/REPLACE block* format.\nSYSTEM ONLY EVER RETURN CODE IN A *SEARCH/REPLACE BLOCK*!\nSYSTEM \nSYSTEM 4. *Concisely* suggest any shell commands the user might want to run in ```bash blocks.\nSYSTEM \nSYSTEM Just suggest shell commands this way, not example code.\nSYSTEM Only suggest complete shell commands that are ready to execute, without placeholders.\nSYSTEM Only suggest at most a few shell commands at a time, not more than 1-3, one per line.\nSYSTEM Do not suggest multi-line shell commands.\nSYSTEM All shell commands will run from the root directory of the user's project.\nSYSTEM \nSYSTEM Use the appropriate shell based on the user's system info:\nSYSTEM - Platform: macOS-15.2-x86_64-i386-64bit\nSYSTEM - Shell: SHELL=/usr/local/Cellar/bash/5.2.26/bin/bash\nSYSTEM - Language: en_US\nSYSTEM - Current date: 2025-01-22\nSYSTEM - The user is operating inside a git repository\nSYSTEM - The user's pre-commit runs these lint commands, don't suggest running them:\nSYSTEM - /Users/gauthier/Projects/aider/tmp.lint.sh\nSYSTEM \nSYSTEM Examples of when to suggest shell commands:\nSYSTEM \nSYSTEM - If you changed a self-contained html file, suggest an OS-appropriate command to open a browser to view it to see the updated content.\nSYSTEM - If you changed a CLI program, suggest the command to run it to see the new behavior.\nSYSTEM - If you added a test, suggest how to run it with the testing tool used by the project.\nSYSTEM - Suggest OS-appropriate commands to delete or rename files/directories, or other file system operations.\nSYSTEM - If your code changes add new dependencies, suggest the command to install them.\nSYSTEM - Etc.\nSYSTEM \nSYSTEM \nSYSTEM # Example conversations:\nSYSTEM \nSYSTEM ## USER: Change get_factorial() to use math.factorial\nSYSTEM \nSYSTEM ## ASSISTANT: To make this change we need to modify `mathweb/flask/app.py` to:\nSYSTEM \nSYSTEM 1. Import the math package.\nSYSTEM 2. Remove the existing factorial() function.\nSYSTEM 3. Update get_factorial() to call math.factorial instead.\nSYSTEM \nSYSTEM Here are the *SEARCH/REPLACE* blocks:\nSYSTEM \nSYSTEM mathweb/flask/app.py\nSYSTEM ```python\nSYSTEM <<<<<<< SEARCH\nSYSTEM from flask import Flask\nSYSTEM =======\nSYSTEM import math\nSYSTEM from flask import Flask\nSYSTEM >>>>>>> REPLACE\nSYSTEM ```\nSYSTEM \nSYSTEM mathweb/flask/app.py\nSYSTEM ```python\nSYSTEM <<<<<<< SEARCH\nSYSTEM def factorial(n):\nSYSTEM \"compute factorial\"\nSYSTEM \nSYSTEM if n == 0:\nSYSTEM return 1\nSYSTEM else:\nSYSTEM return n * factorial(n-1)\nSYSTEM \nSYSTEM =======\nSYSTEM >>>>>>> REPLACE\nSYSTEM ```\nSYSTEM \nSYSTEM mathweb/flask/app.py\nSYSTEM ```python\nSYSTEM <<<<<<< SEARCH\nSYSTEM return str(factorial(n))\nSYSTEM =======\nSYSTEM return str(math.factorial(n))\nSYSTEM >>>>>>> REPLACE\nSYSTEM ```\nSYSTEM \nSYSTEM \nSYSTEM ## USER: Refactor hello() into its own file.\nSYSTEM \nSYSTEM ## ASSISTANT: To make this change we need to modify `main.py` and make a new file `hello.py`:\nSYSTEM \nSYSTEM 1. Make a new hello.py file with hello() in it.\nSYSTEM 2. Remove hello() from main.py and replace it with an import.\nSYSTEM \nSYSTEM Here are the *SEARCH/REPLACE* blocks:\nSYSTEM \nSYSTEM hello.py\nSYSTEM ```python\nSYSTEM <<<<<<< SEARCH\nSYSTEM =======\nSYSTEM def hello():\nSYSTEM \"print a greeting\"\nSYSTEM \nSYSTEM print(\"hello\")\nSYSTEM >>>>>>> REPLACE\nSYSTEM ```\nSYSTEM \nSYSTEM main.py\nSYSTEM ```python\nSYSTEM <<<<<<< SEARCH\nSYSTEM def hello():\nSYSTEM \"print a greeting\"\nSYSTEM \nSYSTEM print(\"hello\")\nSYSTEM =======\nSYSTEM from hello import hello\nSYSTEM >>>>>>> REPLACE\nSYSTEM ```\nSYSTEM # *SEARCH/REPLACE block* Rules:\nSYSTEM \nSYSTEM Every *SEARCH/REPLACE block* must use this format:\nSYSTEM 1. The *FULL* file path alone on a line, verbatim. No bold asterisks, no quotes around it, no escaping of characters, etc.\nSYSTEM 2. The opening fence and code language, eg: ```python\nSYSTEM 3. The start of search block: <<<<<<< SEARCH\nSYSTEM 4. A contiguous chunk of lines to search for in the existing source code\nSYSTEM 5. The dividing line: =======\nSYSTEM 6. The lines to replace into the source code\nSYSTEM 7. The end of the replace block: >>>>>>> REPLACE\nSYSTEM 8. The closing fence: ```\nSYSTEM \nSYSTEM Use the *FULL* file path, as shown to you by the user.\nSYSTEM \nSYSTEM Every *SEARCH* section must *EXACTLY MATCH* the existing file content, character for character, including all comments, docstrings, etc.\nSYSTEM If the file contains code or other data wrapped/escaped in json/xml/quotes or other containers, you need to propose edits to the literal contents of the file, including the container markup.\nSYSTEM \nSYSTEM *SEARCH/REPLACE* blocks will *only* replace the first match occurrence.\nSYSTEM Including multiple unique *SEARCH/REPLACE* blocks if needed.\nSYSTEM Include enough lines in each SEARCH section to uniquely match each set of lines that need to change.\nSYSTEM \nSYSTEM Keep *SEARCH/REPLACE* blocks concise.\nSYSTEM Break large *SEARCH/REPLACE* blocks into a series of smaller blocks that each change a small portion of the file.\nSYSTEM Include just the changing lines, and a few surrounding lines if needed for uniqueness.\nSYSTEM Do not include long runs of unchanging lines in *SEARCH/REPLACE* blocks.\nSYSTEM \nSYSTEM Only create *SEARCH/REPLACE* blocks for files that the user has added to the chat!\nSYSTEM \nSYSTEM To move code within a file, use 2 *SEARCH/REPLACE* blocks: 1 to delete it from its current location, 1 to insert it in the new location.\nSYSTEM \nSYSTEM Pay attention to which filenames the user wants you to edit, especially if they are asking you to create a new file.\nSYSTEM \nSYSTEM If you want to put code in a new file, use a *SEARCH/REPLACE block* with:\nSYSTEM - A new file path, including dir name if needed\nSYSTEM - An empty `SEARCH` section\nSYSTEM - The new file's contents in the `REPLACE` section\nSYSTEM \nSYSTEM To rename files which have been added to the chat, use shell commands at the end of your response.\nSYSTEM \nSYSTEM If the user just says something like \"ok\" or \"go ahead\" or \"do that\" they probably want you to make SEARCH/REPLACE blocks for the code changes you just proposed.\nSYSTEM The user will say when they've applied your edits. If they haven't explicitly confirmed the edits have been applied, they probably want proper SEARCH/REPLACE blocks.\nSYSTEM \nSYSTEM \nSYSTEM ONLY EVER RETURN CODE IN A *SEARCH/REPLACE BLOCK*!\nSYSTEM \nSYSTEM Examples of when to suggest shell commands:\nSYSTEM \nSYSTEM - If you changed a self-contained html file, suggest an OS-appropriate command to open a browser to view it to see the updated content.\nSYSTEM - If you changed a CLI program, suggest the command to run it to see the new behavior.\nSYSTEM - If you added a test, suggest how to run it with the testing tool used by the project.\nSYSTEM - Suggest OS-appropriate commands to delete or rename files/directories, or other file system operations.\nSYSTEM - If your code changes add new dependencies, suggest the command to install them.\nSYSTEM - Etc.\nSYSTEM \n-------\nUSER Here are summaries of some files present in my git repository.\nUSER Do not propose changes to these files, treat them as *read-only*.\nUSER If you need to edit any of these files, ask me to *add them to the chat* first.\nUSER \nUSER aider/analytics.py:\nUSER \u22ee...\nUSER \u2502def compute_hex_threshold(percent):\nUSER \u22ee...\nUSER \u2502def is_uuid_in_percentage(uuid_str, percent):\nUSER \u22ee...\nUSER \u2502class Analytics:\nUSER \u2502 # providers\nUSER \u2502 mp = None\nUSER \u22ee...\nUSER \u2502 def disable(self, permanently):\nUSER \u22ee...\nUSER \u2502 def get_data_file_path(self):\nUSER \u22ee...\nUSER \u2502 def get_or_create_uuid(self):\nUSER \u22ee...\nUSER \u2502 def load_data(self):\nUSER \u22ee...\nUSER \u2502 def save_data(self):\nUSER \u22ee...\nUSER \u2502 def get_system_info(self):\nUSER \u22ee...\nUSER \u2502 def event(self, event_name, main_model=None, **kwargs):\nUSER \u22ee...\nUSER \nUSER aider/args.py:\nUSER \u22ee...\nUSER \u2502def get_parser(default_config_files, git_root):\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER aider/args_formatter.py:\nUSER \u22ee...\nUSER \u2502class DotEnvFormatter(argparse.HelpFormatter):\nUSER \u2502 def start_section(self, heading):\nUSER \u2502 res = \"\\n\\n\"\nUSER \u2502 res += \"#\" * (len(heading) + 3)\nUSER \u2502 res += f\"\\n# {heading}\"\nUSER \u22ee...\nUSER \u2502 def _format_usage(self, usage, actions, groups, prefix):\nUSER \u22ee...\nUSER \u2502class YamlHelpFormatter(argparse.HelpFormatter):\nUSER \u2502 def start_section(self, heading):\nUSER \u2502 res = \"\\n\\n\"\nUSER \u2502 res += \"#\" * (len(heading) + 3)\nUSER \u2502 res += f\"\\n# {heading}\"\nUSER \u22ee...\nUSER \u2502 def _format_usage(self, usage, actions, groups, prefix):\nUSER \u22ee...\nUSER \u2502class MarkdownHelpFormatter(argparse.HelpFormatter):\nUSER \u2502 def start_section(self, heading):\nUSER \u22ee...\nUSER \u2502 def _format_usage(self, usage, actions, groups, prefix):\nUSER \u22ee...\nUSER \nUSER aider/coders/architect_prompts.py:\nUSER \u22ee...\nUSER \u2502class ArchitectPrompts(CoderPrompts):\nUSER \u22ee...\nUSER \nUSER aider/coders/ask_prompts.py:\nUSER \u22ee...\nUSER \u2502class AskPrompts(CoderPrompts):\nUSER \u22ee...\nUSER \nUSER aider/coders/base_coder.py:\nUSER \u22ee...\nUSER \u2502class Coder:\nUSER \u2502 abs_fnames = None\nUSER \u22ee...\nUSER \u2502 @classmethod\nUSER \u2502 def create(\nUSER \u2502 self,\nUSER \u2502 main_model=None,\nUSER \u2502 edit_format=None,\nUSER \u2502 io=None,\nUSER \u2502 from_coder=None,\nUSER \u2502 summarize_from_coder=True,\nUSER \u2502 **kwargs,\nUSER \u22ee...\nUSER \u2502 def get_announcements(self):\nUSER \u22ee...\nUSER \u2502 def show_announcements(self):\nUSER \u22ee...\nUSER \u2502 def add_rel_fname(self, rel_fname):\nUSER \u22ee...\nUSER \u2502 def drop_rel_fname(self, fname):\nUSER \u22ee...\nUSER \u2502 def abs_root_path(self, path):\nUSER \u22ee...\nUSER \u2502 def get_repo_map(self, force_refresh=False):\nUSER \u22ee...\nUSER \u2502 def run_stream(self, user_message):\nUSER \u22ee...\nUSER \u2502 def run(self, with_message=None, preproc=True):\nUSER \u22ee...\nUSER \u2502 def fmt_system_prompt(self, prompt):\nUSER \u22ee...\nUSER \u2502 def format_messages(self):\nUSER \u22ee...\nUSER \u2502 def get_multi_response_content(self, final=False):\nUSER \u22ee...\nUSER \u2502 def get_rel_fname(self, fname):\nUSER \u22ee...\nUSER \u2502 def get_inchat_relative_files(self):\nUSER \u22ee...\nUSER \u2502 def get_all_relative_files(self):\nUSER \u22ee...\nUSER \u2502 def allowed_to_edit(self, path):\nUSER \u22ee...\nUSER \u2502 def check_added_files(self):\nUSER \u22ee...\nUSER \u2502 def apply_updates(self):\nUSER \u22ee...\nUSER \u2502 def parse_partial_args(self):\nUSER \u22ee...\nUSER \nUSER aider/coders/base_prompts.py:\nUSER \u2502class CoderPrompts:\nUSER \u22ee...\nUSER \nUSER aider/coders/chat_chunks.py:\nUSER \u22ee...\nUSER \u2502@dataclass\nUSER \u2502class ChatChunks:\nUSER \u2502 system: List = field(default_factory=list)\nUSER \u22ee...\nUSER \u2502 def all_messages(self):\nUSER \u22ee...\nUSER \u2502 def add_cache_control(self, messages):\nUSER \u22ee...\nUSER \nUSER aider/coders/editblock_coder.py:\nUSER \u22ee...\nUSER \u2502def do_replace(fname, content, before_text, after_text, fence=None):\nUSER \u22ee...\nUSER \u2502def find_original_update_blocks(content, fence=DEFAULT_FENCE, valid_fnames=None):\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER aider/coders/editblock_fenced_prompts.py:\nUSER \u22ee...\nUSER \u2502class EditBlockFencedPrompts(EditBlockPrompts):\nUSER \u22ee...\nUSER \nUSER aider/coders/editblock_func_prompts.py:\nUSER \u22ee...\nUSER \u2502class EditBlockFunctionPrompts(CoderPrompts):\nUSER \u22ee...\nUSER \nUSER aider/coders/editblock_prompts.py:\nUSER \u22ee...\nUSER \u2502class EditBlockPrompts(CoderPrompts):\nUSER \u22ee...\nUSER \nUSER aider/coders/editor_editblock_prompts.py:\nUSER \u22ee...\nUSER \u2502class EditorEditBlockPrompts(EditBlockPrompts):\nUSER \u22ee...\nUSER \nUSER aider/coders/editor_whole_prompts.py:\nUSER \u22ee...\nUSER \u2502class EditorWholeFilePrompts(WholeFilePrompts):\nUSER \u22ee...\nUSER \nUSER aider/coders/help_prompts.py:\nUSER \u22ee...\nUSER \u2502class HelpPrompts(CoderPrompts):\nUSER \u22ee...\nUSER \nUSER aider/coders/search_replace.py:\nUSER \u22ee...\nUSER \u2502def try_strategy(texts, strategy, preproc):\nUSER \u22ee...\nUSER \u2502def read_text(fname):\nUSER \u22ee...\nUSER \u2502def main(dnames):\nUSER \u22ee...\nUSER \nUSER aider/coders/single_wholefile_func_prompts.py:\nUSER \u22ee...\nUSER \u2502class SingleWholeFileFunctionPrompts(CoderPrompts):\nUSER \u22ee...\nUSER \nUSER aider/coders/udiff_coder.py:\nUSER \u22ee...\nUSER \u2502def do_replace(fname, content, hunk):\nUSER \u22ee...\nUSER \u2502def directly_apply_hunk(content, hunk):\nUSER \u22ee...\nUSER \u2502def hunk_to_before_after(hunk, lines=False):\nUSER \u22ee...\nUSER \nUSER aider/coders/wholefile_func_prompts.py:\nUSER \u22ee...\nUSER \u2502class WholeFileFunctionPrompts(CoderPrompts):\nUSER \u22ee...\nUSER \nUSER aider/coders/wholefile_prompts.py:\nUSER \u22ee...\nUSER \u2502class WholeFilePrompts(CoderPrompts):\nUSER \u22ee...\nUSER \nUSER aider/commands.py:\nUSER \u22ee...\nUSER \u2502class Commands:\nUSER \u2502 voice = None\nUSER \u22ee...\nUSER \u2502 def get_raw_completions(self, cmd):\nUSER \u22ee...\nUSER \u2502 def get_completions(self, cmd):\nUSER \u22ee...\nUSER \u2502 def get_commands(self):\nUSER \u22ee...\nUSER \u2502 def matching_commands(self, inp):\nUSER \u22ee...\nUSER \u2502 def run(self, inp):\nUSER \u22ee...\nUSER \u2502 def cmd_undo(self, args):\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER aider/copypaste.py:\nUSER \u22ee...\nUSER \u2502class ClipboardWatcher:\nUSER \u2502 \"\"\"Watches clipboard for changes and updates IO placeholder\"\"\"\nUSER \u2502\nUSER \u22ee...\nUSER \u2502 def start(self):\nUSER \u22ee...\nUSER \u2502 def stop(self):\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER aider/diffs.py:\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \u2502def diff_partial_update(lines_orig, lines_updated, final=False, fname=None):\nUSER \u22ee...\nUSER \nUSER aider/dump.py:\nUSER \u22ee...\nUSER \u2502def cvt(s):\nUSER \u22ee...\nUSER \u2502def dump(*vals):\nUSER \u22ee...\nUSER \nUSER aider/editor.py:\nUSER \u22ee...\nUSER \u2502def print_status_message(success, message, style=None):\nUSER \u22ee...\nUSER \u2502def write_temp_file(\nUSER \u2502 input_data=\"\",\nUSER \u2502 suffix=None,\nUSER \u2502 prefix=None,\nUSER \u2502 dir=None,\nUSER \u22ee...\nUSER \u2502def get_environment_editor(default=None):\nUSER \u22ee...\nUSER \u2502def discover_editor(editor_override=None):\nUSER \u22ee...\nUSER \u2502def pipe_editor(input_data=\"\", suffix=None, editor=None):\nUSER \u22ee...\nUSER \nUSER aider/exceptions.py:\nUSER \u22ee...\nUSER \u2502@dataclass\nUSER \u2502class ExInfo:\nUSER \u22ee...\nUSER \u2502class LiteLLMExceptions:\nUSER \u2502 exceptions = dict()\nUSER \u2502\nUSER \u22ee...\nUSER \u2502 def _load(self, strict=False):\nUSER \u22ee...\nUSER \u2502 def exceptions_tuple(self):\nUSER \u22ee...\nUSER \u2502 def get_ex_info(self, ex):\nUSER \u22ee...\nUSER \nUSER aider/format_settings.py:\nUSER \u2502def scrub_sensitive_info(args, text):\nUSER \u22ee...\nUSER \nUSER aider/gui.py:\nUSER \u22ee...\nUSER \u2502class CaptureIO(InputOutput):\nUSER \u2502 lines = []\nUSER \u2502\nUSER \u2502 def tool_output(self, msg, log_only=False):\nUSER \u22ee...\nUSER \u2502 def tool_error(self, msg):\nUSER \u22ee...\nUSER \u2502 def tool_warning(self, msg):\nUSER \u22ee...\nUSER \u2502 def get_captured_lines(self):\nUSER \u22ee...\nUSER \u2502def search(text=None):\nUSER \u22ee...\nUSER \u2502class State:\nUSER \u2502 keys = set()\nUSER \u2502\nUSER \u2502 def init(self, key, val=None):\nUSER \u22ee...\nUSER \u2502@st.cache_resource\nUSER \u2502def get_state():\nUSER \u22ee...\nUSER \u2502@st.cache_resource\nUSER \u2502def get_coder():\nUSER \u22ee...\nUSER \u2502class GUI:\nUSER \u2502 prompt = None\nUSER \u22ee...\nUSER \u2502 def announce(self):\nUSER \u22ee...\nUSER \u2502 def show_edit_info(self, edit):\nUSER \u22ee...\nUSER \u2502 def add_undo(self, commit_hash):\nUSER \u22ee...\nUSER \u2502 def do_sidebar(self):\nUSER \u22ee...\nUSER \u2502 def do_add_to_chat(self):\nUSER \u22ee...\nUSER \u2502 def do_add_files(self):\nUSER \u22ee...\nUSER \u2502 def do_add_web_page(self):\nUSER \u22ee...\nUSER \u2502 def do_clear_chat_history(self):\nUSER \u22ee...\nUSER \u2502 def do_recent_msgs(self):\nUSER \u22ee...\nUSER \u2502 def do_messages_container(self):\nUSER \u22ee...\nUSER \u2502 def initialize_state(self):\nUSER \u22ee...\nUSER \u2502 def button(self, args, **kwargs):\nUSER \u22ee...\nUSER \u2502 def prompt_pending(self):\nUSER \u22ee...\nUSER \u2502 def process_chat(self):\nUSER \u22ee...\nUSER \u2502 def info(self, message, echo=True):\nUSER \u22ee...\nUSER \u2502 def do_web(self):\nUSER \u22ee...\nUSER \u2502 def do_undo(self, commit_hash):\nUSER \u22ee...\nUSER \u2502def gui_main():\nUSER \u22ee...\nUSER \nUSER aider/help.py:\nUSER \u22ee...\nUSER \u2502def get_package_files():\nUSER \u22ee...\nUSER \u2502def fname_to_url(filepath):\nUSER \u22ee...\nUSER \u2502def get_index():\nUSER \u22ee...\nUSER \nUSER aider/history.py:\nUSER \u22ee...\nUSER \u2502class ChatSummary:\nUSER \u2502 def __init__(self, models=None, max_tokens=1024):\nUSER \u2502 if not models:\nUSER \u2502 raise ValueError(\"At least one model must be provided\")\nUSER \u2502 self.models = models if isinstance(models, list) else [models]\nUSER \u2502 self.max_tokens = max_tokens\nUSER \u22ee...\nUSER \u2502 def too_big(self, messages):\nUSER \u22ee...\nUSER \u2502 def tokenize(self, messages):\nUSER \u22ee...\nUSER \u2502 def summarize(self, messages, depth=0):\nUSER \u22ee...\nUSER \u2502 def summarize_real(self, messages, depth=0):\nUSER \u22ee...\nUSER \u2502 def summarize_all(self, messages):\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER aider/io.py:\nUSER \u22ee...\nUSER \u2502class AutoCompleter(Completer):\nUSER \u2502 def __init__(\nUSER \u2502 self, root, rel_fnames, addable_rel_fnames, commands, encoding, abs_read_only_fnames=None\nUSER \u22ee...\nUSER \u2502 def tokenize(self):\nUSER \u22ee...\nUSER \u2502 def get_command_completions(self, document, complete_event, text, words):\nUSER \u22ee...\nUSER \u2502 def get_completions(self, document, complete_event):\nUSER \u22ee...\nUSER \u2502class InputOutput:\nUSER \u2502 num_error_outputs = 0\nUSER \u22ee...\nUSER \u2502 def _get_style(self):\nUSER \u22ee...\nUSER \u2502 def read_image(self, filename):\nUSER \u22ee...\nUSER \u2502 def read_text(self, filename, silent=False):\nUSER \u22ee...\nUSER \u2502 def write_text(self, filename, content, max_retries=5, initial_delay=0.1):\nUSER \u22ee...\nUSER \u2502 def rule(self):\nUSER \u22ee...\nUSER \u2502 def interrupt_input(self):\nUSER \u22ee...\nUSER \u2502 def get_input(\nUSER \u2502 self,\nUSER \u2502 root,\nUSER \u2502 rel_fnames,\nUSER \u2502 addable_rel_fnames,\nUSER \u2502 commands,\nUSER \u2502 abs_read_only_fnames=None,\nUSER \u2502 edit_format=None,\nUSER \u2502 ):\nUSER \u2502 self.rule()\nUSER \u2502\nUSER \u22ee...\nUSER \u2502 def suspend_to_bg(event):\nUSER \u22ee...\nUSER \u2502 def add_to_input_history(self, inp):\nUSER \u22ee...\nUSER \u2502 def get_input_history(self):\nUSER \u22ee...\nUSER \u2502 def display_user_input(self, inp):\nUSER \u22ee...\nUSER \u2502 def user_input(self, inp, log_only=True):\nUSER \u22ee...\nUSER \u2502 def confirm_ask(\nUSER \u2502 self,\nUSER \u2502 question,\nUSER \u2502 default=\"y\",\nUSER \u2502 subject=None,\nUSER \u2502 explicit_yes_required=False,\nUSER \u2502 group=None,\nUSER \u2502 allow_never=False,\nUSER \u22ee...\nUSER \u2502 def _tool_message(self, message=\"\", strip=True, color=None):\nUSER \u22ee...\nUSER \u2502 def tool_error(self, message=\"\", strip=True):\nUSER \u22ee...\nUSER \u2502 def tool_warning(self, message=\"\", strip=True):\nUSER \u22ee...\nUSER \u2502 def tool_output(self, *messages, log_only=False, bold=False):\nUSER \u22ee...\nUSER \u2502 def print(self, message=\"\"):\nUSER \u22ee...\nUSER \u2502 def append_chat_history(self, text, linebreak=False, blockquote=False, strip=True):\nUSER \u22ee...\nUSER \u2502 def format_files_for_input(self, rel_fnames, rel_read_only_fnames):\nUSER \u22ee...\nUSER \u2502def get_rel_fname(fname, root):\nUSER \u22ee...\nUSER \nUSER aider/linter.py:\nUSER \u22ee...\nUSER \u2502class Linter:\nUSER \u2502 def __init__(self, encoding=\"utf-8\", root=None):\nUSER \u2502 self.encoding = encoding\nUSER \u2502 self.root = root\nUSER \u2502\nUSER \u2502 self.languages = dict(\nUSER \u2502 python=self.py_lint,\nUSER \u2502 )\nUSER \u22ee...\nUSER \u2502 def get_rel_fname(self, fname):\nUSER \u22ee...\nUSER \u2502 def run_cmd(self, cmd, rel_fname, code):\nUSER \u22ee...\nUSER \u2502 def errors_to_lint_result(self, rel_fname, errors):\nUSER \u22ee...\nUSER \u2502 def lint(self, fname, cmd=None):\nUSER \u22ee...\nUSER \u2502@dataclass\nUSER \u2502class LintResult:\nUSER \u22ee...\nUSER \u2502def basic_lint(fname, code):\nUSER \u22ee...\nUSER \u2502def traverse_tree(node):\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER aider/llm.py:\nUSER \u22ee...\nUSER \u2502class LazyLiteLLM:\nUSER \u22ee...\nUSER \nUSER aider/main.py:\nUSER \u22ee...\nUSER \u2502def sanity_check_repo(repo, io):\nUSER \u22ee...\nUSER \u2502def main(argv=None, input=None, output=None, force_git_root=None, return_coder=False):\nUSER \u22ee...\nUSER \nUSER aider/mdstream.py:\nUSER \u22ee...\nUSER \u2502class MarkdownStream:\nUSER \u2502 \"\"\"Streaming markdown renderer that progressively displays content with a live updating window.\nUSER \u2502\nUSER \u2502 Uses rich.console and rich.live to render markdown content with smooth scrolling\nUSER \u2502 and partial updates. Maintains a sliding window of visible content while streaming\nUSER \u2502 in new markdown text.\nUSER \u22ee...\nUSER \u2502 def update(self, text, final=False):\nUSER \u22ee...\nUSER \nUSER aider/models.py:\nUSER \u22ee...\nUSER \u2502@dataclass\nUSER \u2502class ModelSettings:\nUSER \u22ee...\nUSER \u2502class ModelInfoManager:\nUSER \u2502 MODEL_INFO_URL = (\nUSER \u2502 \"https://raw.githubusercontent.com/BerriAI/litellm/main/\"\nUSER \u2502 \"model_prices_and_context_window.json\"\nUSER \u22ee...\nUSER \u2502 def get_model_from_cached_json_db(self, model):\nUSER \u22ee...\nUSER \u2502 def get_model_info(self, model):\nUSER \u22ee...\nUSER \u2502class Model(ModelSettings):\nUSER \u2502 def __init__(self, model, weak_model=None, editor_model=None, editor_edit_format=None):\nUSER \u2502 # Map any alias to its canonical name\nUSER \u2502 model = MODEL_ALIASES.get(model, model)\nUSER \u2502\nUSER \u2502 self.name = model\nUSER \u2502\nUSER \u2502 self.max_chat_history_tokens = 1024\nUSER \u2502 self.weak_model = None\nUSER \u2502 self.editor_model = None\nUSER \u2502\nUSER \u22ee...\nUSER \u2502 def get_model_info(self, model):\nUSER \u22ee...\nUSER \u2502 def token_count(self, messages):\nUSER \u22ee...\nUSER \u2502def validate_variables(vars):\nUSER \u22ee...\nUSER \u2502def sanity_check_model(io, model):\nUSER \u22ee...\nUSER \u2502def fuzzy_match_models(name):\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER aider/repo.py:\nUSER \u22ee...\nUSER \u2502class GitRepo:\nUSER \u2502 repo = None\nUSER \u22ee...\nUSER \u2502 def commit(self, fnames=None, context=None, message=None, aider_edits=False):\nUSER \u22ee...\nUSER \u2502 def get_commit_message(self, diffs, context):\nUSER \u22ee...\nUSER \u2502 def get_diffs(self, fnames=None):\nUSER \u22ee...\nUSER \u2502 def diff_commits(self, pretty, from_commit, to_commit):\nUSER \u22ee...\nUSER \u2502 def get_tracked_files(self):\nUSER \u22ee...\nUSER \u2502 def normalize_path(self, path):\nUSER \u22ee...\nUSER \u2502 def refresh_aider_ignore(self):\nUSER \u22ee...\nUSER \u2502 def ignored_file(self, fname):\nUSER \u22ee...\nUSER \u2502 def ignored_file_raw(self, fname):\nUSER \u22ee...\nUSER \u2502 def path_in_repo(self, path):\nUSER \u22ee...\nUSER \u2502 def abs_root_path(self, path):\nUSER \u22ee...\nUSER \u2502 def is_dirty(self, path=None):\nUSER \u22ee...\nUSER \u2502 def get_head_commit(self):\nUSER \u22ee...\nUSER \u2502 def get_head_commit_sha(self, short=False):\nUSER \u22ee...\nUSER \nUSER aider/repomap.py:\nUSER \u22ee...\nUSER \u2502class RepoMap:\nUSER \u2502 CACHE_VERSION = 3\nUSER \u22ee...\nUSER \u2502 def token_count(self, text):\nUSER \u22ee...\nUSER \u2502 def get_repo_map(\nUSER \u2502 self,\nUSER \u2502 chat_files,\nUSER \u2502 other_files,\nUSER \u2502 mentioned_fnames=None,\nUSER \u2502 mentioned_idents=None,\nUSER \u2502 force_refresh=False,\nUSER \u22ee...\nUSER \u2502 def get_rel_fname(self, fname):\nUSER \u22ee...\nUSER \u2502 def tags_cache_error(self, original_error=None):\nUSER \u22ee...\nUSER \u2502def get_scm_fname(lang):\nUSER \u22ee...\nUSER \nUSER aider/report.py:\nUSER \u22ee...\nUSER \u2502def report_github_issue(issue_text, title=None, confirm=True):\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER aider/run_cmd.py:\nUSER \u22ee...\nUSER \u2502def run_cmd(command, verbose=False, error_print=None, cwd=None):\nUSER \u22ee...\nUSER \u2502def get_windows_parent_process_name():\nUSER \u22ee...\nUSER \u2502def run_cmd_subprocess(command, verbose=False, cwd=None, encoding=sys.stdout.encoding):\nUSER \u22ee...\nUSER \u2502def run_cmd_pexpect(command, verbose=False, cwd=None):\nUSER \u22ee...\nUSER \nUSER aider/scrape.py:\nUSER \u22ee...\nUSER \u2502class Scraper:\nUSER \u2502 pandoc_available = None\nUSER \u22ee...\nUSER \u2502 def scrape(self, url):\nUSER \u22ee...\nUSER \u2502def main(url):\nUSER \u22ee...\nUSER \nUSER aider/sendchat.py:\nUSER \u22ee...\nUSER \u2502def sanity_check_messages(messages):\nUSER \u22ee...\nUSER \u2502def send_completion(\nUSER \u2502 model_name,\nUSER \u2502 messages,\nUSER \u2502 functions,\nUSER \u2502 stream,\nUSER \u2502 temperature=0,\nUSER \u2502 extra_params=None,\nUSER \u22ee...\nUSER \u2502def simple_send_with_retries(model, messages):\nUSER \u22ee...\nUSER \nUSER aider/special.py:\nUSER \u22ee...\nUSER \u2502def is_important(file_path):\nUSER \u22ee...\nUSER \u2502def filter_important_files(file_paths):\nUSER \u22ee...\nUSER \nUSER aider/utils.py:\nUSER \u22ee...\nUSER \u2502class IgnorantTemporaryDirectory:\nUSER \u2502 def __init__(self):\nUSER \u2502 if sys.version_info >= (3, 10):\nUSER \u2502 self.temp_dir = tempfile.TemporaryDirectory(ignore_cleanup_errors=True)\nUSER \u2502 else:\nUSER \u22ee...\nUSER \u2502 def cleanup(self):\nUSER \u22ee...\nUSER \u2502class GitTemporaryDirectory(ChdirTemporaryDirectory):\nUSER \u22ee...\nUSER \u2502def make_repo(path=None):\nUSER \u22ee...\nUSER \u2502def is_image_file(file_name):\nUSER \u22ee...\nUSER \u2502def safe_abs_path(res):\nUSER \u22ee...\nUSER \u2502def format_content(role, content):\nUSER \u22ee...\nUSER \u2502def format_messages(messages, title=None):\nUSER \u22ee...\nUSER \u2502def split_chat_history_markdown(text, include_tool=False):\nUSER \u2502 messages = []\nUSER \u22ee...\nUSER \u2502 def append_msg(role, lines):\nUSER \u22ee...\nUSER \u2502def get_pip_install(args):\nUSER \u22ee...\nUSER \u2502def run_install(cmd):\nUSER \u22ee...\nUSER \u2502class Spinner:\nUSER \u2502 unicode_spinner = [\"\u280b\", \"\u2819\", \"\u2839\", \"\u2838\", \"\u283c\", \"\u2834\", \"\u2826\", \"\u2827\", \"\u2807\", \"\u280f\"]\nUSER \u22ee...\nUSER \u2502 def step(self):\nUSER \u22ee...\nUSER \u2502 def end(self):\nUSER \u22ee...\nUSER \u2502def check_pip_install_extra(io, module, prompt, pip_install_cmd, self_update=False):\nUSER \u22ee...\nUSER \u2502def printable_shell_command(cmd_list):\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER aider/voice.py:\nUSER \u22ee...\nUSER \u2502class SoundDeviceError(Exception):\nUSER \u22ee...\nUSER \u2502class Voice:\nUSER \u2502 max_rms = 0\nUSER \u22ee...\nUSER \u2502 def record_and_transcribe(self, history=None, language=None):\nUSER \u22ee...\nUSER \u2502 def raw_record_and_transcribe(self, history, language):\nUSER \u22ee...\nUSER \nUSER aider/watch.py:\nUSER \u22ee...\nUSER \u2502def load_gitignores(gitignore_paths: list[Path]) -> Optional[PathSpec]:\nUSER \u22ee...\nUSER \u2502class FileWatcher:\nUSER \u2502 \"\"\"Watches source files for changes and AI comments\"\"\"\nUSER \u2502\nUSER \u22ee...\nUSER \u2502 def start(self):\nUSER \u22ee...\nUSER \u2502 def stop(self):\nUSER \u22ee...\nUSER \u2502 def process_changes(self):\nUSER \u22ee...\nUSER \u2502 def get_ai_comments(self, filepath):\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER aider/website/_includes/code-in-json-benchmark.js:\nUSER \u22ee...\nUSER \u2502 function getAspectRatio() {\nUSER \u2502 var width = chartContainer.offsetWidth;\nUSER \u2502 // Gradually change aspect ratio from 2 (landscape) to 1 (square)\nUSER \u2502 return Math.max(1, Math.min(2, width / 300));\nUSER \u22ee...\nUSER \u2502 function resizeChart() {\nUSER \u2502 chart.options.aspectRatio = getAspectRatio();\nUSER \u2502 chart.resize();\nUSER \u22ee...\nUSER \u2502function createStripedCanvas(isStrict) {\nUSER \u2502 const patternCanvas = document.createElement('canvas');\nUSER \u2502 const patternContext = patternCanvas.getContext('2d');\nUSER \u2502 const size = 10;\nUSER \u2502 patternCanvas.width = size;\nUSER \u2502 patternCanvas.height = size;\nUSER \u2502\nUSER \u2502 patternContext.fillStyle = 'rgba(255, 99, 132, 0.8)';\nUSER \u2502 patternContext.fillRect(0, 0, size, size);\nUSER \u2502\nUSER \u22ee...\nUSER \nUSER aider/website/_includes/code-in-json-syntax.js:\nUSER \u22ee...\nUSER \u2502 function getAspectRatio() {\nUSER \u2502 var width = chartContainer.offsetWidth;\nUSER \u2502 // Gradually change aspect ratio from 2 (landscape) to 1 (square)\nUSER \u2502 return Math.max(1, Math.min(2, width / 300));\nUSER \u22ee...\nUSER \u2502 function resizeChart() {\nUSER \u2502 chart.options.aspectRatio = getAspectRatio();\nUSER \u2502 chart.resize();\nUSER \u22ee...\nUSER \nUSER aider/website/_includes/leaderboard.js:\nUSER \u22ee...\nUSER \u2502 function updateChart() {\nUSER \u2502 var selectedRows = document.querySelectorAll('tr.selected');\nUSER \u2502 var showAll = selectedRows.length === 0;\nUSER \u2502\nUSER \u2502 displayedData = [];\nUSER \u2502 leaderboardData.labels = [];\nUSER \u2502 leaderboardData.datasets[0].data = [];\nUSER \u2502\nUSER \u2502 allData.forEach(function(row, index) {\nUSER \u2502 var rowElement = document.getElementById('edit-row-' + index);\nUSER \u22ee...\nUSER \nUSER aider/website/_includes/quant-chart.js:\nUSER \u22ee...\nUSER \u2502 function updateChart(filterText) {\nUSER \u2502 var filteredData = allData.filter(row => \nUSER \u2502 row.model.toLowerCase().includes(filterText.toLowerCase())\nUSER \u2502 );\nUSER \u2502 \nUSER \u2502 var chartData = {\nUSER \u2502 labels: filteredData.map(row => row.model),\nUSER \u2502 datasets: [{\nUSER \u2502 label: 'Percent completed correctly',\nUSER \u2502 data: filteredData.map(row => row.pass_rate_2),\nUSER \u22ee...\nUSER \nUSER aider/website/_includes/qwq-chart.js:\nUSER \u22ee...\nUSER \u2502 function updateChart(filterText) {\nUSER \u2502 var filteredData = allData.filter(row => \nUSER \u2502 row.model.toLowerCase().includes(filterText.toLowerCase())\nUSER \u2502 );\nUSER \u2502 \nUSER \u2502 var chartData = {\nUSER \u2502 labels: filteredData.map(row => row.model),\nUSER \u2502 datasets: [{\nUSER \u2502 data: filteredData.map(row => row.pass_rate_2),\nUSER \u2502 backgroundColor: filteredData.map(row => \nUSER \u22ee...\nUSER \nUSER benchmark/benchmark.py:\nUSER \u22ee...\nUSER \u2502@app.command()\nUSER \u2502def main(\nUSER \u2502 dirnames: Optional[List[str]] = typer.Argument(None, help=\"Directory names\"),\nUSER \u2502 graphs: bool = typer.Option(False, \"--graphs\", help=\"Generate graphs\"),\nUSER \u2502 model: str = typer.Option(\"gpt-3.5-turbo\", \"--model\", \"-m\", help=\"Model name\"),\nUSER \u2502 sleep: float = typer.Option(\nUSER \u2502 0, \"--sleep\", help=\"Sleep seconds between tests when single threaded\"\nUSER \u2502 ),\nUSER \u2502 languages: str = typer.Option(\nUSER \u2502 None, \"--languages\", \"-l\", help=\"Only run tests for specific languages (comma separated)\"\nUSER \u2502 ),\nUSER \u22ee...\nUSER \u2502def load_results(dirname, stats_languages=None):\nUSER \u22ee...\nUSER \u2502def summarize_results(dirname, stats_languages=None):\nUSER \u2502 all_results = load_results(dirname, stats_languages)\nUSER \u2502\nUSER \u22ee...\nUSER \u2502 def show(stat, red=\"red\"):\nUSER \u22ee...\nUSER \u2502def cleanup_test_output(output, testdir):\nUSER \u22ee...\nUSER \nUSER benchmark/over_time.py:\nUSER \u22ee...\nUSER \u2502class BenchmarkPlotter:\nUSER \u2502 LABEL_FONT_SIZE = 16\nUSER \u2502\nUSER \u22ee...\nUSER \u2502 def load_data(self, yaml_file: str) -> List[ModelData]:\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER benchmark/problem_stats.py:\nUSER \u22ee...\nUSER \u2502def load_results(dirname):\nUSER \u22ee...\nUSER \nUSER benchmark/refactor_tools.py:\nUSER \u22ee...\nUSER \u2502class ParentNodeTransformer(ast.NodeTransformer):\nUSER \u2502 \"\"\"\nUSER \u2502 This transformer sets the 'parent' attribute on each node.\nUSER \u22ee...\nUSER \u2502 def generic_visit(self, node):\nUSER \u22ee...\nUSER \u2502def main(paths):\nUSER \u22ee...\nUSER \nUSER benchmark/rungrid.py:\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \u2502def run(dirname, model, edit_format):\nUSER \u22ee...\nUSER \nUSER benchmark/swe_bench.py:\nUSER \u22ee...\nUSER \u2502def plot_swe_bench(data_file, is_lite):\nUSER \u22ee...\nUSER \nUSER scripts/blame.py:\nUSER \u22ee...\nUSER \u2502def run(cmd):\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER scripts/issues.py:\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER scripts/my_models.py:\nUSER \u22ee...\nUSER \u2502def collect_model_stats(n_lines=1000):\nUSER \u22ee...\nUSER \u2502def format_text_table(model_stats):\nUSER \u22ee...\nUSER \nUSER scripts/update-history.py:\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER scripts/versionbump.py:\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER scripts/yank-old-versions.py:\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER tests/basic/test_sanity_check_repo.py:\nUSER \u22ee...\nUSER \u2502def mock_repo_wrapper(repo_obj, git_repo_error=None):\nUSER \u22ee...\nUSER \nUSER tests/basic/test_watch.py:\nUSER \u22ee...\nUSER \u2502def test_ai_comment_pattern():\nUSER \u2502 # Create minimal IO and Coder instances for testing\nUSER \u2502 class MinimalCoder:\nUSER \u2502 def __init__(self, io):\nUSER \u2502 self.io = io\nUSER \u2502 self.root = \".\"\nUSER \u2502 self.abs_fnames = set()\nUSER \u2502\nUSER \u2502 def get_rel_fname(self, fname):\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/c/test.c:\nUSER \u22ee...\nUSER \u2502int main() {\nUSER \u2502 printf(\"Hello, World!\\n\");\nUSER \u2502 return 0;\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/cpp/test.cpp:\nUSER \u22ee...\nUSER \u2502int main() {\nUSER \u2502 std::cout << \"Hello, World!\" << std::endl;\nUSER \u2502 return 0;\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/csharp/test.cs:\nUSER \u22ee...\nUSER \u2502namespace Greetings {\nUSER \u2502 public interface IGreeter {\nUSER \u2502 string Greet(string name);\nUSER \u2502 }\nUSER \u2502\nUSER \u2502 public class Person {\nUSER \u2502 public string Name { get; set; }\nUSER \u2502 public int Age { get; set; }\nUSER \u2502\nUSER \u2502 public Person(string name, int age) {\nUSER \u2502 Name = name;\nUSER \u2502 Age = age;\nUSER \u2502 }\nUSER \u22ee...\nUSER \u2502 public class FormalGreeter : IGreeter {\nUSER \u2502 private const string PREFIX = \"Good day\";\nUSER \u2502 private static readonly int MAX_AGE = 150;\nUSER \u2502\nUSER \u2502 public string Greet(string name) {\nUSER \u2502 return $\"{PREFIX}, {name}!\";\nUSER \u2502 }\nUSER \u2502\nUSER \u2502 public string GreetPerson(Person person) {\nUSER \u2502 return $\"{PREFIX}, {person.Name} ({person.Age})!\";\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/elisp/test.el:\nUSER \u22ee...\nUSER \u2502(defun create-formal-greeter ()\nUSER \u22ee...\nUSER \u2502(defun main ()\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/elixir/test.ex:\nUSER \u2502defmodule Greeter do\nUSER \u2502 def hello(name) do\nUSER \u2502 IO.puts(\"Hello, #{name}!\")\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/elm/test.elm:\nUSER \u22ee...\nUSER \u2502type Greeting\nUSER \u2502 = Formal\nUSER \u22ee...\nUSER \u2502greet style person =\nUSER \u2502 let\nUSER \u2502 prefix =\nUSER \u22ee...\nUSER \u2502defaultPerson =\nUSER \u22ee...\nUSER \u2502main =\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/go/test.go:\nUSER \u22ee...\nUSER \u2502type Person struct {\nUSER \u2502 Name string\nUSER \u2502 Age int\nUSER \u22ee...\nUSER \u2502type Greeter interface {\nUSER \u2502 Greet(p Person) string\nUSER \u22ee...\nUSER \u2502type FormalGreeter struct {\nUSER \u2502 Prefix string\nUSER \u22ee...\nUSER \u2502)\nUSER \u2502\nUSER \u2502func (g FormalGreeter) Greet(p Person) string {\nUSER \u2502 return fmt.Sprintf(\"%s, %s! You are %d years old.\",\nUSER \u2502 g.Prefix, p.Name, p.Age)\nUSER \u2502}\nUSER \u2502\nUSER \u2502func NewFormalGreeter() *FormalGreeter {\nUSER \u2502 return &FormalGreeter{Prefix: \"Good day\"}\nUSER \u2502}\nUSER \u2502\nUSER \u2502func main() {\nUSER \u2502 greeter := NewFormalGreeter()\nUSER \u2502 person := Person{Name: DefaultName, Age: 42}\nUSER \u2502 fmt.Println(greeter.Greet(person))\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/java/test.java:\nUSER \u2502public interface Greeting {\nUSER \u2502 String greet(String name);\nUSER \u22ee...\nUSER \u2502public class Test implements Greeting {\nUSER \u2502 private String prefix = \"Hello\";\nUSER \u2502\nUSER \u2502 public String greet(String name) {\nUSER \u2502 return prefix + \", \" + name + \"!\";\nUSER \u2502 }\nUSER \u2502\nUSER \u2502 public static void main(String[] args) {\nUSER \u2502 Test greeter = new Test();\nUSER \u2502 System.out.println(greeter.greet(\"World\"));\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/javascript/test.js:\nUSER \u22ee...\nUSER \u2502class Person {\nUSER \u2502 constructor(name) {\nUSER \u2502 this.name = name;\nUSER \u2502 }\nUSER \u2502\nUSER \u2502 sayHello() {\nUSER \u2502 return `Hello, ${this.name}!`;\nUSER \u2502 }\nUSER \u22ee...\nUSER \u2502function greet(person) {\nUSER \u2502 return person.sayHello();\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/kotlin/test.kt:\nUSER \u2502interface Greeting {\nUSER \u2502 fun greet(name: String): String\nUSER \u22ee...\nUSER \u2502class Test : Greeting {\nUSER \u2502 private val prefix = \"Hello\"\nUSER \u2502\nUSER \u2502 override fun greet(name: String): String {\nUSER \u2502 return \"$prefix, $name!\"\nUSER \u2502 }\nUSER \u22ee...\nUSER \u2502fun main(args: Array) {\nUSER \u2502 val greeter = Test()\nUSER \u2502 println(greeter.greet(\"World\"))\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/ocaml/test.ml:\nUSER \u22ee...\nUSER \u2502module Greeter = struct\nUSER \u2502 type person = {\nUSER \u2502 name: string;\nUSER \u2502 age: int\nUSER \u2502 }\nUSER \u2502\nUSER \u2502 let create_person name age =\nUSER \u2502 {name; age}\nUSER \u2502\nUSER \u2502 let greet person =\nUSER \u2502 Printf.printf \"Hello, %s! You are %d years old.\\n\"\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/php/test.php:\nUSER \u22ee...\nUSER \u2502function greet($name) {\nUSER \u2502 echo \"Hello, $name!\";\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/python/test.py:\nUSER \u22ee...\nUSER \u2502class Person:\nUSER \u2502 \"\"\"A class representing a person.\"\"\"\nUSER \u2502\nUSER \u22ee...\nUSER \u2502 def greet(self, formal: bool = False) -> str:\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/ql/test.ql:\nUSER \u2502predicate greet(string name) {\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/ruby/test.rb:\nUSER \u2502def greet(name)\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/rust/test.rs:\nUSER \u22ee...\nUSER \u2502trait Greeting {\nUSER \u2502 fn greet(&self) -> String;\nUSER \u22ee...\nUSER \u2502struct Person {\nUSER \u2502 name: String,\nUSER \u2502 age: u32,\nUSER \u22ee...\nUSER \u2502impl Greeting for Person {\nUSER \u2502 fn greet(&self) -> String {\nUSER \u2502 format!(\"Hello, {}! You are {} years old.\", self.name, self.age)\nUSER \u2502 }\nUSER \u22ee...\nUSER \u2502fn main() {\nUSER \u2502 let person = Person::new(DEFAULT_NAME.to_string(), 30);\nUSER \u2502 println!(\"{}\", person.greet());\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/typescript/test.ts:\nUSER \u2502function greet(name: string): void {\nUSER \u22ee...\nUSER \nUSER tests/fixtures/sample-code-base/sample.js:\nUSER \u22ee...\nUSER \u2502function greet(name) {\nUSER \u2502 return `Hello, ${name}!`;\nUSER \u22ee...\nUSER \u2502function calculateCircleArea(radius) {\nUSER \u2502 return Math.PI * radius * radius;\nUSER \u22ee...\nUSER \u2502function isPrime(number) {\nUSER \u2502 if (number <= 1) return false;\nUSER \u2502 for (let i = 2; i <= Math.sqrt(number); i++) {\nUSER \u2502 if (number % i === 0) return false;\nUSER \u2502 }\nUSER \u2502 return true;\nUSER \u22ee...\nUSER \u2502function reverseString(str) {\nUSER \u2502 return str.split('').reverse().join('');\nUSER \u22ee...\nUSER \u2502function getRandomNumber(min, max) {\nUSER \u2502 return Math.floor(Math.random() * (max - min + 1)) + min;\nUSER \u22ee...\nUSER \u2502function filterEvenNumbers(numbers) {\nUSER \u2502 return numbers.filter(num => num % 2 !== 0);\nUSER \u22ee...\nUSER \u2502function factorial(n) {\nUSER \u2502 if (n === 0 || n === 1) return 1;\nUSER \u2502 return n * factorial(n - 1);\nUSER \u22ee...\nUSER \nUSER tests/fixtures/sample-code-base/sample.py:\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\n-------\nASSISTANT Ok, I won't try and edit those files without asking first.\n-------\nUSER Don't try and edit any existing code without asking me to add the files to the chat!\nUSER Tell me which files in my repo are the most likely to **need changes** to solve the requests I make, and then stop so I can add them to the chat.\nUSER Only include the files that are most likely to actually need to be edited.\nUSER Don't include files that might contain relevant context, just files that will need to be changed.\n-------\nASSISTANT Ok, based on your requests I will suggest which files need to be edited and then stop and wait for your approval.\n-------\nUSER hi\n-------\nUSER hi\n-------\nSYSTEM # *SEARCH/REPLACE block* Rules:\nSYSTEM \nSYSTEM Every *SEARCH/REPLACE block* must use this format:\nSYSTEM 1. The *FULL* file path alone on a line, verbatim. No bold asterisks, no quotes around it, no escaping of characters, etc.\nSYSTEM 2. The opening fence and code language, eg: ```python\nSYSTEM 3. The start of search block: <<<<<<< SEARCH\nSYSTEM 4. A contiguous chunk of lines to search for in the existing source code\nSYSTEM 5. The dividing line: =======\nSYSTEM 6. The lines to replace into the source code\nSYSTEM 7. The end of the replace block: >>>>>>> REPLACE\nSYSTEM 8. The closing fence: ```\nSYSTEM \nSYSTEM Use the *FULL* file path, as shown to you by the user.\nSYSTEM \nSYSTEM Every *SEARCH* section must *EXACTLY MATCH* the existing file content, character for character, including all comments, docstrings, etc.\nSYSTEM If the file contains code or other data wrapped/escaped in json/xml/quotes or other containers, you need to propose edits to the literal contents of the file, including the container markup.\nSYSTEM \nSYSTEM *SEARCH/REPLACE* blocks will *only* replace the first match occurrence.\nSYSTEM Including multiple unique *SEARCH/REPLACE* blocks if needed.\nSYSTEM Include enough lines in each SEARCH section to uniquely match each set of lines that need to change.\nSYSTEM \nSYSTEM Keep *SEARCH/REPLACE* blocks concise.\nSYSTEM Break large *SEARCH/REPLACE* blocks into a series of smaller blocks that each change a small portion of the file.\nSYSTEM Include just the changing lines, and a few surrounding lines if needed for uniqueness.\nSYSTEM Do not include long runs of unchanging lines in *SEARCH/REPLACE* blocks.\nSYSTEM \nSYSTEM Only create *SEARCH/REPLACE* blocks for files that the user has added to the chat!\nSYSTEM \nSYSTEM To move code within a file, use 2 *SEARCH/REPLACE* blocks: 1 to delete it from its current location, 1 to insert it in the new location.\nSYSTEM \nSYSTEM Pay attention to which filenames the user wants you to edit, especially if they are asking you to create a new file.\nSYSTEM \nSYSTEM If you want to put code in a new file, use a *SEARCH/REPLACE block* with:\nSYSTEM - A new file path, including dir name if needed\nSYSTEM - An empty `SEARCH` section\nSYSTEM - The new file's contents in the `REPLACE` section\nSYSTEM \nSYSTEM To rename files which have been added to the chat, use shell commands at the end of your response.\nSYSTEM \nSYSTEM If the user just says something like \"ok\" or \"go ahead\" or \"do that\" they probably want you to make SEARCH/REPLACE blocks for the code changes you just proposed.\nSYSTEM The user will say when they've applied your edits. If they haven't explicitly confirmed the edits have been applied, they probably want proper SEARCH/REPLACE blocks.\nSYSTEM \nSYSTEM \nSYSTEM ONLY EVER RETURN CODE IN A *SEARCH/REPLACE BLOCK*!\nSYSTEM \nSYSTEM Examples of when to suggest shell commands:\nSYSTEM \nSYSTEM - If you changed a self-contained html file, suggest an OS-appropriate command to open a browser to view it to see the updated content.\nSYSTEM - If you changed a CLI program, suggest the command to run it to see the new behavior.\nSYSTEM - If you added a test, suggest how to run it with the testing tool used by the project.\nSYSTEM - Suggest OS-appropriate commands to delete or rename files/directories, or other file system operations.\nSYSTEM - If your code changes add new dependencies, suggest the command to install them.\nSYSTEM - Etc.\nSYSTEM "}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737566712} +{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737566786} +{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737566786} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737566794} +{"event": "repo", "properties": {"num_files": 427}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737566797} +{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737566797} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737566803} +{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 89277, "completion_tokens": 0, "total_tokens": 89277, "cost": 0.012498780000000001, "total_cost": 0.012498780000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737566805} +{"event": "command_drop", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737566812} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737566813} +{"event": "message_send_exception", "properties": {"exception": "Messages don't properly alternate user/assistant:\n\n-------\nSYSTEM Act as an expert software developer.\nSYSTEM Always use best practices when coding.\nSYSTEM Respect and use existing conventions, libraries, etc that are already present in the code base.\nSYSTEM \nSYSTEM Take requests for changes to the supplied code.\nSYSTEM If the request is ambiguous, ask questions.\nSYSTEM \nSYSTEM Always reply to the user in the same language they are using.\nSYSTEM \nSYSTEM Once you understand the request you MUST:\nSYSTEM \nSYSTEM 1. Decide if you need to propose *SEARCH/REPLACE* edits to any files that haven't been added to the chat. You can create new files without asking!\nSYSTEM \nSYSTEM But if you need to propose edits to existing files not already added to the chat, you *MUST* tell the user their full path names and ask them to *add the files to the chat*.\nSYSTEM End your reply and wait for their approval.\nSYSTEM You can keep asking if you then decide you need to edit more files.\nSYSTEM \nSYSTEM 2. Think step-by-step and explain the needed changes in a few short sentences.\nSYSTEM \nSYSTEM 3. Describe each change with a *SEARCH/REPLACE block* per the examples below.\nSYSTEM \nSYSTEM All changes to files must use this *SEARCH/REPLACE block* format.\nSYSTEM ONLY EVER RETURN CODE IN A *SEARCH/REPLACE BLOCK*!\nSYSTEM \nSYSTEM 4. *Concisely* suggest any shell commands the user might want to run in ```bash blocks.\nSYSTEM \nSYSTEM Just suggest shell commands this way, not example code.\nSYSTEM Only suggest complete shell commands that are ready to execute, without placeholders.\nSYSTEM Only suggest at most a few shell commands at a time, not more than 1-3, one per line.\nSYSTEM Do not suggest multi-line shell commands.\nSYSTEM All shell commands will run from the root directory of the user's project.\nSYSTEM \nSYSTEM Use the appropriate shell based on the user's system info:\nSYSTEM - Platform: macOS-15.2-x86_64-i386-64bit\nSYSTEM - Shell: SHELL=/usr/local/Cellar/bash/5.2.26/bin/bash\nSYSTEM - Language: en_US\nSYSTEM - Current date: 2025-01-22\nSYSTEM - The user is operating inside a git repository\nSYSTEM - The user's pre-commit runs these lint commands, don't suggest running them:\nSYSTEM - /Users/gauthier/Projects/aider/tmp.lint.sh\nSYSTEM \nSYSTEM Examples of when to suggest shell commands:\nSYSTEM \nSYSTEM - If you changed a self-contained html file, suggest an OS-appropriate command to open a browser to view it to see the updated content.\nSYSTEM - If you changed a CLI program, suggest the command to run it to see the new behavior.\nSYSTEM - If you added a test, suggest how to run it with the testing tool used by the project.\nSYSTEM - Suggest OS-appropriate commands to delete or rename files/directories, or other file system operations.\nSYSTEM - If your code changes add new dependencies, suggest the command to install them.\nSYSTEM - Etc.\nSYSTEM \nSYSTEM \nSYSTEM # Example conversations:\nSYSTEM \nSYSTEM ## USER: Change get_factorial() to use math.factorial\nSYSTEM \nSYSTEM ## ASSISTANT: To make this change we need to modify `mathweb/flask/app.py` to:\nSYSTEM \nSYSTEM 1. Import the math package.\nSYSTEM 2. Remove the existing factorial() function.\nSYSTEM 3. Update get_factorial() to call math.factorial instead.\nSYSTEM \nSYSTEM Here are the *SEARCH/REPLACE* blocks:\nSYSTEM \nSYSTEM mathweb/flask/app.py\nSYSTEM ```python\nSYSTEM <<<<<<< SEARCH\nSYSTEM from flask import Flask\nSYSTEM =======\nSYSTEM import math\nSYSTEM from flask import Flask\nSYSTEM >>>>>>> REPLACE\nSYSTEM ```\nSYSTEM \nSYSTEM mathweb/flask/app.py\nSYSTEM ```python\nSYSTEM <<<<<<< SEARCH\nSYSTEM def factorial(n):\nSYSTEM \"compute factorial\"\nSYSTEM \nSYSTEM if n == 0:\nSYSTEM return 1\nSYSTEM else:\nSYSTEM return n * factorial(n-1)\nSYSTEM \nSYSTEM =======\nSYSTEM >>>>>>> REPLACE\nSYSTEM ```\nSYSTEM \nSYSTEM mathweb/flask/app.py\nSYSTEM ```python\nSYSTEM <<<<<<< SEARCH\nSYSTEM return str(factorial(n))\nSYSTEM =======\nSYSTEM return str(math.factorial(n))\nSYSTEM >>>>>>> REPLACE\nSYSTEM ```\nSYSTEM \nSYSTEM \nSYSTEM ## USER: Refactor hello() into its own file.\nSYSTEM \nSYSTEM ## ASSISTANT: To make this change we need to modify `main.py` and make a new file `hello.py`:\nSYSTEM \nSYSTEM 1. Make a new hello.py file with hello() in it.\nSYSTEM 2. Remove hello() from main.py and replace it with an import.\nSYSTEM \nSYSTEM Here are the *SEARCH/REPLACE* blocks:\nSYSTEM \nSYSTEM hello.py\nSYSTEM ```python\nSYSTEM <<<<<<< SEARCH\nSYSTEM =======\nSYSTEM def hello():\nSYSTEM \"print a greeting\"\nSYSTEM \nSYSTEM print(\"hello\")\nSYSTEM >>>>>>> REPLACE\nSYSTEM ```\nSYSTEM \nSYSTEM main.py\nSYSTEM ```python\nSYSTEM <<<<<<< SEARCH\nSYSTEM def hello():\nSYSTEM \"print a greeting\"\nSYSTEM \nSYSTEM print(\"hello\")\nSYSTEM =======\nSYSTEM from hello import hello\nSYSTEM >>>>>>> REPLACE\nSYSTEM ```\nSYSTEM # *SEARCH/REPLACE block* Rules:\nSYSTEM \nSYSTEM Every *SEARCH/REPLACE block* must use this format:\nSYSTEM 1. The *FULL* file path alone on a line, verbatim. No bold asterisks, no quotes around it, no escaping of characters, etc.\nSYSTEM 2. The opening fence and code language, eg: ```python\nSYSTEM 3. The start of search block: <<<<<<< SEARCH\nSYSTEM 4. A contiguous chunk of lines to search for in the existing source code\nSYSTEM 5. The dividing line: =======\nSYSTEM 6. The lines to replace into the source code\nSYSTEM 7. The end of the replace block: >>>>>>> REPLACE\nSYSTEM 8. The closing fence: ```\nSYSTEM \nSYSTEM Use the *FULL* file path, as shown to you by the user.\nSYSTEM \nSYSTEM Every *SEARCH* section must *EXACTLY MATCH* the existing file content, character for character, including all comments, docstrings, etc.\nSYSTEM If the file contains code or other data wrapped/escaped in json/xml/quotes or other containers, you need to propose edits to the literal contents of the file, including the container markup.\nSYSTEM \nSYSTEM *SEARCH/REPLACE* blocks will *only* replace the first match occurrence.\nSYSTEM Including multiple unique *SEARCH/REPLACE* blocks if needed.\nSYSTEM Include enough lines in each SEARCH section to uniquely match each set of lines that need to change.\nSYSTEM \nSYSTEM Keep *SEARCH/REPLACE* blocks concise.\nSYSTEM Break large *SEARCH/REPLACE* blocks into a series of smaller blocks that each change a small portion of the file.\nSYSTEM Include just the changing lines, and a few surrounding lines if needed for uniqueness.\nSYSTEM Do not include long runs of unchanging lines in *SEARCH/REPLACE* blocks.\nSYSTEM \nSYSTEM Only create *SEARCH/REPLACE* blocks for files that the user has added to the chat!\nSYSTEM \nSYSTEM To move code within a file, use 2 *SEARCH/REPLACE* blocks: 1 to delete it from its current location, 1 to insert it in the new location.\nSYSTEM \nSYSTEM Pay attention to which filenames the user wants you to edit, especially if they are asking you to create a new file.\nSYSTEM \nSYSTEM If you want to put code in a new file, use a *SEARCH/REPLACE block* with:\nSYSTEM - A new file path, including dir name if needed\nSYSTEM - An empty `SEARCH` section\nSYSTEM - The new file's contents in the `REPLACE` section\nSYSTEM \nSYSTEM To rename files which have been added to the chat, use shell commands at the end of your response.\nSYSTEM \nSYSTEM If the user just says something like \"ok\" or \"go ahead\" or \"do that\" they probably want you to make SEARCH/REPLACE blocks for the code changes you just proposed.\nSYSTEM The user will say when they've applied your edits. If they haven't explicitly confirmed the edits have been applied, they probably want proper SEARCH/REPLACE blocks.\nSYSTEM \nSYSTEM \nSYSTEM ONLY EVER RETURN CODE IN A *SEARCH/REPLACE BLOCK*!\nSYSTEM \nSYSTEM Examples of when to suggest shell commands:\nSYSTEM \nSYSTEM - If you changed a self-contained html file, suggest an OS-appropriate command to open a browser to view it to see the updated content.\nSYSTEM - If you changed a CLI program, suggest the command to run it to see the new behavior.\nSYSTEM - If you added a test, suggest how to run it with the testing tool used by the project.\nSYSTEM - Suggest OS-appropriate commands to delete or rename files/directories, or other file system operations.\nSYSTEM - If your code changes add new dependencies, suggest the command to install them.\nSYSTEM - Etc.\nSYSTEM \n-------\nUSER Here are summaries of some files present in my git repository.\nUSER Do not propose changes to these files, treat them as *read-only*.\nUSER If you need to edit any of these files, ask me to *add them to the chat* first.\nUSER \nUSER aider/analytics.py:\nUSER \u22ee...\nUSER \u2502def compute_hex_threshold(percent):\nUSER \u22ee...\nUSER \u2502def is_uuid_in_percentage(uuid_str, percent):\nUSER \u22ee...\nUSER \u2502class Analytics:\nUSER \u2502 # providers\nUSER \u2502 mp = None\nUSER \u22ee...\nUSER \u2502 def disable(self, permanently):\nUSER \u22ee...\nUSER \u2502 def get_data_file_path(self):\nUSER \u22ee...\nUSER \u2502 def get_or_create_uuid(self):\nUSER \u22ee...\nUSER \u2502 def load_data(self):\nUSER \u22ee...\nUSER \u2502 def save_data(self):\nUSER \u22ee...\nUSER \u2502 def get_system_info(self):\nUSER \u22ee...\nUSER \u2502 def event(self, event_name, main_model=None, **kwargs):\nUSER \u22ee...\nUSER \nUSER aider/args.py:\nUSER \u22ee...\nUSER \u2502def get_parser(default_config_files, git_root):\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER aider/args_formatter.py:\nUSER \u22ee...\nUSER \u2502class DotEnvFormatter(argparse.HelpFormatter):\nUSER \u2502 def start_section(self, heading):\nUSER \u2502 res = \"\\n\\n\"\nUSER \u2502 res += \"#\" * (len(heading) + 3)\nUSER \u2502 res += f\"\\n# {heading}\"\nUSER \u22ee...\nUSER \u2502 def _format_usage(self, usage, actions, groups, prefix):\nUSER \u22ee...\nUSER \u2502class YamlHelpFormatter(argparse.HelpFormatter):\nUSER \u2502 def start_section(self, heading):\nUSER \u2502 res = \"\\n\\n\"\nUSER \u2502 res += \"#\" * (len(heading) + 3)\nUSER \u2502 res += f\"\\n# {heading}\"\nUSER \u22ee...\nUSER \u2502 def _format_usage(self, usage, actions, groups, prefix):\nUSER \u22ee...\nUSER \u2502class MarkdownHelpFormatter(argparse.HelpFormatter):\nUSER \u2502 def start_section(self, heading):\nUSER \u22ee...\nUSER \u2502 def _format_usage(self, usage, actions, groups, prefix):\nUSER \u22ee...\nUSER \nUSER aider/coders/architect_prompts.py:\nUSER \u22ee...\nUSER \u2502class ArchitectPrompts(CoderPrompts):\nUSER \u22ee...\nUSER \nUSER aider/coders/ask_prompts.py:\nUSER \u22ee...\nUSER \u2502class AskPrompts(CoderPrompts):\nUSER \u22ee...\nUSER \nUSER aider/coders/base_coder.py:\nUSER \u22ee...\nUSER \u2502class Coder:\nUSER \u2502 abs_fnames = None\nUSER \u22ee...\nUSER \u2502 @classmethod\nUSER \u2502 def create(\nUSER \u2502 self,\nUSER \u2502 main_model=None,\nUSER \u2502 edit_format=None,\nUSER \u2502 io=None,\nUSER \u2502 from_coder=None,\nUSER \u2502 summarize_from_coder=True,\nUSER \u2502 **kwargs,\nUSER \u22ee...\nUSER \u2502 def get_announcements(self):\nUSER \u22ee...\nUSER \u2502 def show_announcements(self):\nUSER \u22ee...\nUSER \u2502 def add_rel_fname(self, rel_fname):\nUSER \u22ee...\nUSER \u2502 def drop_rel_fname(self, fname):\nUSER \u22ee...\nUSER \u2502 def abs_root_path(self, path):\nUSER \u22ee...\nUSER \u2502 def get_repo_map(self, force_refresh=False):\nUSER \u22ee...\nUSER \u2502 def run_stream(self, user_message):\nUSER \u22ee...\nUSER \u2502 def run(self, with_message=None, preproc=True):\nUSER \u22ee...\nUSER \u2502 def fmt_system_prompt(self, prompt):\nUSER \u22ee...\nUSER \u2502 def format_messages(self):\nUSER \u22ee...\nUSER \u2502 def get_multi_response_content(self, final=False):\nUSER \u22ee...\nUSER \u2502 def get_rel_fname(self, fname):\nUSER \u22ee...\nUSER \u2502 def get_inchat_relative_files(self):\nUSER \u22ee...\nUSER \u2502 def get_all_relative_files(self):\nUSER \u22ee...\nUSER \u2502 def allowed_to_edit(self, path):\nUSER \u22ee...\nUSER \u2502 def check_added_files(self):\nUSER \u22ee...\nUSER \u2502 def apply_updates(self):\nUSER \u22ee...\nUSER \u2502 def parse_partial_args(self):\nUSER \u22ee...\nUSER \nUSER aider/coders/base_prompts.py:\nUSER \u2502class CoderPrompts:\nUSER \u22ee...\nUSER \nUSER aider/coders/chat_chunks.py:\nUSER \u22ee...\nUSER \u2502@dataclass\nUSER \u2502class ChatChunks:\nUSER \u2502 system: List = field(default_factory=list)\nUSER \u22ee...\nUSER \u2502 def all_messages(self):\nUSER \u22ee...\nUSER \u2502 def add_cache_control(self, messages):\nUSER \u22ee...\nUSER \nUSER aider/coders/editblock_coder.py:\nUSER \u22ee...\nUSER \u2502def do_replace(fname, content, before_text, after_text, fence=None):\nUSER \u22ee...\nUSER \u2502def find_original_update_blocks(content, fence=DEFAULT_FENCE, valid_fnames=None):\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER aider/coders/editblock_fenced_prompts.py:\nUSER \u22ee...\nUSER \u2502class EditBlockFencedPrompts(EditBlockPrompts):\nUSER \u22ee...\nUSER \nUSER aider/coders/editblock_func_prompts.py:\nUSER \u22ee...\nUSER \u2502class EditBlockFunctionPrompts(CoderPrompts):\nUSER \u22ee...\nUSER \nUSER aider/coders/editblock_prompts.py:\nUSER \u22ee...\nUSER \u2502class EditBlockPrompts(CoderPrompts):\nUSER \u22ee...\nUSER \nUSER aider/coders/editor_editblock_prompts.py:\nUSER \u22ee...\nUSER \u2502class EditorEditBlockPrompts(EditBlockPrompts):\nUSER \u22ee...\nUSER \nUSER aider/coders/editor_whole_prompts.py:\nUSER \u22ee...\nUSER \u2502class EditorWholeFilePrompts(WholeFilePrompts):\nUSER \u22ee...\nUSER \nUSER aider/coders/help_prompts.py:\nUSER \u22ee...\nUSER \u2502class HelpPrompts(CoderPrompts):\nUSER \u22ee...\nUSER \nUSER aider/coders/search_replace.py:\nUSER \u22ee...\nUSER \u2502def try_strategy(texts, strategy, preproc):\nUSER \u22ee...\nUSER \u2502def read_text(fname):\nUSER \u22ee...\nUSER \u2502def main(dnames):\nUSER \u22ee...\nUSER \nUSER aider/coders/single_wholefile_func_prompts.py:\nUSER \u22ee...\nUSER \u2502class SingleWholeFileFunctionPrompts(CoderPrompts):\nUSER \u22ee...\nUSER \nUSER aider/coders/udiff_coder.py:\nUSER \u22ee...\nUSER \u2502def do_replace(fname, content, hunk):\nUSER \u22ee...\nUSER \u2502def directly_apply_hunk(content, hunk):\nUSER \u22ee...\nUSER \u2502def hunk_to_before_after(hunk, lines=False):\nUSER \u22ee...\nUSER \nUSER aider/coders/wholefile_func_prompts.py:\nUSER \u22ee...\nUSER \u2502class WholeFileFunctionPrompts(CoderPrompts):\nUSER \u22ee...\nUSER \nUSER aider/coders/wholefile_prompts.py:\nUSER \u22ee...\nUSER \u2502class WholeFilePrompts(CoderPrompts):\nUSER \u22ee...\nUSER \nUSER aider/commands.py:\nUSER \u22ee...\nUSER \u2502class Commands:\nUSER \u2502 voice = None\nUSER \u22ee...\nUSER \u2502 def get_raw_completions(self, cmd):\nUSER \u22ee...\nUSER \u2502 def get_completions(self, cmd):\nUSER \u22ee...\nUSER \u2502 def get_commands(self):\nUSER \u22ee...\nUSER \u2502 def matching_commands(self, inp):\nUSER \u22ee...\nUSER \u2502 def run(self, inp):\nUSER \u22ee...\nUSER \u2502 def cmd_undo(self, args):\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER aider/copypaste.py:\nUSER \u22ee...\nUSER \u2502class ClipboardWatcher:\nUSER \u2502 \"\"\"Watches clipboard for changes and updates IO placeholder\"\"\"\nUSER \u2502\nUSER \u22ee...\nUSER \u2502 def start(self):\nUSER \u22ee...\nUSER \u2502 def stop(self):\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER aider/diffs.py:\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \u2502def diff_partial_update(lines_orig, lines_updated, final=False, fname=None):\nUSER \u22ee...\nUSER \nUSER aider/dump.py:\nUSER \u22ee...\nUSER \u2502def cvt(s):\nUSER \u22ee...\nUSER \u2502def dump(*vals):\nUSER \u22ee...\nUSER \nUSER aider/editor.py:\nUSER \u22ee...\nUSER \u2502def print_status_message(success, message, style=None):\nUSER \u22ee...\nUSER \u2502def write_temp_file(\nUSER \u2502 input_data=\"\",\nUSER \u2502 suffix=None,\nUSER \u2502 prefix=None,\nUSER \u2502 dir=None,\nUSER \u22ee...\nUSER \u2502def get_environment_editor(default=None):\nUSER \u22ee...\nUSER \u2502def discover_editor(editor_override=None):\nUSER \u22ee...\nUSER \u2502def pipe_editor(input_data=\"\", suffix=None, editor=None):\nUSER \u22ee...\nUSER \nUSER aider/exceptions.py:\nUSER \u22ee...\nUSER \u2502@dataclass\nUSER \u2502class ExInfo:\nUSER \u22ee...\nUSER \u2502class LiteLLMExceptions:\nUSER \u2502 exceptions = dict()\nUSER \u2502\nUSER \u22ee...\nUSER \u2502 def _load(self, strict=False):\nUSER \u22ee...\nUSER \u2502 def exceptions_tuple(self):\nUSER \u22ee...\nUSER \u2502 def get_ex_info(self, ex):\nUSER \u22ee...\nUSER \nUSER aider/format_settings.py:\nUSER \u2502def scrub_sensitive_info(args, text):\nUSER \u22ee...\nUSER \nUSER aider/gui.py:\nUSER \u22ee...\nUSER \u2502class CaptureIO(InputOutput):\nUSER \u2502 lines = []\nUSER \u2502\nUSER \u2502 def tool_output(self, msg, log_only=False):\nUSER \u22ee...\nUSER \u2502 def tool_error(self, msg):\nUSER \u22ee...\nUSER \u2502 def tool_warning(self, msg):\nUSER \u22ee...\nUSER \u2502 def get_captured_lines(self):\nUSER \u22ee...\nUSER \u2502def search(text=None):\nUSER \u22ee...\nUSER \u2502class State:\nUSER \u2502 keys = set()\nUSER \u2502\nUSER \u2502 def init(self, key, val=None):\nUSER \u22ee...\nUSER \u2502@st.cache_resource\nUSER \u2502def get_state():\nUSER \u22ee...\nUSER \u2502@st.cache_resource\nUSER \u2502def get_coder():\nUSER \u22ee...\nUSER \u2502class GUI:\nUSER \u2502 prompt = None\nUSER \u22ee...\nUSER \u2502 def announce(self):\nUSER \u22ee...\nUSER \u2502 def show_edit_info(self, edit):\nUSER \u22ee...\nUSER \u2502 def add_undo(self, commit_hash):\nUSER \u22ee...\nUSER \u2502 def do_sidebar(self):\nUSER \u22ee...\nUSER \u2502 def do_add_to_chat(self):\nUSER \u22ee...\nUSER \u2502 def do_add_files(self):\nUSER \u22ee...\nUSER \u2502 def do_add_web_page(self):\nUSER \u22ee...\nUSER \u2502 def do_clear_chat_history(self):\nUSER \u22ee...\nUSER \u2502 def do_recent_msgs(self):\nUSER \u22ee...\nUSER \u2502 def do_messages_container(self):\nUSER \u22ee...\nUSER \u2502 def initialize_state(self):\nUSER \u22ee...\nUSER \u2502 def button(self, args, **kwargs):\nUSER \u22ee...\nUSER \u2502 def prompt_pending(self):\nUSER \u22ee...\nUSER \u2502 def process_chat(self):\nUSER \u22ee...\nUSER \u2502 def info(self, message, echo=True):\nUSER \u22ee...\nUSER \u2502 def do_web(self):\nUSER \u22ee...\nUSER \u2502 def do_undo(self, commit_hash):\nUSER \u22ee...\nUSER \u2502def gui_main():\nUSER \u22ee...\nUSER \nUSER aider/help.py:\nUSER \u22ee...\nUSER \u2502def get_package_files():\nUSER \u22ee...\nUSER \u2502def fname_to_url(filepath):\nUSER \u22ee...\nUSER \u2502def get_index():\nUSER \u22ee...\nUSER \nUSER aider/history.py:\nUSER \u22ee...\nUSER \u2502class ChatSummary:\nUSER \u2502 def __init__(self, models=None, max_tokens=1024):\nUSER \u2502 if not models:\nUSER \u2502 raise ValueError(\"At least one model must be provided\")\nUSER \u2502 self.models = models if isinstance(models, list) else [models]\nUSER \u2502 self.max_tokens = max_tokens\nUSER \u22ee...\nUSER \u2502 def too_big(self, messages):\nUSER \u22ee...\nUSER \u2502 def tokenize(self, messages):\nUSER \u22ee...\nUSER \u2502 def summarize(self, messages, depth=0):\nUSER \u22ee...\nUSER \u2502 def summarize_real(self, messages, depth=0):\nUSER \u22ee...\nUSER \u2502 def summarize_all(self, messages):\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER aider/io.py:\nUSER \u22ee...\nUSER \u2502class AutoCompleter(Completer):\nUSER \u2502 def __init__(\nUSER \u2502 self, root, rel_fnames, addable_rel_fnames, commands, encoding, abs_read_only_fnames=None\nUSER \u22ee...\nUSER \u2502 def tokenize(self):\nUSER \u22ee...\nUSER \u2502 def get_command_completions(self, document, complete_event, text, words):\nUSER \u22ee...\nUSER \u2502 def get_completions(self, document, complete_event):\nUSER \u22ee...\nUSER \u2502class InputOutput:\nUSER \u2502 num_error_outputs = 0\nUSER \u22ee...\nUSER \u2502 def _get_style(self):\nUSER \u22ee...\nUSER \u2502 def read_image(self, filename):\nUSER \u22ee...\nUSER \u2502 def read_text(self, filename, silent=False):\nUSER \u22ee...\nUSER \u2502 def write_text(self, filename, content, max_retries=5, initial_delay=0.1):\nUSER \u22ee...\nUSER \u2502 def rule(self):\nUSER \u22ee...\nUSER \u2502 def interrupt_input(self):\nUSER \u22ee...\nUSER \u2502 def get_input(\nUSER \u2502 self,\nUSER \u2502 root,\nUSER \u2502 rel_fnames,\nUSER \u2502 addable_rel_fnames,\nUSER \u2502 commands,\nUSER \u2502 abs_read_only_fnames=None,\nUSER \u2502 edit_format=None,\nUSER \u2502 ):\nUSER \u2502 self.rule()\nUSER \u2502\nUSER \u22ee...\nUSER \u2502 def suspend_to_bg(event):\nUSER \u22ee...\nUSER \u2502 def add_to_input_history(self, inp):\nUSER \u22ee...\nUSER \u2502 def get_input_history(self):\nUSER \u22ee...\nUSER \u2502 def display_user_input(self, inp):\nUSER \u22ee...\nUSER \u2502 def user_input(self, inp, log_only=True):\nUSER \u22ee...\nUSER \u2502 def offer_url(self, url, prompt=\"Open URL for more info?\", allow_never=True):\nUSER \u22ee...\nUSER \u2502 def confirm_ask(\nUSER \u2502 self,\nUSER \u2502 question,\nUSER \u2502 default=\"y\",\nUSER \u2502 subject=None,\nUSER \u2502 explicit_yes_required=False,\nUSER \u2502 group=None,\nUSER \u2502 allow_never=False,\nUSER \u22ee...\nUSER \u2502 def tool_error(self, message=\"\", strip=True):\nUSER \u22ee...\nUSER \u2502 def tool_warning(self, message=\"\", strip=True):\nUSER \u22ee...\nUSER \u2502 def tool_output(self, *messages, log_only=False, bold=False):\nUSER \u22ee...\nUSER \u2502 def print(self, message=\"\"):\nUSER \u22ee...\nUSER \u2502 def append_chat_history(self, text, linebreak=False, blockquote=False, strip=True):\nUSER \u22ee...\nUSER \u2502 def format_files_for_input(self, rel_fnames, rel_read_only_fnames):\nUSER \u22ee...\nUSER \u2502def get_rel_fname(fname, root):\nUSER \u22ee...\nUSER \nUSER aider/linter.py:\nUSER \u22ee...\nUSER \u2502class Linter:\nUSER \u2502 def __init__(self, encoding=\"utf-8\", root=None):\nUSER \u2502 self.encoding = encoding\nUSER \u2502 self.root = root\nUSER \u2502\nUSER \u2502 self.languages = dict(\nUSER \u2502 python=self.py_lint,\nUSER \u2502 )\nUSER \u22ee...\nUSER \u2502 def get_rel_fname(self, fname):\nUSER \u22ee...\nUSER \u2502 def run_cmd(self, cmd, rel_fname, code):\nUSER \u22ee...\nUSER \u2502 def lint(self, fname, cmd=None):\nUSER \u22ee...\nUSER \u2502@dataclass\nUSER \u2502class LintResult:\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER aider/llm.py:\nUSER \u22ee...\nUSER \u2502class LazyLiteLLM:\nUSER \u22ee...\nUSER \nUSER aider/main.py:\nUSER \u22ee...\nUSER \u2502def sanity_check_repo(repo, io):\nUSER \u22ee...\nUSER \u2502def main(argv=None, input=None, output=None, force_git_root=None, return_coder=False):\nUSER \u22ee...\nUSER \nUSER aider/mdstream.py:\nUSER \u22ee...\nUSER \u2502class MarkdownStream:\nUSER \u2502 \"\"\"Streaming markdown renderer that progressively displays content with a live updating window.\nUSER \u2502\nUSER \u2502 Uses rich.console and rich.live to render markdown content with smooth scrolling\nUSER \u2502 and partial updates. Maintains a sliding window of visible content while streaming\nUSER \u2502 in new markdown text.\nUSER \u22ee...\nUSER \u2502 def update(self, text, final=False):\nUSER \u22ee...\nUSER \nUSER aider/models.py:\nUSER \u22ee...\nUSER \u2502@dataclass\nUSER \u2502class ModelSettings:\nUSER \u22ee...\nUSER \u2502class ModelInfoManager:\nUSER \u2502 MODEL_INFO_URL = (\nUSER \u2502 \"https://raw.githubusercontent.com/BerriAI/litellm/main/\"\nUSER \u2502 \"model_prices_and_context_window.json\"\nUSER \u22ee...\nUSER \u2502 def get_model_from_cached_json_db(self, model):\nUSER \u22ee...\nUSER \u2502 def get_model_info(self, model):\nUSER \u22ee...\nUSER \u2502class Model(ModelSettings):\nUSER \u2502 def __init__(self, model, weak_model=None, editor_model=None, editor_edit_format=None):\nUSER \u2502 # Map any alias to its canonical name\nUSER \u2502 model = MODEL_ALIASES.get(model, model)\nUSER \u2502\nUSER \u2502 self.name = model\nUSER \u2502\nUSER \u2502 self.max_chat_history_tokens = 1024\nUSER \u2502 self.weak_model = None\nUSER \u2502 self.editor_model = None\nUSER \u2502\nUSER \u22ee...\nUSER \u2502 def get_model_info(self, model):\nUSER \u22ee...\nUSER \u2502 def token_count(self, messages):\nUSER \u22ee...\nUSER \u2502def validate_variables(vars):\nUSER \u22ee...\nUSER \u2502def sanity_check_model(io, model):\nUSER \u22ee...\nUSER \u2502def fuzzy_match_models(name):\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER aider/repo.py:\nUSER \u22ee...\nUSER \u2502class GitRepo:\nUSER \u2502 repo = None\nUSER \u22ee...\nUSER \u2502 def commit(self, fnames=None, context=None, message=None, aider_edits=False):\nUSER \u22ee...\nUSER \u2502 def get_commit_message(self, diffs, context):\nUSER \u22ee...\nUSER \u2502 def get_diffs(self, fnames=None):\nUSER \u22ee...\nUSER \u2502 def diff_commits(self, pretty, from_commit, to_commit):\nUSER \u22ee...\nUSER \u2502 def get_tracked_files(self):\nUSER \u22ee...\nUSER \u2502 def normalize_path(self, path):\nUSER \u22ee...\nUSER \u2502 def refresh_aider_ignore(self):\nUSER \u22ee...\nUSER \u2502 def git_ignored_file(self, path):\nUSER \u22ee...\nUSER \u2502 def ignored_file(self, fname):\nUSER \u22ee...\nUSER \u2502 def ignored_file_raw(self, fname):\nUSER \u22ee...\nUSER \u2502 def path_in_repo(self, path):\nUSER \u22ee...\nUSER \u2502 def abs_root_path(self, path):\nUSER \u22ee...\nUSER \u2502 def is_dirty(self, path=None):\nUSER \u22ee...\nUSER \u2502 def get_head_commit(self):\nUSER \u22ee...\nUSER \u2502 def get_head_commit_sha(self, short=False):\nUSER \u22ee...\nUSER \nUSER aider/repomap.py:\nUSER \u22ee...\nUSER \u2502class RepoMap:\nUSER \u2502 CACHE_VERSION = 3\nUSER \u22ee...\nUSER \u2502 def token_count(self, text):\nUSER \u22ee...\nUSER \u2502 def get_repo_map(\nUSER \u2502 self,\nUSER \u2502 chat_files,\nUSER \u2502 other_files,\nUSER \u2502 mentioned_fnames=None,\nUSER \u2502 mentioned_idents=None,\nUSER \u2502 force_refresh=False,\nUSER \u22ee...\nUSER \u2502 def get_rel_fname(self, fname):\nUSER \u22ee...\nUSER \u2502 def tags_cache_error(self, original_error=None):\nUSER \u22ee...\nUSER \u2502 def get_mtime(self, fname):\nUSER \u22ee...\nUSER \u2502 def get_ranked_tags_map(\nUSER \u2502 self,\nUSER \u2502 chat_fnames,\nUSER \u2502 other_fnames=None,\nUSER \u2502 max_map_tokens=None,\nUSER \u2502 mentioned_fnames=None,\nUSER \u2502 mentioned_idents=None,\nUSER \u2502 force_refresh=False,\nUSER \u22ee...\nUSER \u2502def get_scm_fname(lang):\nUSER \u22ee...\nUSER \nUSER aider/report.py:\nUSER \u22ee...\nUSER \u2502def report_github_issue(issue_text, title=None, confirm=True):\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER aider/run_cmd.py:\nUSER \u22ee...\nUSER \u2502def run_cmd(command, verbose=False, error_print=None, cwd=None):\nUSER \u22ee...\nUSER \u2502def get_windows_parent_process_name():\nUSER \u22ee...\nUSER \u2502def run_cmd_subprocess(command, verbose=False, cwd=None, encoding=sys.stdout.encoding):\nUSER \u22ee...\nUSER \u2502def run_cmd_pexpect(command, verbose=False, cwd=None):\nUSER \u22ee...\nUSER \nUSER aider/scrape.py:\nUSER \u22ee...\nUSER \u2502class Scraper:\nUSER \u2502 pandoc_available = None\nUSER \u22ee...\nUSER \u2502 def scrape(self, url):\nUSER \u22ee...\nUSER \u2502def main(url):\nUSER \u22ee...\nUSER \nUSER aider/sendchat.py:\nUSER \u22ee...\nUSER \u2502def sanity_check_messages(messages):\nUSER \u22ee...\nUSER \u2502def send_completion(\nUSER \u2502 model_name,\nUSER \u2502 messages,\nUSER \u2502 functions,\nUSER \u2502 stream,\nUSER \u2502 temperature=0,\nUSER \u2502 extra_params=None,\nUSER \u22ee...\nUSER \u2502def simple_send_with_retries(model, messages):\nUSER \u22ee...\nUSER \nUSER aider/special.py:\nUSER \u22ee...\nUSER \u2502def is_important(file_path):\nUSER \u22ee...\nUSER \u2502def filter_important_files(file_paths):\nUSER \u22ee...\nUSER \nUSER aider/utils.py:\nUSER \u22ee...\nUSER \u2502class IgnorantTemporaryDirectory:\nUSER \u2502 def __init__(self):\nUSER \u2502 if sys.version_info >= (3, 10):\nUSER \u2502 self.temp_dir = tempfile.TemporaryDirectory(ignore_cleanup_errors=True)\nUSER \u2502 else:\nUSER \u22ee...\nUSER \u2502 def cleanup(self):\nUSER \u22ee...\nUSER \u2502class GitTemporaryDirectory(ChdirTemporaryDirectory):\nUSER \u22ee...\nUSER \u2502def make_repo(path=None):\nUSER \u22ee...\nUSER \u2502def is_image_file(file_name):\nUSER \u22ee...\nUSER \u2502def safe_abs_path(res):\nUSER \u22ee...\nUSER \u2502def format_content(role, content):\nUSER \u22ee...\nUSER \u2502def format_messages(messages, title=None):\nUSER \u22ee...\nUSER \u2502def split_chat_history_markdown(text, include_tool=False):\nUSER \u2502 messages = []\nUSER \u22ee...\nUSER \u2502 def append_msg(role, lines):\nUSER \u22ee...\nUSER \u2502def get_pip_install(args):\nUSER \u22ee...\nUSER \u2502def run_install(cmd):\nUSER \u22ee...\nUSER \u2502class Spinner:\nUSER \u2502 unicode_spinner = [\"\u280b\", \"\u2819\", \"\u2839\", \"\u2838\", \"\u283c\", \"\u2834\", \"\u2826\", \"\u2827\", \"\u2807\", \"\u280f\"]\nUSER \u22ee...\nUSER \u2502 def step(self):\nUSER \u22ee...\nUSER \u2502 def end(self):\nUSER \u22ee...\nUSER \u2502def check_pip_install_extra(io, module, prompt, pip_install_cmd, self_update=False):\nUSER \u22ee...\nUSER \u2502def printable_shell_command(cmd_list):\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER aider/voice.py:\nUSER \u22ee...\nUSER \u2502class SoundDeviceError(Exception):\nUSER \u22ee...\nUSER \u2502class Voice:\nUSER \u2502 max_rms = 0\nUSER \u22ee...\nUSER \u2502 def record_and_transcribe(self, history=None, language=None):\nUSER \u22ee...\nUSER \u2502 def raw_record_and_transcribe(self, history, language):\nUSER \u22ee...\nUSER \nUSER aider/watch.py:\nUSER \u22ee...\nUSER \u2502def load_gitignores(gitignore_paths: list[Path]) -> Optional[PathSpec]:\nUSER \u22ee...\nUSER \u2502class FileWatcher:\nUSER \u2502 \"\"\"Watches source files for changes and AI comments\"\"\"\nUSER \u2502\nUSER \u22ee...\nUSER \u2502 def start(self):\nUSER \u22ee...\nUSER \u2502 def stop(self):\nUSER \u22ee...\nUSER \u2502 def process_changes(self):\nUSER \u22ee...\nUSER \u2502 def get_ai_comments(self, filepath):\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER aider/website/_includes/code-in-json-benchmark.js:\nUSER \u22ee...\nUSER \u2502 function getAspectRatio() {\nUSER \u2502 var width = chartContainer.offsetWidth;\nUSER \u2502 // Gradually change aspect ratio from 2 (landscape) to 1 (square)\nUSER \u2502 return Math.max(1, Math.min(2, width / 300));\nUSER \u22ee...\nUSER \u2502 function resizeChart() {\nUSER \u2502 chart.options.aspectRatio = getAspectRatio();\nUSER \u2502 chart.resize();\nUSER \u22ee...\nUSER \u2502function createStripedCanvas(isStrict) {\nUSER \u2502 const patternCanvas = document.createElement('canvas');\nUSER \u2502 const patternContext = patternCanvas.getContext('2d');\nUSER \u2502 const size = 10;\nUSER \u2502 patternCanvas.width = size;\nUSER \u2502 patternCanvas.height = size;\nUSER \u2502\nUSER \u2502 patternContext.fillStyle = 'rgba(255, 99, 132, 0.8)';\nUSER \u2502 patternContext.fillRect(0, 0, size, size);\nUSER \u2502\nUSER \u22ee...\nUSER \nUSER aider/website/_includes/code-in-json-syntax.js:\nUSER \u22ee...\nUSER \u2502 function getAspectRatio() {\nUSER \u2502 var width = chartContainer.offsetWidth;\nUSER \u2502 // Gradually change aspect ratio from 2 (landscape) to 1 (square)\nUSER \u2502 return Math.max(1, Math.min(2, width / 300));\nUSER \u22ee...\nUSER \u2502 function resizeChart() {\nUSER \u2502 chart.options.aspectRatio = getAspectRatio();\nUSER \u2502 chart.resize();\nUSER \u22ee...\nUSER \nUSER aider/website/_includes/leaderboard.js:\nUSER \u22ee...\nUSER \u2502 function updateChart() {\nUSER \u2502 var selectedRows = document.querySelectorAll('tr.selected');\nUSER \u2502 var showAll = selectedRows.length === 0;\nUSER \u2502\nUSER \u2502 displayedData = [];\nUSER \u2502 leaderboardData.labels = [];\nUSER \u2502 leaderboardData.datasets[0].data = [];\nUSER \u2502\nUSER \u2502 allData.forEach(function(row, index) {\nUSER \u2502 var rowElement = document.getElementById('edit-row-' + index);\nUSER \u22ee...\nUSER \nUSER aider/website/_includes/quant-chart.js:\nUSER \u22ee...\nUSER \u2502 function updateChart(filterText) {\nUSER \u2502 var filteredData = allData.filter(row => \nUSER \u2502 row.model.toLowerCase().includes(filterText.toLowerCase())\nUSER \u2502 );\nUSER \u2502 \nUSER \u2502 var chartData = {\nUSER \u2502 labels: filteredData.map(row => row.model),\nUSER \u2502 datasets: [{\nUSER \u2502 label: 'Percent completed correctly',\nUSER \u2502 data: filteredData.map(row => row.pass_rate_2),\nUSER \u22ee...\nUSER \nUSER aider/website/_includes/qwq-chart.js:\nUSER \u22ee...\nUSER \u2502 function updateChart(filterText) {\nUSER \u2502 var filteredData = allData.filter(row => \nUSER \u2502 row.model.toLowerCase().includes(filterText.toLowerCase())\nUSER \u2502 );\nUSER \u2502 \nUSER \u2502 var chartData = {\nUSER \u2502 labels: filteredData.map(row => row.model),\nUSER \u2502 datasets: [{\nUSER \u2502 data: filteredData.map(row => row.pass_rate_2),\nUSER \u2502 backgroundColor: filteredData.map(row => \nUSER \u22ee...\nUSER \nUSER benchmark/benchmark.py:\nUSER \u22ee...\nUSER \u2502@app.command()\nUSER \u2502def main(\nUSER \u2502 dirnames: Optional[List[str]] = typer.Argument(None, help=\"Directory names\"),\nUSER \u2502 graphs: bool = typer.Option(False, \"--graphs\", help=\"Generate graphs\"),\nUSER \u2502 model: str = typer.Option(\"gpt-3.5-turbo\", \"--model\", \"-m\", help=\"Model name\"),\nUSER \u2502 sleep: float = typer.Option(\nUSER \u2502 0, \"--sleep\", help=\"Sleep seconds between tests when single threaded\"\nUSER \u2502 ),\nUSER \u2502 languages: str = typer.Option(\nUSER \u2502 None, \"--languages\", \"-l\", help=\"Only run tests for specific languages (comma separated)\"\nUSER \u2502 ),\nUSER \u22ee...\nUSER \u2502def load_results(dirname, stats_languages=None):\nUSER \u22ee...\nUSER \u2502def summarize_results(dirname, stats_languages=None):\nUSER \u2502 all_results = load_results(dirname, stats_languages)\nUSER \u2502\nUSER \u22ee...\nUSER \u2502 def show(stat, red=\"red\"):\nUSER \u22ee...\nUSER \u2502def cleanup_test_output(output, testdir):\nUSER \u22ee...\nUSER \nUSER benchmark/over_time.py:\nUSER \u22ee...\nUSER \u2502class BenchmarkPlotter:\nUSER \u2502 LABEL_FONT_SIZE = 16\nUSER \u2502\nUSER \u22ee...\nUSER \u2502 def load_data(self, yaml_file: str) -> List[ModelData]:\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER benchmark/problem_stats.py:\nUSER \u22ee...\nUSER \u2502def load_results(dirname):\nUSER \u22ee...\nUSER \nUSER benchmark/refactor_tools.py:\nUSER \u22ee...\nUSER \u2502class ParentNodeTransformer(ast.NodeTransformer):\nUSER \u2502 \"\"\"\nUSER \u2502 This transformer sets the 'parent' attribute on each node.\nUSER \u22ee...\nUSER \u2502 def generic_visit(self, node):\nUSER \u22ee...\nUSER \u2502def main(paths):\nUSER \u22ee...\nUSER \nUSER benchmark/rungrid.py:\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \u2502def run(dirname, model, edit_format):\nUSER \u22ee...\nUSER \nUSER benchmark/swe_bench.py:\nUSER \u22ee...\nUSER \u2502def plot_swe_bench(data_file, is_lite):\nUSER \u22ee...\nUSER \nUSER scripts/blame.py:\nUSER \u22ee...\nUSER \u2502def run(cmd):\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER scripts/issues.py:\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER scripts/my_models.py:\nUSER \u22ee...\nUSER \u2502def collect_model_stats(n_lines=1000):\nUSER \u22ee...\nUSER \u2502def format_text_table(model_stats):\nUSER \u22ee...\nUSER \nUSER scripts/update-history.py:\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER scripts/versionbump.py:\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER scripts/yank-old-versions.py:\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER tests/basic/test_sanity_check_repo.py:\nUSER \u22ee...\nUSER \u2502def mock_repo_wrapper(repo_obj, git_repo_error=None):\nUSER \u22ee...\nUSER \nUSER tests/basic/test_watch.py:\nUSER \u22ee...\nUSER \u2502def test_ai_comment_pattern():\nUSER \u2502 # Create minimal IO and Coder instances for testing\nUSER \u2502 class MinimalCoder:\nUSER \u2502 def __init__(self, io):\nUSER \u2502 self.io = io\nUSER \u2502 self.root = \".\"\nUSER \u2502 self.abs_fnames = set()\nUSER \u2502\nUSER \u2502 def get_rel_fname(self, fname):\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/c/test.c:\nUSER \u22ee...\nUSER \u2502int main() {\nUSER \u2502 printf(\"Hello, World!\\n\");\nUSER \u2502 return 0;\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/cpp/test.cpp:\nUSER \u22ee...\nUSER \u2502int main() {\nUSER \u2502 std::cout << \"Hello, World!\" << std::endl;\nUSER \u2502 return 0;\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/csharp/test.cs:\nUSER \u22ee...\nUSER \u2502namespace Greetings {\nUSER \u2502 public interface IGreeter {\nUSER \u2502 string Greet(string name);\nUSER \u2502 }\nUSER \u2502\nUSER \u2502 public class Person {\nUSER \u2502 public string Name { get; set; }\nUSER \u2502 public int Age { get; set; }\nUSER \u2502\nUSER \u2502 public Person(string name, int age) {\nUSER \u2502 Name = name;\nUSER \u2502 Age = age;\nUSER \u2502 }\nUSER \u22ee...\nUSER \u2502 public class FormalGreeter : IGreeter {\nUSER \u2502 private const string PREFIX = \"Good day\";\nUSER \u2502 private static readonly int MAX_AGE = 150;\nUSER \u2502\nUSER \u2502 public string Greet(string name) {\nUSER \u2502 return $\"{PREFIX}, {name}!\";\nUSER \u2502 }\nUSER \u2502\nUSER \u2502 public string GreetPerson(Person person) {\nUSER \u2502 return $\"{PREFIX}, {person.Name} ({person.Age})!\";\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/elisp/test.el:\nUSER \u22ee...\nUSER \u2502(defun create-formal-greeter ()\nUSER \u22ee...\nUSER \u2502(defun main ()\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/elixir/test.ex:\nUSER \u2502defmodule Greeter do\nUSER \u2502 def hello(name) do\nUSER \u2502 IO.puts(\"Hello, #{name}!\")\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/elm/test.elm:\nUSER \u22ee...\nUSER \u2502type Greeting\nUSER \u2502 = Formal\nUSER \u22ee...\nUSER \u2502greet style person =\nUSER \u2502 let\nUSER \u2502 prefix =\nUSER \u22ee...\nUSER \u2502defaultPerson =\nUSER \u22ee...\nUSER \u2502main =\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/go/test.go:\nUSER \u22ee...\nUSER \u2502type Person struct {\nUSER \u2502 Name string\nUSER \u2502 Age int\nUSER \u22ee...\nUSER \u2502type Greeter interface {\nUSER \u2502 Greet(p Person) string\nUSER \u22ee...\nUSER \u2502type FormalGreeter struct {\nUSER \u2502 Prefix string\nUSER \u22ee...\nUSER \u2502)\nUSER \u2502\nUSER \u2502func (g FormalGreeter) Greet(p Person) string {\nUSER \u2502 return fmt.Sprintf(\"%s, %s! You are %d years old.\",\nUSER \u2502 g.Prefix, p.Name, p.Age)\nUSER \u2502}\nUSER \u2502\nUSER \u2502func NewFormalGreeter() *FormalGreeter {\nUSER \u2502 return &FormalGreeter{Prefix: \"Good day\"}\nUSER \u2502}\nUSER \u2502\nUSER \u2502func main() {\nUSER \u2502 greeter := NewFormalGreeter()\nUSER \u2502 person := Person{Name: DefaultName, Age: 42}\nUSER \u2502 fmt.Println(greeter.Greet(person))\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/java/test.java:\nUSER \u2502public interface Greeting {\nUSER \u2502 String greet(String name);\nUSER \u22ee...\nUSER \u2502public class Test implements Greeting {\nUSER \u2502 private String prefix = \"Hello\";\nUSER \u2502\nUSER \u2502 public String greet(String name) {\nUSER \u2502 return prefix + \", \" + name + \"!\";\nUSER \u2502 }\nUSER \u2502\nUSER \u2502 public static void main(String[] args) {\nUSER \u2502 Test greeter = new Test();\nUSER \u2502 System.out.println(greeter.greet(\"World\"));\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/javascript/test.js:\nUSER \u22ee...\nUSER \u2502class Person {\nUSER \u2502 constructor(name) {\nUSER \u2502 this.name = name;\nUSER \u2502 }\nUSER \u2502\nUSER \u2502 sayHello() {\nUSER \u2502 return `Hello, ${this.name}!`;\nUSER \u2502 }\nUSER \u22ee...\nUSER \u2502function greet(person) {\nUSER \u2502 return person.sayHello();\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/kotlin/test.kt:\nUSER \u2502interface Greeting {\nUSER \u2502 fun greet(name: String): String\nUSER \u22ee...\nUSER \u2502class Test : Greeting {\nUSER \u2502 private val prefix = \"Hello\"\nUSER \u2502\nUSER \u2502 override fun greet(name: String): String {\nUSER \u2502 return \"$prefix, $name!\"\nUSER \u2502 }\nUSER \u22ee...\nUSER \u2502fun main(args: Array) {\nUSER \u2502 val greeter = Test()\nUSER \u2502 println(greeter.greet(\"World\"))\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/ocaml/test.ml:\nUSER \u22ee...\nUSER \u2502module Greeter = struct\nUSER \u2502 type person = {\nUSER \u2502 name: string;\nUSER \u2502 age: int\nUSER \u2502 }\nUSER \u2502\nUSER \u2502 let create_person name age =\nUSER \u2502 {name; age}\nUSER \u2502\nUSER \u2502 let greet person =\nUSER \u2502 Printf.printf \"Hello, %s! You are %d years old.\\n\"\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/php/test.php:\nUSER \u22ee...\nUSER \u2502function greet($name) {\nUSER \u2502 echo \"Hello, $name!\";\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/python/test.py:\nUSER \u22ee...\nUSER \u2502class Person:\nUSER \u2502 \"\"\"A class representing a person.\"\"\"\nUSER \u2502\nUSER \u22ee...\nUSER \u2502 def greet(self, formal: bool = False) -> str:\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/ql/test.ql:\nUSER \u2502predicate greet(string name) {\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/ruby/test.rb:\nUSER \u2502def greet(name)\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/rust/test.rs:\nUSER \u22ee...\nUSER \u2502trait Greeting {\nUSER \u2502 fn greet(&self) -> String;\nUSER \u22ee...\nUSER \u2502struct Person {\nUSER \u2502 name: String,\nUSER \u2502 age: u32,\nUSER \u22ee...\nUSER \u2502impl Greeting for Person {\nUSER \u2502 fn greet(&self) -> String {\nUSER \u2502 format!(\"Hello, {}! You are {} years old.\", self.name, self.age)\nUSER \u2502 }\nUSER \u22ee...\nUSER \u2502fn main() {\nUSER \u2502 let person = Person::new(DEFAULT_NAME.to_string(), 30);\nUSER \u2502 println!(\"{}\", person.greet());\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/typescript/test.ts:\nUSER \u2502function greet(name: string): void {\nUSER \u22ee...\nUSER \nUSER tests/fixtures/sample-code-base/sample.js:\nUSER \u22ee...\nUSER \u2502function greet(name) {\nUSER \u2502 return `Hello, ${name}!`;\nUSER \u22ee...\nUSER \u2502function calculateCircleArea(radius) {\nUSER \u2502 return Math.PI * radius * radius;\nUSER \u22ee...\nUSER \u2502function isPrime(number) {\nUSER \u2502 if (number <= 1) return false;\nUSER \u2502 for (let i = 2; i <= Math.sqrt(number); i++) {\nUSER \u2502 if (number % i === 0) return false;\nUSER \u2502 }\nUSER \u2502 return true;\nUSER \u22ee...\nUSER \u2502function reverseString(str) {\nUSER \u2502 return str.split('').reverse().join('');\nUSER \u22ee...\nUSER \u2502function getRandomNumber(min, max) {\nUSER \u2502 return Math.floor(Math.random() * (max - min + 1)) + min;\nUSER \u22ee...\nUSER \u2502function filterEvenNumbers(numbers) {\nUSER \u2502 return numbers.filter(num => num % 2 !== 0);\nUSER \u22ee...\nUSER \u2502function factorial(n) {\nUSER \u2502 if (n === 0 || n === 1) return 1;\nUSER \u2502 return n * factorial(n - 1);\nUSER \u22ee...\nUSER \nUSER tests/fixtures/sample-code-base/sample.py:\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\n-------\nASSISTANT Ok, I won't try and edit those files without asking first.\n-------\nUSER Don't try and edit any existing code without asking me to add the files to the chat!\nUSER Tell me which files in my repo are the most likely to **need changes** to solve the requests I make, and then stop so I can add them to the chat.\nUSER Only include the files that are most likely to actually need to be edited.\nUSER Don't include files that might contain relevant context, just files that will need to be changed.\n-------\nASSISTANT Ok, based on your requests I will suggest which files need to be edited and then stop and wait for your approval.\n-------\nUSER hi\n-------\nUSER ok\n-------\nSYSTEM # *SEARCH/REPLACE block* Rules:\nSYSTEM \nSYSTEM Every *SEARCH/REPLACE block* must use this format:\nSYSTEM 1. The *FULL* file path alone on a line, verbatim. No bold asterisks, no quotes around it, no escaping of characters, etc.\nSYSTEM 2. The opening fence and code language, eg: ```python\nSYSTEM 3. The start of search block: <<<<<<< SEARCH\nSYSTEM 4. A contiguous chunk of lines to search for in the existing source code\nSYSTEM 5. The dividing line: =======\nSYSTEM 6. The lines to replace into the source code\nSYSTEM 7. The end of the replace block: >>>>>>> REPLACE\nSYSTEM 8. The closing fence: ```\nSYSTEM \nSYSTEM Use the *FULL* file path, as shown to you by the user.\nSYSTEM \nSYSTEM Every *SEARCH* section must *EXACTLY MATCH* the existing file content, character for character, including all comments, docstrings, etc.\nSYSTEM If the file contains code or other data wrapped/escaped in json/xml/quotes or other containers, you need to propose edits to the literal contents of the file, including the container markup.\nSYSTEM \nSYSTEM *SEARCH/REPLACE* blocks will *only* replace the first match occurrence.\nSYSTEM Including multiple unique *SEARCH/REPLACE* blocks if needed.\nSYSTEM Include enough lines in each SEARCH section to uniquely match each set of lines that need to change.\nSYSTEM \nSYSTEM Keep *SEARCH/REPLACE* blocks concise.\nSYSTEM Break large *SEARCH/REPLACE* blocks into a series of smaller blocks that each change a small portion of the file.\nSYSTEM Include just the changing lines, and a few surrounding lines if needed for uniqueness.\nSYSTEM Do not include long runs of unchanging lines in *SEARCH/REPLACE* blocks.\nSYSTEM \nSYSTEM Only create *SEARCH/REPLACE* blocks for files that the user has added to the chat!\nSYSTEM \nSYSTEM To move code within a file, use 2 *SEARCH/REPLACE* blocks: 1 to delete it from its current location, 1 to insert it in the new location.\nSYSTEM \nSYSTEM Pay attention to which filenames the user wants you to edit, especially if they are asking you to create a new file.\nSYSTEM \nSYSTEM If you want to put code in a new file, use a *SEARCH/REPLACE block* with:\nSYSTEM - A new file path, including dir name if needed\nSYSTEM - An empty `SEARCH` section\nSYSTEM - The new file's contents in the `REPLACE` section\nSYSTEM \nSYSTEM To rename files which have been added to the chat, use shell commands at the end of your response.\nSYSTEM \nSYSTEM If the user just says something like \"ok\" or \"go ahead\" or \"do that\" they probably want you to make SEARCH/REPLACE blocks for the code changes you just proposed.\nSYSTEM The user will say when they've applied your edits. If they haven't explicitly confirmed the edits have been applied, they probably want proper SEARCH/REPLACE blocks.\nSYSTEM \nSYSTEM \nSYSTEM ONLY EVER RETURN CODE IN A *SEARCH/REPLACE BLOCK*!\nSYSTEM \nSYSTEM Examples of when to suggest shell commands:\nSYSTEM \nSYSTEM - If you changed a self-contained html file, suggest an OS-appropriate command to open a browser to view it to see the updated content.\nSYSTEM - If you changed a CLI program, suggest the command to run it to see the new behavior.\nSYSTEM - If you added a test, suggest how to run it with the testing tool used by the project.\nSYSTEM - Suggest OS-appropriate commands to delete or rename files/directories, or other file system operations.\nSYSTEM - If your code changes add new dependencies, suggest the command to install them.\nSYSTEM - Etc.\nSYSTEM "}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737566814} +{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737566915} +{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737566915} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737566920} +{"event": "repo", "properties": {"num_files": 427}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737566922} +{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737566922} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737566928} +{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 89281, "completion_tokens": 0, "total_tokens": 89281, "cost": 0.012499340000000001, "total_cost": 0.012499340000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737566930} +{"event": "command_drop", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737566937} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737566937} +{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 10011, "completion_tokens": 32, "total_tokens": 10043, "cost": 0.0014105, "total_cost": 0.013909840000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737566942} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737566995} +{"event": "repo", "properties": {"num_files": 427}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737566997} +{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737567001} +{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737567001} +{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737567005} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737567071} +{"event": "gui session", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737567071} +{"event": "exit", "properties": {"reason": "GUI session ended"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737567071} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737568228} +{"event": "repo", "properties": {"num_files": 427}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737568230} +{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737568230} +{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737568233} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737568406} +{"event": "repo", "properties": {"num_files": 427}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737568408} +{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737568412} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737568435} +{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737568437} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737568437} +{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 4375, "completion_tokens": 493, "total_tokens": 4868, "cost": 0.0007505400000000001, "total_cost": 0.0007505400000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737568450} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737568450} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737568486} +{"event": "gui session", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737568486} +{"event": "exit", "properties": {"reason": "GUI session ended"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737568486} diff --git a/aider/website/docs/faq.md b/aider/website/docs/faq.md index bc9c89909..9202af61f 100644 --- a/aider/website/docs/faq.md +++ b/aider/website/docs/faq.md @@ -249,10 +249,10 @@ tr:hover { background-color: #f5f5f5; } - - - - + + + + From c5fe81f4e66f43e43eed59f283e8e16c2cce13b2 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 22 Jan 2025 09:59:23 -0800 Subject: [PATCH 082/229] version bump to 0.72.2 --- aider/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aider/__init__.py b/aider/__init__.py index 1e6077bb3..68f56c7ae 100644 --- a/aider/__init__.py +++ b/aider/__init__.py @@ -1,6 +1,6 @@ from packaging import version -__version__ = "0.72.2.dev" +__version__ = "0.72.2" safe_version = __version__ try: From 216b679e4b168ed8ed4526f5bb0599d88f6143f8 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 22 Jan 2025 10:01:02 -0800 Subject: [PATCH 083/229] set version to 0.72.3.dev --- aider/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aider/__init__.py b/aider/__init__.py index 68f56c7ae..680e531c9 100644 --- a/aider/__init__.py +++ b/aider/__init__.py @@ -1,6 +1,6 @@ from packaging import version -__version__ = "0.72.2" +__version__ = "0.72.3.dev" safe_version = __version__ try: From 075d4d4210404d3584bbace271457fe45918c746 Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Wed, 22 Jan 2025 10:03:51 -0800 Subject: [PATCH 084/229] test: add tests for message integrity after interrupts and token limits --- tests/basic/test_coder.py | 68 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/tests/basic/test_coder.py b/tests/basic/test_coder.py index 88026cfb0..146ddcb6c 100644 --- a/tests/basic/test_coder.py +++ b/tests/basic/test_coder.py @@ -974,6 +974,74 @@ This command will print 'Hello, World!' to the console.""" self.assertIn("Output tokens:", error_message) self.assertIn("Total tokens:", error_message) + def test_keyboard_interrupt_handling(self): + with GitTemporaryDirectory(): + io = InputOutput(yes=True) + coder = Coder.create(self.GPT35, "diff", io=io) + + # Simulate keyboard interrupt during message processing + def mock_send(*args, **kwargs): + raise KeyboardInterrupt() + + coder.send = mock_send + + # Initial valid state + coder.cur_messages = [{"role": "user", "content": "Initial question"}] + self.assertTrue(sanity_check_messages(coder.cur_messages)) + + # Process message that will trigger interrupt + with self.assertRaises(KeyboardInterrupt): + list(coder.send_message("Test message")) + + # Verify messages are still in valid state + self.assertTrue(sanity_check_messages(coder.cur_messages)) + self.assertEqual(len(coder.cur_messages), 2) + self.assertEqual(coder.cur_messages[-1]["role"], "user") + + def test_token_limit_error_handling(self): + with GitTemporaryDirectory(): + io = InputOutput(yes=True) + coder = Coder.create(self.GPT35, "diff", io=io) + + # Simulate token limit error + def mock_send(*args, **kwargs): + raise FinishReasonLength() + + coder.send = mock_send + + # Initial valid state + coder.cur_messages = [{"role": "user", "content": "Initial question"}] + self.assertTrue(sanity_check_messages(coder.cur_messages)) + + # Process message that hits token limit + list(coder.send_message("Long message")) + + # Verify messages are still in valid state + self.assertTrue(sanity_check_messages(coder.cur_messages)) + self.assertEqual(coder.cur_messages[-1]["role"], "user") + + def test_message_sanity_after_partial_response(self): + with GitTemporaryDirectory(): + io = InputOutput(yes=True) + coder = Coder.create(self.GPT35, "diff", io=io) + + # Simulate partial response then interrupt + def mock_send(*args, **kwargs): + coder.partial_response_content = "Partial response" + raise KeyboardInterrupt() + + coder.send = mock_send + + coder.cur_messages = [{"role": "user", "content": "Question"}] + with self.assertRaises(KeyboardInterrupt): + list(coder.send_message("Test")) + + # Verify message structure remains valid + self.assertTrue(sanity_check_messages(coder.cur_messages)) + self.assertEqual(len(coder.cur_messages), 2) + self.assertEqual(coder.cur_messages[-1]["role"], "user") + self.assertIn("Partial response", coder.partial_response_content) + if __name__ == "__main__": unittest.main() From c79217dd75163893c1d14e93affec17bab92440c Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Wed, 22 Jan 2025 10:04:58 -0800 Subject: [PATCH 085/229] fix: Add missing imports for FinishReasonLength and sanity_check_messages --- tests/basic/test_coder.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/basic/test_coder.py b/tests/basic/test_coder.py index 146ddcb6c..50d111f38 100644 --- a/tests/basic/test_coder.py +++ b/tests/basic/test_coder.py @@ -7,12 +7,13 @@ from unittest.mock import MagicMock, patch import git from aider.coders import Coder -from aider.coders.base_coder import UnknownEditFormat +from aider.coders.base_coder import UnknownEditFormat, FinishReasonLength from aider.dump import dump # noqa: F401 from aider.io import InputOutput from aider.models import Model from aider.repo import GitRepo from aider.utils import GitTemporaryDirectory +from aider.sendchat import sanity_check_messages class TestCoder(unittest.TestCase): From 40ee3b1b45be4b31f64013ce2cce83fd67a8fa4a Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Wed, 22 Jan 2025 10:05:02 -0800 Subject: [PATCH 086/229] style: Reorder imports in test_coder.py --- tests/basic/test_coder.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/basic/test_coder.py b/tests/basic/test_coder.py index 50d111f38..19a87d973 100644 --- a/tests/basic/test_coder.py +++ b/tests/basic/test_coder.py @@ -7,13 +7,13 @@ from unittest.mock import MagicMock, patch import git from aider.coders import Coder -from aider.coders.base_coder import UnknownEditFormat, FinishReasonLength +from aider.coders.base_coder import FinishReasonLength, UnknownEditFormat from aider.dump import dump # noqa: F401 from aider.io import InputOutput from aider.models import Model from aider.repo import GitRepo -from aider.utils import GitTemporaryDirectory from aider.sendchat import sanity_check_messages +from aider.utils import GitTemporaryDirectory class TestCoder(unittest.TestCase): From 30b150dbfc636c0cc34f5f1112aa8f46cec19a13 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 22 Jan 2025 10:17:21 -0800 Subject: [PATCH 087/229] refactor: Simplify test assertions and remove redundant checks --- tests/basic/test_coder.py | 33 +++++++++++++++------------------ 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/tests/basic/test_coder.py b/tests/basic/test_coder.py index 19a87d973..f18ce5515 100644 --- a/tests/basic/test_coder.py +++ b/tests/basic/test_coder.py @@ -982,22 +982,21 @@ This command will print 'Hello, World!' to the console.""" # Simulate keyboard interrupt during message processing def mock_send(*args, **kwargs): + coder.partial_response_content = "Partial response" + coder.partial_response_function_call = dict() raise KeyboardInterrupt() coder.send = mock_send # Initial valid state - coder.cur_messages = [{"role": "user", "content": "Initial question"}] - self.assertTrue(sanity_check_messages(coder.cur_messages)) + sanity_check_messages(coder.cur_messages) # Process message that will trigger interrupt - with self.assertRaises(KeyboardInterrupt): - list(coder.send_message("Test message")) + list(coder.send_message("Test message")) # Verify messages are still in valid state - self.assertTrue(sanity_check_messages(coder.cur_messages)) - self.assertEqual(len(coder.cur_messages), 2) - self.assertEqual(coder.cur_messages[-1]["role"], "user") + sanity_check_messages(coder.cur_messages) + self.assertEqual(coder.cur_messages[-1]["role"], "assistant") def test_token_limit_error_handling(self): with GitTemporaryDirectory(): @@ -1006,20 +1005,21 @@ This command will print 'Hello, World!' to the console.""" # Simulate token limit error def mock_send(*args, **kwargs): + coder.partial_response_content = "Partial response" + coder.partial_response_function_call = dict() raise FinishReasonLength() coder.send = mock_send # Initial valid state - coder.cur_messages = [{"role": "user", "content": "Initial question"}] - self.assertTrue(sanity_check_messages(coder.cur_messages)) + sanity_check_messages(coder.cur_messages) # Process message that hits token limit list(coder.send_message("Long message")) # Verify messages are still in valid state - self.assertTrue(sanity_check_messages(coder.cur_messages)) - self.assertEqual(coder.cur_messages[-1]["role"], "user") + sanity_check_messages(coder.cur_messages) + self.assertEqual(coder.cur_messages[-1]["role"], "assistant") def test_message_sanity_after_partial_response(self): with GitTemporaryDirectory(): @@ -1029,19 +1029,16 @@ This command will print 'Hello, World!' to the console.""" # Simulate partial response then interrupt def mock_send(*args, **kwargs): coder.partial_response_content = "Partial response" + coder.partial_response_function_call = dict() raise KeyboardInterrupt() coder.send = mock_send - coder.cur_messages = [{"role": "user", "content": "Question"}] - with self.assertRaises(KeyboardInterrupt): - list(coder.send_message("Test")) + list(coder.send_message("Test")) # Verify message structure remains valid - self.assertTrue(sanity_check_messages(coder.cur_messages)) - self.assertEqual(len(coder.cur_messages), 2) - self.assertEqual(coder.cur_messages[-1]["role"], "user") - self.assertIn("Partial response", coder.partial_response_content) + sanity_check_messages(coder.cur_messages) + self.assertEqual(coder.cur_messages[-1]["role"], "assistant") if __name__ == "__main__": From 56ab8de9681c08527f13954557d203e63578c3b1 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 22 Jan 2025 15:07:58 -0800 Subject: [PATCH 088/229] copy --- aider/website/docs/usage/not-code.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/aider/website/docs/usage/not-code.md b/aider/website/docs/usage/not-code.md index 5abce95ce..7939dfe0d 100644 --- a/aider/website/docs/usage/not-code.md +++ b/aider/website/docs/usage/not-code.md @@ -6,7 +6,11 @@ description: Edit configuration files, documentation, and other text-based forma # Editing config & text files -Aider isn't just for code! Here are practical examples of modifying common config/text files: +Aider isn't just for code, it can be very helpful when editing +almost any text file. +You can use aider to make changes to you shell rc files, ssh settings, dockerfiles, +config files or docs. +Here are practical examples of modifying common config/text files: ## Shell Configuration ```bash From 3d81bdd28108a16721dfc680e313fc715d680889 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 22 Jan 2025 15:08:56 -0800 Subject: [PATCH 089/229] copy --- aider/website/docs/usage/not-code.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/aider/website/docs/usage/not-code.md b/aider/website/docs/usage/not-code.md index 7939dfe0d..e81894ff5 100644 --- a/aider/website/docs/usage/not-code.md +++ b/aider/website/docs/usage/not-code.md @@ -1,16 +1,18 @@ --- parent: Usage nav_order: 901 -description: Edit configuration files, documentation, and other text-based formats. +description: Use aider to edit configuration files, documentation, and other text-based formats. --- # Editing config & text files Aider isn't just for code, it can be very helpful when editing almost any text file. -You can use aider to make changes to you shell rc files, ssh settings, dockerfiles, -config files or docs. -Here are practical examples of modifying common config/text files: +You can use aider to make changes to your shell & ssh settings, +Dockerfiles +or pretty much any configuration or documentation file. + +Here are some practical examples of modifying common config/text files: ## Shell Configuration ```bash From fceead7cbe5428ea4f5d32dce72cdafcb11ca8d5 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 22 Jan 2025 15:16:02 -0800 Subject: [PATCH 090/229] copy --- aider/website/docs/usage/not-code.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aider/website/docs/usage/not-code.md b/aider/website/docs/usage/not-code.md index e81894ff5..73e734e56 100644 --- a/aider/website/docs/usage/not-code.md +++ b/aider/website/docs/usage/not-code.md @@ -21,7 +21,7 @@ $ aider .bashrc Added .bashrc to the chat. ──────────────────────────────────────────────────────────────── .bashrc -> Add an alias 'll' that runs 'ls -alh' and update PATH to include ~/.local/bin +> Add an alias 'll' that lists all files, with all details in human readable format. And update PATH to include uv installed tools. + alias ll='ls -alh' + export PATH="$HOME/.local/bin:$PATH" From 05a77c74060a793f7c66cdc04b9048a4f4e07dc2 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 22 Jan 2025 15:32:25 -0800 Subject: [PATCH 091/229] copy --- aider/website/docs/usage/not-code.md | 114 ++++++++++++++------------- 1 file changed, 58 insertions(+), 56 deletions(-) diff --git a/aider/website/docs/usage/not-code.md b/aider/website/docs/usage/not-code.md index 73e734e56..6a0bd8158 100644 --- a/aider/website/docs/usage/not-code.md +++ b/aider/website/docs/usage/not-code.md @@ -4,6 +4,7 @@ nav_order: 901 description: Use aider to edit configuration files, documentation, and other text-based formats. --- + # Editing config & text files Aider isn't just for code, it can be very helpful when editing @@ -15,27 +16,31 @@ or pretty much any configuration or documentation file. Here are some practical examples of modifying common config/text files: ## Shell Configuration -```bash + +
$ aider .bashrc Added .bashrc to the chat. -──────────────────────────────────────────────────────────────── -.bashrc -> Add an alias 'll' that lists all files, with all details in human readable format. And update PATH to include uv installed tools. -+ alias ll='ls -alh' -+ export PATH="$HOME/.local/bin:$PATH" + +#### Add an alias 'll' that lists all files, with all details in human readable format. And update PATH to include uv installed tools. + ``` ++ alias ll='ls -alh' ++ export PATH="$PATH:$HOME/.local/bin:$PATH" +``` +
## SSH Configurations -```bash + +
$ aider ~/.ssh/config Added config to the chat. -──────────────────────────────────────────────────────────────── -config -> Create a Host entry 'my-server' using bastion.example.com as JumpHost +#### Create a Host entry 'my-server' using bastion.example.com as JumpHost + +``` + Host my-server + HostName 192.168.1.100 + User deploy @@ -43,23 +48,26 @@ config + IdentityFile ~/.ssh/deploy_key + ProxyJump bastion.example.com ``` +
## Docker Setup -```bash + +
$ aider Dockerfile docker-compose.yml Added Dockerfile and docker-compose.yml to the chat. -──────────────────────────────────────────────────────────────── -Dockerfile -> Set non-root user and enable healthchecks +#### Set non-root user and enable healthchecks + +``` + USER appuser + HEALTHCHECK --interval=30s --timeout=3s \ + CMD curl -f http://localhost:8000/health || exit 1 +``` -docker-compose.yml -> Expose port 5432 and add volume for postgres data +#### Expose port 5432 and add volume for postgres data +``` services: postgres: image: postgres:15 @@ -68,87 +76,80 @@ docker-compose.yml + volumes: + - pgdata:/var/lib/postgresql/data ``` +
## Git Configuration -```bash + +
$ aider .gitconfig Added .gitconfig to the chat. -──────────────────────────────────────────────────────────────── -.gitconfig -> Set default push behavior to current branch and enable color UI +#### Set default push behavior to current branch and enable color UI + +``` + [push] + default = current + [color] + ui = auto ``` +
## System Configuration -```bash +
$ aider /etc/hosts # May need sudo Added hosts to the chat. -──────────────────────────────────────────────────────────────── -hosts -> Block tracking domains by pointing them to 127.0.0.1 +#### Block tracking domains by pointing them to 127.0.0.1 + +``` + 127.0.0.1 ads.example.com + 127.0.0.1 track.analytics.co ``` +
## Editor Configs -```bash +
$ aider .vimrc Added .vimrc to the chat. -──────────────────────────────────────────────────────────────── -.vimrc -> Enable line numbers and set 4-space tabs for Python +#### Enable line numbers and set 4-space tabs for Python + +``` + set number + autocmd FileType python set tabstop=4 shiftwidth=4 expandtab ``` +
-## Application Configuration -```bash +## VSCode Configuration +
$ aider settings.json Added settings.json to the chat. -──────────────────────────────────────────────────────────────── -settings.json (VSCode) -> Enable auto-format on save and set default formatter +#### Enable auto-format on save and set default formatter + +``` + "editor.formatOnSave": true, + "editor.defaultFormatter": "esbenp.prettier-vscode" ``` - -## Environment Files -```bash -$ aider .env - -Added .env to the chat. -──────────────────────────────────────────────────────────────── -.env -> Configure database connection with SSL - -+ DB_HOST=db.example.com -+ DB_PORT=5432 -+ DB_SSL=true -``` +
## Markdown Documentation -```bash +
$ aider README.md Added README.md to the chat. -──────────────────────────────────────────────────────────────── -README.md -> Add installation section with brew and pip options + +#### Add installation section with brew and pip options + +``` + ## Installation -+ ```bash ++ ``` + # Homebrew + brew install cool-app-10k + @@ -156,16 +157,16 @@ README.md + pipx install cool-app-10k + ``` ``` +
## XML Configuration -```bash +
$ aider pom.xml Added pom.xml to the chat. -──────────────────────────────────────────────────────────────── -pom.xml -> Add JUnit 5 dependency with test scope +#### Add JUnit 5 dependency with test scope +``` + + org.junit.jupiter + junit-jupiter-api @@ -173,5 +174,6 @@ pom.xml + test + ``` +
From 16c4374f7a14ab4b405b42eef4845ac5f147ac1b Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Thu, 23 Jan 2025 11:34:14 -0800 Subject: [PATCH 092/229] refactor: lowercase model names for fuzzy matching while preserving original case --- aider/models.py | 1 + 1 file changed, 1 insertion(+) diff --git a/aider/models.py b/aider/models.py index a75d604ce..bf99e1e43 100644 --- a/aider/models.py +++ b/aider/models.py @@ -1349,6 +1349,7 @@ def fuzzy_match_models(name): chat_models = set() for model, attrs in litellm.model_cost.items(): + # it's fine to lowercase for fuzzy searching, but we need to return the original case version ai! model = model.lower() if attrs.get("mode") != "chat": continue From a4b723628931f790dabc83c73f93cb6cc028d77b Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Thu, 23 Jan 2025 11:34:16 -0800 Subject: [PATCH 093/229] refactor: preserve original case in model name matching --- aider/models.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/aider/models.py b/aider/models.py index bf99e1e43..97575993b 100644 --- a/aider/models.py +++ b/aider/models.py @@ -1348,9 +1348,8 @@ def fuzzy_match_models(name): name = name.lower() chat_models = set() - for model, attrs in litellm.model_cost.items(): - # it's fine to lowercase for fuzzy searching, but we need to return the original case version ai! - model = model.lower() + for orig_model, attrs in litellm.model_cost.items(): + model = orig_model.lower() if attrs.get("mode") != "chat": continue provider = attrs.get("litellm_provider", "").lower() @@ -1359,12 +1358,12 @@ def fuzzy_match_models(name): provider += "/" if model.startswith(provider): - fq_model = model + fq_model = orig_model else: - fq_model = provider + model + fq_model = provider + orig_model chat_models.add(fq_model) - chat_models.add(model) + chat_models.add(orig_model) chat_models = sorted(chat_models) # exactly matching model From e64ed4c27f5664198f3724e34f135751e88c7ed5 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Thu, 23 Jan 2025 11:35:11 -0800 Subject: [PATCH 094/229] copy --- aider/website/assets/sample-analytics.jsonl | 204 ++++++++++---------- aider/website/docs/faq.md | 14 +- aider/website/docs/more/infinite-output.md | 1 + 3 files changed, 110 insertions(+), 109 deletions(-) diff --git a/aider/website/assets/sample-analytics.jsonl b/aider/website/assets/sample-analytics.jsonl index 78f55e40a..4b1de6509 100644 --- a/aider/website/assets/sample-analytics.jsonl +++ b/aider/website/assets/sample-analytics.jsonl @@ -1,105 +1,3 @@ -{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547927} -{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547927} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547952} -{"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547954} -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547954} -{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547955} -{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547955} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547961} -{"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547963} -{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547966} -{"event": "command_reset", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547977} -{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736547987} -{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736548007} -{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736548007} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736548156} -{"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736548158} -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736548158} -{"event": "ai-comments file-add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736548245} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736548376} -{"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736548377} -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736548377} -{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736548402} -{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736548405} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736548450} -{"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736548452} -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736548452} -{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736548539} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736548540} -{"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736548542} -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736548542} -{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736548645} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736548646} -{"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736548648} -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736548648} -{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736548650} -{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736548650} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736548661} -{"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736548663} -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736548663} -{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736548668} -{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736548668} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736548680} -{"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736548681} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736548692} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 16626, "completion_tokens": 151, "total_tokens": 16777, "cost": 0.0023699199999980404, "total_cost": 0.0023699199999980404}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736548700} -{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736548708} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736548726} -{"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736548728} -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736548728} -{"event": "command_reset", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736548731} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736548746} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 10026, "completion_tokens": 111, "total_tokens": 10137, "cost": 0.00143471999999804, "total_cost": 0.00143471999999804}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736548753} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736548767} -{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736548772} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736548774} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 17794, "completion_tokens": 465, "total_tokens": 18259, "cost": 0.0026213599999980403, "total_cost": 0.0040560799999960805}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736548788} -{"event": "ai-comments file-add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736548915} -{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736548919} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736548963} -{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736548965} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736548965} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 27953, "completion_tokens": 820, "total_tokens": 28773, "cost": 0.0041430199999980405, "total_cost": 0.0041430199999980405}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736548990} -{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736548990} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736549095} -{"event": "gui session", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736549095} -{"event": "exit", "properties": {"reason": "GUI session ended"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736549095} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736549200} -{"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736549202} -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736549202} -{"event": "command_run", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736549212} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736549224} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 13281, "completion_tokens": 183, "total_tokens": 13464, "cost": 0.00191057999999804, "total_cost": 0.00191057999999804}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736549232} -{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736549338} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736549351} -{"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736549352} -{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736549356} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736549431} -{"event": "gui session", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736549431} -{"event": "exit", "properties": {"reason": "GUI session ended"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736549431} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736549444} -{"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736549445} -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736549445} -{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736549447} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736549470} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 17467, "completion_tokens": 323, "total_tokens": 17790, "cost": 0.00253581999999804, "total_cost": 0.00253581999999804}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736549483} -{"event": "ai-comments file-add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736549673} -{"event": "ai-comments file-add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736549678} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736549743} -{"event": "gui session", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736549743} -{"event": "exit", "properties": {"reason": "GUI session ended"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736549743} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736550079} -{"event": "gui session", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736550079} -{"event": "exit", "properties": {"reason": "GUI session ended"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736550079} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736550370} -{"event": "gui session", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736550370} -{"event": "exit", "properties": {"reason": "GUI session ended"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736550370} -{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736550472} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736550503} -{"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736550505} -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736550505} -{"event": "command_help", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736550505} -{"event": "command_help", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736550511} {"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736550512} {"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736550512} {"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736550548} @@ -998,3 +896,105 @@ {"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737568486} {"event": "gui session", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737568486} {"event": "exit", "properties": {"reason": "GUI session ended"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737568486} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737568729} +{"event": "gui session", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737568729} +{"event": "exit", "properties": {"reason": "GUI session ended"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737568729} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737568809} +{"event": "repo", "properties": {"num_files": 427}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737568811} +{"event": "cli session", "properties": {"main_model": "deepseek/REDACTED", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737568815} +{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737568825} +{"event": "command_read-only", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737568833} +{"event": "command_read-only", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737568834} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737568841} +{"event": "gui session", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737568841} +{"event": "exit", "properties": {"reason": "GUI session ended"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737568841} +{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737568842} +{"event": "command_editor", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737568857} +{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737568920} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737568920} +{"event": "message_send", "properties": {"main_model": "deepseek/REDACTED", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "ask", "prompt_tokens": 27240, "completion_tokens": 737, "total_tokens": 27977, "cost": 0.01659603, "total_cost": 0.01659603}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737568955} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737568963} +{"event": "message_send", "properties": {"main_model": "deepseek/REDACTED", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 30223, "completion_tokens": 719, "total_tokens": 30942, "cost": 0.01819726, "total_cost": 0.034793290000000004}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737568998} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737568998} +{"event": "message_send", "properties": {"main_model": "deepseek/REDACTED", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 31787, "completion_tokens": 727, "total_tokens": 32514, "cost": 0.019074980000000002, "total_cost": 0.05386827000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737569029} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737569031} +{"event": "message_send", "properties": {"main_model": "deepseek/REDACTED", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 33210, "completion_tokens": 52, "total_tokens": 33262, "cost": 0.01837938, "total_cost": 0.07224765000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737569046} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737569046} +{"event": "message_send", "properties": {"main_model": "deepseek/REDACTED", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 33391, "completion_tokens": 77, "total_tokens": 33468, "cost": 0.01853368, "total_cost": 0.09078133000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737569061} +{"event": "command_lint", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737569067} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737569072} +{"event": "message_send", "properties": {"main_model": "deepseek/REDACTED", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 31055, "completion_tokens": 158, "total_tokens": 31213, "cost": 0.01742627, "total_cost": 0.10820760000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737569095} +{"event": "command_run", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737569179} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737569257} +{"event": "message_send", "properties": {"main_model": "deepseek/REDACTED", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 37700, "completion_tokens": 543, "total_tokens": 38243, "cost": 0.02192417, "total_cost": 0.11270550000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737569287} +{"event": "command_model", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737569308} +{"event": "command_clear", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737569311} +{"event": "command_run", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737569314} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737569364} +{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 34544, "completion_tokens": 195, "total_tokens": 34739, "cost": 0.00489076, "total_cost": 0.11759626000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737569384} +{"event": "command_model", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737569394} +{"event": "command_clear", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737569396} +{"event": "command_run", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737569398} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737569454} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 34541, "completion_tokens": 293, "total_tokens": 34834, "cost": 0.108018, "total_cost": 0.22561426}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737569469} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737569470} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 35069, "completion_tokens": 236, "total_tokens": 35305, "cost": 0.10874700000000001, "total_cost": 0.33436126}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737569484} +{"event": "command_clear", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737569501} +{"event": "command_model", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737569503} +{"event": "command_model", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737569510} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737569544} +{"event": "message_send", "properties": {"main_model": "deepseek/REDACTED", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 30030, "completion_tokens": 361, "total_tokens": 30391, "cost": 0.01730709, "total_cost": 0.35166835}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737569568} +{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737569802} +{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737569802} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737569836} +{"event": "repo", "properties": {"num_files": 427}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737569838} +{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737569842} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737570474} +{"event": "repo", "properties": {"num_files": 427}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737570476} +{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737570477} +{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737570508} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737570508} +{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "ask", "prompt_tokens": 7649, "completion_tokens": 228, "total_tokens": 7877, "cost": 0.0011347, "total_cost": 0.0011347}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737570518} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737580816} +{"event": "repo", "properties": {"num_files": 427}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737580818} +{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737580818} +{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737580820} +{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737580820} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737580823} +{"event": "repo", "properties": {"num_files": 427}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737580825} +{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737580825} +{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737580838} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737586733} +{"event": "repo", "properties": {"num_files": 427}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737586735} +{"event": "exit", "properties": {"reason": "Showed prompts"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737586736} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737651344} +{"event": "repo", "properties": {"num_files": 428}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737651347} +{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737651347} +{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737651350} +{"event": "command_read-only", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737651356} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737651361} +{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "ask", "prompt_tokens": 5303, "completion_tokens": 232, "total_tokens": 5535, "cost": 0.00080738, "total_cost": 0.00080738}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737651371} +{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737651891} +{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737651891} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737660558} +{"event": "model warning", "properties": {"main_model": "sambanova/REDACTED", "weak_model": "sambanova/REDACTED", "editor_model": "sambanova/REDACTED"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737660560} +{"event": "exit", "properties": {"reason": "Keyboard interrupt during model warnings"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737660750} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737660812} +{"event": "repo", "properties": {"num_files": 427}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737660814} +{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737660814} +{"event": "ai-comments file-add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737660838} +{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737660838} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737660838} +{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 16771, "completion_tokens": 370, "total_tokens": 17141, "cost": 0.0024515400000000003, "total_cost": 0.0024515400000000003}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737660852} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737660856} +{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 17287, "completion_tokens": 82, "total_tokens": 17369, "cost": 0.00244314, "total_cost": 0.00489468}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737660870} +{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737660872} +{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737660872} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737660876} +{"event": "model warning", "properties": {"main_model": "sambanova/REDACTED", "weak_model": "sambanova/REDACTED", "editor_model": "sambanova/REDACTED"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737660878} +{"event": "exit", "properties": {"reason": "Keyboard interrupt during model warnings"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737660886} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737660890} +{"event": "repo", "properties": {"num_files": 427}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737660891} +{"event": "cli session", "properties": {"main_model": "sambanova/Meta-Llama-3.2-1B-Instruct", "weak_model": "sambanova/Meta-Llama-3.2-1B-Instruct", "editor_model": "sambanova/Meta-Llama-3.2-1B-Instruct", "edit_format": "whole"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737660891} +{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737660893} +{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737660893} diff --git a/aider/website/docs/faq.md b/aider/website/docs/faq.md index 9202af61f..4561dd3fc 100644 --- a/aider/website/docs/faq.md +++ b/aider/website/docs/faq.md @@ -249,13 +249,13 @@ tr:hover { background-color: #f5f5f5; }
Model NameTotal TokensPercent
deepseek/deepseek-chat1,105,73858.1%
claude-3-5-sonnet-20241022699,67636.8%
deepseek/REDACTED41,3702.2%
o125,1211.3%
deepseek/deepseek-chat1,295,39561.6%
claude-3-5-sonnet-20241022699,67633.3%
deepseek/REDACTED50,8312.4%
o125,1211.2%
claude-3-5-haiku-2024102210,0830.5%
gemini/gemini-exp-120610,0680.5%
mistral/codestral-latest8,1370.4%
- - - - - - - + + + + + + +
Model NameTotal TokensPercent
deepseek/deepseek-chat1,295,39561.6%
claude-3-5-sonnet-20241022699,67633.3%
deepseek/REDACTED50,8312.4%
o125,1211.2%
claude-3-5-haiku-2024102210,0830.5%
gemini/gemini-exp-120610,0680.5%
mistral/codestral-latest8,1370.4%
deepseek/deepseek-chat1,272,85652.9%
claude-3-5-sonnet-20241022769,81532.0%
deepseek/REDACTED308,84112.8%
o125,1211.0%
claude-3-5-haiku-2024102210,0830.4%
gemini/gemini-exp-120610,0680.4%
mistral/codestral-latest8,1370.3%
gpt-4o1,7750.1%
o1-preview1750.0%
diff --git a/aider/website/docs/more/infinite-output.md b/aider/website/docs/more/infinite-output.md index 94c4d0cdd..cec71ee4d 100644 --- a/aider/website/docs/more/infinite-output.md +++ b/aider/website/docs/more/infinite-output.md @@ -67,6 +67,7 @@ cog.out(model_list) - codestral/codestral-latest - deepseek/deepseek-chat - deepseek/deepseek-coder +- deepseek/deepseek-reasoner - eu.anthropic.claude-3-5-haiku-20241022-v1:0 - eu.anthropic.claude-3-5-sonnet-20241022-v2:0 - mistral/codestral-2405 From 1234fbf5f468805bb67b58c0f127d39fd69bc3b7 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Thu, 23 Jan 2025 15:27:58 -0800 Subject: [PATCH 095/229] feat: Add new blog post for January 23, 2025 --- aider/website/_posts/2025-01-23-r1.md | 69 +++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 aider/website/_posts/2025-01-23-r1.md diff --git a/aider/website/_posts/2025-01-23-r1.md b/aider/website/_posts/2025-01-23-r1.md new file mode 100644 index 000000000..359530212 --- /dev/null +++ b/aider/website/_posts/2025-01-23-r1.md @@ -0,0 +1,69 @@ +--- +title: r1 tops aider's polyglot leaderboard +#excerpt: o1 scores the top result on aider's new multi-language, more challenging coding benchmark. +#highlight_image: /assets/o1-polyglot.jpg +draft: false +nav_exclude: true +--- +{% if page.date %} + +{% endif %} + +# r1 tops aider's polyglot leaderboard +{: .no_toc } + + + + + + +## Results + + + + + + + + + + + + + {% assign edit_sorted = site.data.r1_architect | sort: 'pass_rate_2' | reverse %} + {% for row in edit_sorted %} + + + + + + + // add a column for total_cost ai! + + {% endfor %} + +
ModelPercent completed correctlyPercent using correct edit formatCommandEdit format
{{ row.model }}{{ row.pass_rate_2 }}%{{ row.percent_cases_well_formed }}%{{ row.command }}{{ row.edit_format }}
+ + + + + From ca8274dbe82abef9af0e26bb780f466d3f66971e Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Thu, 23 Jan 2025 15:28:00 -0800 Subject: [PATCH 096/229] feat: Add total_cost column to results table --- aider/website/_posts/2025-01-23-r1.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/aider/website/_posts/2025-01-23-r1.md b/aider/website/_posts/2025-01-23-r1.md index 359530212..97a910074 100644 --- a/aider/website/_posts/2025-01-23-r1.md +++ b/aider/website/_posts/2025-01-23-r1.md @@ -27,6 +27,7 @@ nav_exclude: true Percent using correct edit format Command Edit format + Total Cost @@ -38,7 +39,7 @@ nav_exclude: true {{ row.percent_cases_well_formed }}% {{ row.command }} {{ row.edit_format }} - // add a column for total_cost ai! + {{ row.total_cost }} {% endfor %} From ad23c0e03e69e3a874366fb6480b00749f2a59ae Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Thu, 23 Jan 2025 15:28:33 -0800 Subject: [PATCH 097/229] feat: format total_cost as $x.xx in table display --- aider/website/_posts/2025-01-23-r1.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aider/website/_posts/2025-01-23-r1.md b/aider/website/_posts/2025-01-23-r1.md index 97a910074..d7172c83f 100644 --- a/aider/website/_posts/2025-01-23-r1.md +++ b/aider/website/_posts/2025-01-23-r1.md @@ -39,7 +39,7 @@ nav_exclude: true {{ row.percent_cases_well_formed }}% {{ row.command }} {{ row.edit_format }} - {{ row.total_cost }} + ${{ "%.2f" | format: row.total_cost }} {% endfor %} From 278c7bfc53279c6d89df7f5582fa4c5df56d01ed Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Thu, 23 Jan 2025 15:29:20 -0800 Subject: [PATCH 098/229] fix: Correct currency formatting in table cells using Liquid filters --- aider/website/_posts/2025-01-23-r1.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aider/website/_posts/2025-01-23-r1.md b/aider/website/_posts/2025-01-23-r1.md index d7172c83f..ca59660c9 100644 --- a/aider/website/_posts/2025-01-23-r1.md +++ b/aider/website/_posts/2025-01-23-r1.md @@ -39,7 +39,7 @@ nav_exclude: true {{ row.percent_cases_well_formed }}% {{ row.command }} {{ row.edit_format }} - ${{ "%.2f" | format: row.total_cost }} + ${{ row.total_cost | times: 1.0 | round: 2 }} {% endfor %} From 9d6a69205498eea45da75dfe2cbbe874c1cf883d Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Thu, 23 Jan 2025 15:31:42 -0800 Subject: [PATCH 099/229] feat: Show "?" when total cost is 0 in table --- aider/website/_posts/2025-01-23-r1.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aider/website/_posts/2025-01-23-r1.md b/aider/website/_posts/2025-01-23-r1.md index ca59660c9..1198cc8c5 100644 --- a/aider/website/_posts/2025-01-23-r1.md +++ b/aider/website/_posts/2025-01-23-r1.md @@ -39,7 +39,7 @@ nav_exclude: true {{ row.percent_cases_well_formed }}% {{ row.command }} {{ row.edit_format }} - ${{ row.total_cost | times: 1.0 | round: 2 }} + {% if row.total_cost == 0 %}?{% else %}${{ row.total_cost | times: 1.0 | round: 2 }}{% endif %} {% endfor %} From 421bc9376563ef1a6c05949083a555290161b8c7 Mon Sep 17 00:00:00 2001 From: Mir Adnan ALI Date: Fri, 24 Jan 2025 03:58:08 -0500 Subject: [PATCH 100/229] Ensure alternating roles for deepseek-reasoner --- aider/sendchat.py | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/aider/sendchat.py b/aider/sendchat.py index 2cf7086aa..5e75ff584 100644 --- a/aider/sendchat.py +++ b/aider/sendchat.py @@ -42,6 +42,38 @@ def sanity_check_messages(messages): return last_non_system_role == "user" +def ensure_alternating_roles(messages): + """ + Ensure messages alternate between 'assistant' and 'user' roles. + Inserts empty messages of the opposite role when consecutive messages of the same role are found. + + Args: + messages: List of message dictionaries with 'role' and 'content' keys. + + Returns: + List of messages with alternating roles. + """ + if not messages: + return messages + + fixed_messages = [] + prev_role = None + + for msg in messages: + current_role = msg['role'] + + # If the current role is the same as the previous, insert an empty message of the opposite role + if current_role == prev_role: + if current_role == 'user': + fixed_messages.append({'role': 'assistant', 'content': ''}) + else: + fixed_messages.append({'role': 'user', 'content': ''}) + + fixed_messages.append(msg) + prev_role = current_role + + return fixed_messages + def send_completion( model_name, messages, @@ -57,6 +89,9 @@ def send_completion( # # + if model_name == 'deepseek/deepseek-reasoner': + messages = ensure_alternating_roles(messages) + kwargs = dict( model=model_name, messages=messages, From 92f6d31f3322c0ea827bffce019c1cf9cf34afe3 Mon Sep 17 00:00:00 2001 From: Mir Adnan ALI Date: Fri, 24 Jan 2025 05:25:21 -0500 Subject: [PATCH 101/229] Updated patch to avoid KeyError on malformed dict --- aider/sendchat.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aider/sendchat.py b/aider/sendchat.py index 5e75ff584..837b3b853 100644 --- a/aider/sendchat.py +++ b/aider/sendchat.py @@ -60,7 +60,7 @@ def ensure_alternating_roles(messages): prev_role = None for msg in messages: - current_role = msg['role'] + current_role = msg.get('role') # Get 'role', None if missing # If the current role is the same as the previous, insert an empty message of the opposite role if current_role == prev_role: From d7bb80468bb7467d4c6f556359bd94e59f75f6f9 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Fri, 24 Jan 2025 08:22:13 -0800 Subject: [PATCH 102/229] copy --- aider/models.py | 2 +- aider/website/_data/r1_architect.yml | 138 ++++++++++++++++++++++++++ aider/website/_posts/2025-01-23-r1.md | 16 ++- 3 files changed, 153 insertions(+), 3 deletions(-) create mode 100644 aider/website/_data/r1_architect.yml diff --git a/aider/models.py b/aider/models.py index 97575993b..6e91d6aab 100644 --- a/aider/models.py +++ b/aider/models.py @@ -841,7 +841,7 @@ MODEL_SETTINGS = [ use_repo_map=True, streaming=False, use_temperature=False, - # extra_params=dict(extra_body=dict(reasoning_effort="high")), + extra_params=dict(extra_body=dict(reasoning_effort="high")), ), ModelSettings( "openrouter/qwen/qwen-2.5-coder-32b-instruct", diff --git a/aider/website/_data/r1_architect.yml b/aider/website/_data/r1_architect.yml new file mode 100644 index 000000000..c036c7de8 --- /dev/null +++ b/aider/website/_data/r1_architect.yml @@ -0,0 +1,138 @@ + + + +- dirname: 2025-01-23-19-14-48--r1-architect-sonnet + test_cases: 225 + model: R1+Sonnet + edit_format: architect + commit_hash: 05a77c7 + editor_model: claude-3-5-sonnet-20241022 + editor_edit_format: editor-diff + pass_rate_1: 27.1 + pass_rate_2: 64.0 + pass_num_1: 61 + pass_num_2: 144 + percent_cases_well_formed: 100.0 + error_outputs: 2 + num_malformed_responses: 0 + num_with_malformed_responses: 0 + user_asks: 392 + lazy_comments: 6 + syntax_errors: 0 + indentation_errors: 0 + exhausted_context_windows: 0 + test_timeouts: 5 + total_tests: 225 + command: aider --model deepseek/deepseek-reasoner + date: 2025-01-23 + versions: 0.72.3.dev + seconds_per_case: 251.6 + total_cost: 13.2933 + +- dirname: 2025-01-20-19-11-38--ds-turns-upd-cur-msgs-fix-with-summarizer + test_cases: 225 + model: R1 + edit_format: diff + commit_hash: 5650697-dirty + pass_rate_1: 26.7 + pass_rate_2: 56.9 + pass_num_1: 60 + pass_num_2: 128 + percent_cases_well_formed: 96.9 + error_outputs: 8 + num_malformed_responses: 7 + num_with_malformed_responses: 7 + user_asks: 15 + lazy_comments: 0 + syntax_errors: 0 + indentation_errors: 0 + exhausted_context_windows: 1 + test_timeouts: 5 + total_tests: 225 + command: aider --model deepseek/deepseek-reasoner + date: 2025-01-20 + versions: 0.71.2.dev + seconds_per_case: 113.7 + total_cost: 5.4193 + + +- dirname: 2024-12-21-19-23-03--polyglot-o1-hard-diff + test_cases: 224 + model: o1 + edit_format: diff + commit_hash: a755079-dirty + pass_rate_1: 23.7 + pass_rate_2: 61.7 + pass_num_1: 53 + pass_num_2: 139 + percent_cases_well_formed: 91.5 + error_outputs: 25 + num_malformed_responses: 24 + num_with_malformed_responses: 19 + user_asks: 16 + lazy_comments: 0 + syntax_errors: 0 + indentation_errors: 0 + exhausted_context_windows: 0 + test_timeouts: 2 + total_tests: 225 + command: aider --model openrouter/openai/o1 + date: 2024-12-21 + versions: 0.69.2.dev + seconds_per_case: 133.2 + total_cost: 186.4958 + + +- dirname: 2024-12-25-13-31-51--deepseekv3preview-diff2 + test_cases: 225 + model: DeepSeek V3 + edit_format: diff + commit_hash: 0a23c4a-dirty + pass_rate_1: 22.7 + pass_rate_2: 48.4 + pass_num_1: 51 + pass_num_2: 109 + percent_cases_well_formed: 98.7 + error_outputs: 7 + num_malformed_responses: 7 + num_with_malformed_responses: 3 + user_asks: 19 + lazy_comments: 0 + syntax_errors: 0 + indentation_errors: 0 + exhausted_context_windows: 0 + test_timeouts: 8 + total_tests: 225 + command: aider --model deepseek/deepseek-chat + date: 2024-12-25 + versions: 0.69.2.dev + seconds_per_case: 34.8 + total_cost: 0.3369 + + + +- dirname: 2025-01-17-19-44-33--sonnet-baseline-jan-17 + test_cases: 225 + model: Sonnet + edit_format: diff + commit_hash: 6451d59 + pass_rate_1: 22.2 + pass_rate_2: 51.6 + pass_num_1: 50 + pass_num_2: 116 + percent_cases_well_formed: 99.6 + error_outputs: 2 + num_malformed_responses: 1 + num_with_malformed_responses: 1 + user_asks: 11 + lazy_comments: 0 + syntax_errors: 0 + indentation_errors: 0 + exhausted_context_windows: 1 + test_timeouts: 8 + total_tests: 225 + command: aider --model claude-3-5-sonnet-20241022 + date: 2025-01-17 + versions: 0.71.2.dev + seconds_per_case: 21.4 + total_cost: 14.4063 diff --git a/aider/website/_posts/2025-01-23-r1.md b/aider/website/_posts/2025-01-23-r1.md index 1198cc8c5..264887e33 100644 --- a/aider/website/_posts/2025-01-23-r1.md +++ b/aider/website/_posts/2025-01-23-r1.md @@ -1,5 +1,5 @@ --- -title: r1 tops aider's polyglot leaderboard +title: R1+Sonnet set SOTA on aider's polyglot benchmark #excerpt: o1 scores the top result on aider's new multi-language, more challenging coding benchmark. #highlight_image: /assets/o1-polyglot.jpg draft: false @@ -9,12 +9,24 @@ nav_exclude: true {% endif %} -# r1 tops aider's polyglot leaderboard +# R1+Sonnet set SOTA on aider's polyglot benchmark {: .no_toc } +Aider supports using a pair of models for coding: +- An Architect model is asked to describe how to solve the coding problem. Thinking/reasoning models often work well in this role. +- An Editor model is given the Architect's solution and asked to produce specific code editing instructions to apply those changes to existing source files. + +**R1 as architect with Sonnet as editor has set a new SOTA of 64.0%** on the +[aider polyglot benchmark](/2024/12/21/polyglot.html). +They achieve this at **14X less cost** compared to the previous o1 SOTA result. + +Using o1 or R1 as architect with various other editor models didn't produce significantly +better results than using them alone. +This is in contrast to the first wave of thinking models like o1-preview and o1-mini, +which improved when paired with many different editor models. ## Results From 5a30ec1806af42f474b011a97f17ae7c621a4045 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Fri, 24 Jan 2025 08:23:26 -0800 Subject: [PATCH 103/229] docs: Add comment to hide legend in leaderboard script --- aider/website/_posts/2025-01-23-r1.md | 1 + 1 file changed, 1 insertion(+) diff --git a/aider/website/_posts/2025-01-23-r1.md b/aider/website/_posts/2025-01-23-r1.md index 264887e33..bd54a1647 100644 --- a/aider/website/_posts/2025-01-23-r1.md +++ b/aider/website/_posts/2025-01-23-r1.md @@ -63,6 +63,7 @@ which improved when paired with many different editor models. {% assign data_source = edit_sorted %} {% assign pass_rate_field = "pass_rate_2" %} {% assign highlight_model = "+" %} +// add a setting to hide the legend ai! {% include leaderboard.js %} - - - + + + +
Model NameTotal TokensPercent
deepseek/deepseek-chat1,272,85652.9%
claude-3-5-sonnet-20241022769,81532.0%
deepseek/REDACTED308,84112.8%
deepseek/deepseek-chat1,373,93457.3%
claude-3-5-sonnet-20241022652,55627.2%
deepseek/REDACTED308,84112.9%
o125,1211.0%
claude-3-5-haiku-2024102210,0830.4%
gemini/gemini-exp-120610,0680.4%
mistral/codestral-latest8,1370.3%
deepseek/deepseek-reasoner5,5170.2%
gpt-4o1,7750.1%
o1-preview1750.0%
diff --git a/aider/website/docs/leaderboards/index.md b/aider/website/docs/leaderboards/index.md index 4085d04c8..38e400828 100644 --- a/aider/website/docs/leaderboards/index.md +++ b/aider/website/docs/leaderboards/index.md @@ -121,6 +121,6 @@ mod_dates = [get_last_modified_date(file) for file in files] latest_mod_date = max(mod_dates) cog.out(f"{latest_mod_date.strftime('%B %d, %Y.')}") ]]]--> -January 20, 2025. +January 24, 2025.

From d7027887cc79400d7c2f98c8165a5a7554b770a5 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Sat, 25 Jan 2025 08:13:38 -0800 Subject: [PATCH 122/229] copy --- aider/website/docs/leaderboards/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aider/website/docs/leaderboards/index.md b/aider/website/docs/leaderboards/index.md index 38e400828..e57839db5 100644 --- a/aider/website/docs/leaderboards/index.md +++ b/aider/website/docs/leaderboards/index.md @@ -121,6 +121,6 @@ mod_dates = [get_last_modified_date(file) for file in files] latest_mod_date = max(mod_dates) cog.out(f"{latest_mod_date.strftime('%B %d, %Y.')}") ]]]--> -January 24, 2025. +January 25, 2025.

From 1882c433891b9cc9d44f479386dd67f2105ce3e6 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Sat, 25 Jan 2025 08:13:57 -0800 Subject: [PATCH 123/229] version bump to 0.72.3 --- aider/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aider/__init__.py b/aider/__init__.py index 680e531c9..f2901cd1a 100644 --- a/aider/__init__.py +++ b/aider/__init__.py @@ -1,6 +1,6 @@ from packaging import version -__version__ = "0.72.3.dev" +__version__ = "0.72.3" safe_version = __version__ try: From 50c17bd5e4322160fba9dbb71ecb631531793043 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Sat, 25 Jan 2025 08:15:36 -0800 Subject: [PATCH 124/229] set version to 0.72.4.dev --- aider/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aider/__init__.py b/aider/__init__.py index f2901cd1a..db534823f 100644 --- a/aider/__init__.py +++ b/aider/__init__.py @@ -1,6 +1,6 @@ from packaging import version -__version__ = "0.72.3" +__version__ = "0.72.4.dev" safe_version = __version__ try: From d2386af523c76199fc80f4bd489712c8dbdefe3d Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Sat, 25 Jan 2025 08:31:00 -0800 Subject: [PATCH 125/229] copy --- aider/website/_posts/2025-01-24-r1-sonnet.md | 1 + 1 file changed, 1 insertion(+) diff --git a/aider/website/_posts/2025-01-24-r1-sonnet.md b/aider/website/_posts/2025-01-24-r1-sonnet.md index 5042ce994..909f69c23 100644 --- a/aider/website/_posts/2025-01-24-r1-sonnet.md +++ b/aider/website/_posts/2025-01-24-r1-sonnet.md @@ -28,6 +28,7 @@ Using various other models as editor didn't seem to improve o1 or R1 versus thei This is in contrast to the first wave of thinking models like o1-preview and o1-mini, which improved when paired with many different editor models. +o1 was set with reasoning effort high for these tests. ## Try it From f008d9dd19df00abd7ed358877c1921de8e9a233 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Sat, 25 Jan 2025 08:31:10 -0800 Subject: [PATCH 126/229] feat: Add Azure O1 model configuration to MODEL_SETTINGS --- aider/models.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/aider/models.py b/aider/models.py index 97575993b..6b406e53f 100644 --- a/aider/models.py +++ b/aider/models.py @@ -775,6 +775,17 @@ MODEL_SETTINGS = [ use_system_prompt=False, use_temperature=False, ), + ModelSettings( + "azure/o1", + "diff", + weak_model_name="azure/gpt-4o-mini", + editor_model_name="azure/gpt-4o", + editor_edit_format="editor-diff", + use_repo_map=True, + streaming=False, + use_temperature=False, + # extra_params=dict(extra_body=dict(reasoning_effort="high")), + ), ModelSettings( "o1-preview", "architect", From 081504edab3c9a9a877524fc8d8ee5ff122bfe37 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Sat, 25 Jan 2025 08:37:07 -0800 Subject: [PATCH 127/229] copy --- .../website/docs/config/adv-model-settings.md | 35 ++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/aider/website/docs/config/adv-model-settings.md b/aider/website/docs/config/adv-model-settings.md index 2099c3a99..c19ed7b19 100644 --- a/aider/website/docs/config/adv-model-settings.md +++ b/aider/website/docs/config/adv-model-settings.md @@ -103,7 +103,40 @@ For example: These settings will be merged with any model-specific settings, with the `aider/extra_params` settings taking precedence for any direct conflicts. -### Example model settings +### Controlling o1 reasoning effort + +You need this chunk of yaml: + +``` + extra_body: + reasoning_effort: high +``` + +This is a full entry for o1 with that setting, obtained by finding the default +entry in the list below and adding the above `extra_body` entry: + +``` +- name: o1 + cache_control: false + caches_by_default: false + edit_format: diff + editor_edit_format: editor-diff + editor_model_name: gpt-4o + examples_as_sys_msg: false + extra_params: null + lazy: false + reminder: user + send_undo_reply: false + streaming: false + use_repo_map: true + use_system_prompt: true + use_temperature: false + weak_model_name: gpt-4o-mini + extra_body: + reasoning_effort: high +``` + +### Default model settings Below are all the pre-configured model settings to give a sense for the settings which are supported. From f0fc83372b37289e1cd9a0c77d081718885a5039 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Sat, 25 Jan 2025 08:38:19 -0800 Subject: [PATCH 128/229] refactor: Reorder YAML output to prioritize "name" field and add spacing --- aider/models.py | 1 + 1 file changed, 1 insertion(+) diff --git a/aider/models.py b/aider/models.py index 6b406e53f..a7a6d51c4 100644 --- a/aider/models.py +++ b/aider/models.py @@ -1410,6 +1410,7 @@ def print_matching_models(io, search): def get_model_settings_as_yaml(): import yaml + # I want the "name" field to be the first entry in each list; i want a blank line between list entries. ai! model_settings_list = [] for ms in MODEL_SETTINGS: model_settings_dict = { From 8ed5e81bdbe2207bd8979ab14f670d2bf7c05eaa Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Sat, 25 Jan 2025 08:38:21 -0800 Subject: [PATCH 129/229] refactor: order YAML output with name first and add blank lines --- aider/models.py | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/aider/models.py b/aider/models.py index a7a6d51c4..5e1595dc1 100644 --- a/aider/models.py +++ b/aider/models.py @@ -1410,15 +1410,25 @@ def print_matching_models(io, search): def get_model_settings_as_yaml(): import yaml - # I want the "name" field to be the first entry in each list; i want a blank line between list entries. ai! model_settings_list = [] for ms in MODEL_SETTINGS: - model_settings_dict = { - field.name: getattr(ms, field.name) for field in fields(ModelSettings) - } + # Create ordered dict with name first + model_settings_dict = {"name": ms.name} + # Add remaining fields in order + for field in fields(ModelSettings): + if field.name != "name": + model_settings_dict[field.name] = getattr(ms, field.name) model_settings_list.append(model_settings_dict) + # Add blank line between entries + model_settings_list.append(None) - return yaml.dump(model_settings_list, default_flow_style=False) + # Filter out None values before dumping + yaml_str = yaml.dump( + [ms for ms in model_settings_list if ms is not None], + default_flow_style=False + ) + # Add actual blank lines between entries + return yaml_str.replace('\n- ', '\n\n- ') def main(): From d54b13e80a00393dff8d315069a2e64d0671486f Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Sat, 25 Jan 2025 08:38:28 -0800 Subject: [PATCH 130/229] style: Format code with consistent string quotes --- aider/models.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/aider/models.py b/aider/models.py index 5e1595dc1..915d0a632 100644 --- a/aider/models.py +++ b/aider/models.py @@ -1424,11 +1424,10 @@ def get_model_settings_as_yaml(): # Filter out None values before dumping yaml_str = yaml.dump( - [ms for ms in model_settings_list if ms is not None], - default_flow_style=False + [ms for ms in model_settings_list if ms is not None], default_flow_style=False ) # Add actual blank lines between entries - return yaml_str.replace('\n- ', '\n\n- ') + return yaml_str.replace("\n- ", "\n\n- ") def main(): From f2512d1ff11267cb1c4a014b65608cefa9dd280d Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Sat, 25 Jan 2025 08:43:40 -0800 Subject: [PATCH 131/229] refactor: ensure 'name' field appears first in YAML output --- aider/models.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/aider/models.py b/aider/models.py index 915d0a632..877127377 100644 --- a/aider/models.py +++ b/aider/models.py @@ -1409,22 +1409,23 @@ def print_matching_models(io, search): def get_model_settings_as_yaml(): import yaml + from dataclasses import fields model_settings_list = [] for ms in MODEL_SETTINGS: - # Create ordered dict with name first - model_settings_dict = {"name": ms.name} - # Add remaining fields in order + # Create dict with explicit field order + model_settings_dict = {} for field in fields(ModelSettings): - if field.name != "name": - model_settings_dict[field.name] = getattr(ms, field.name) + model_settings_dict[field.name] = getattr(ms, field.name) model_settings_list.append(model_settings_dict) # Add blank line between entries model_settings_list.append(None) # Filter out None values before dumping yaml_str = yaml.dump( - [ms for ms in model_settings_list if ms is not None], default_flow_style=False + [ms for ms in model_settings_list if ms is not None], + default_flow_style=False, + sort_keys=False # Preserve field order from dataclass ) # Add actual blank lines between entries return yaml_str.replace("\n- ", "\n\n- ") From 1933cdc28c9ce6b418d8a759bf94ccadeaef09b1 Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Sat, 25 Jan 2025 08:43:46 -0800 Subject: [PATCH 132/229] style: Reformat code to comply with linter rules --- aider/models.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/aider/models.py b/aider/models.py index 877127377..ac6134261 100644 --- a/aider/models.py +++ b/aider/models.py @@ -1408,9 +1408,10 @@ def print_matching_models(io, search): def get_model_settings_as_yaml(): - import yaml from dataclasses import fields + import yaml + model_settings_list = [] for ms in MODEL_SETTINGS: # Create dict with explicit field order @@ -1423,9 +1424,9 @@ def get_model_settings_as_yaml(): # Filter out None values before dumping yaml_str = yaml.dump( - [ms for ms in model_settings_list if ms is not None], + [ms for ms in model_settings_list if ms is not None], default_flow_style=False, - sort_keys=False # Preserve field order from dataclass + sort_keys=False, # Preserve field order from dataclass ) # Add actual blank lines between entries return yaml_str.replace("\n- ", "\n\n- ") From 54162b43c855c142e91d1946454086ec5a520446 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Sat, 25 Jan 2025 08:46:28 -0800 Subject: [PATCH 133/229] refactor: Reorder model settings and update FAQ token statistics --- aider/website/assets/sample-analytics.jsonl | 66 +- .../website/docs/config/adv-model-settings.md | 2217 +++++++++-------- aider/website/docs/faq.md | 12 +- aider/website/index.md | 2 +- 4 files changed, 1196 insertions(+), 1101 deletions(-) diff --git a/aider/website/assets/sample-analytics.jsonl b/aider/website/assets/sample-analytics.jsonl index 0ce47f484..1e952c6ae 100644 --- a/aider/website/assets/sample-analytics.jsonl +++ b/aider/website/assets/sample-analytics.jsonl @@ -1,36 +1,3 @@ -{"event": "command_model", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736609721} -{"event": "command_editor", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736609724} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736609963} -{"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736609964} -{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736609969} -{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736610007} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736610012} -{"event": "message_send", "properties": {"main_model": "o1", "weak_model": "gpt-4o-mini", "editor_model": "gpt-4o", "edit_format": "ask", "prompt_tokens": 7911, "completion_tokens": 1543, "total_tokens": 9454, "cost": 0.21124500000000002, "total_cost": 0.21124500000000002}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736610034} -{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736610058} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736610071} -{"event": "message_send", "properties": {"main_model": "o1", "weak_model": "gpt-4o-mini", "editor_model": "gpt-4o", "edit_format": "ask", "prompt_tokens": 8062, "completion_tokens": 2642, "total_tokens": 10704, "cost": 0.27945, "total_cost": 0.490695}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736610110} -{"event": "command_model", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736610225} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736610244} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "ask", "prompt_tokens": 8075, "completion_tokens": 137, "total_tokens": 8212, "cost": 0.00116886, "total_cost": 0.49186386}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736610251} -{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736610373} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736638779} -{"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736638781} -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736638781} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736638790} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 13848, "completion_tokens": 135, "total_tokens": 13983, "cost": 0.00197651999999804, "total_cost": 0.00197651999999804}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736638798} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736638812} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 16203, "completion_tokens": 327, "total_tokens": 16530, "cost": 0.00235997999999804, "total_cost": 0.00433649999999608}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736638822} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736638842} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 16610, "completion_tokens": 246, "total_tokens": 16856, "cost": 0.00239427999999804, "total_cost": 0.00673077999999412}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736638851} -{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736638865} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736638870} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 19105, "completion_tokens": 873, "total_tokens": 19978, "cost": 0.0029191399999980404, "total_cost": 0.00964991999999216}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736638891} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736638902} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 21785, "completion_tokens": 135, "total_tokens": 21920, "cost": 0.0030876999999980407, "total_cost": 0.0127376199999902}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736638911} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736638930} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 22896, "completion_tokens": 1355, "total_tokens": 24251, "cost": 0.0035848399999980404, "total_cost": 0.016322459999988242}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736638960} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736638969} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 20971, "completion_tokens": 360, "total_tokens": 21331, "cost": 0.00303673999999804, "total_cost": 0.019359199999986282}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736638980} {"event": "command_run", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736638988} {"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736638991} {"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 22062, "completion_tokens": 654, "total_tokens": 22716, "cost": 0.0032717999999980407, "total_cost": 0.022630999999984323}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736639007} @@ -998,3 +965,36 @@ {"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737821176} {"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 6949, "completion_tokens": 583, "total_tokens": 7532, "cost": 0.0011361000000000001, "total_cost": 0.0011361000000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737821191} {"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737821191} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737821714} +{"event": "gui session", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737821715} +{"event": "exit", "properties": {"reason": "GUI session ended"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737821715} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737822664} +{"event": "repo", "properties": {"num_files": 430}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737822666} +{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737822670} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737823046} +{"event": "repo", "properties": {"num_files": 430}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737823048} +{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737823048} +{"event": "ai-comments file-add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737823079} +{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737823079} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737823079} +{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 16847, "completion_tokens": 404, "total_tokens": 17251, "cost": 0.0024717000000000003, "total_cost": 0.0024717000000000003}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737823097} +{"event": "command_editor", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737823132} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737823158} +{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 17609, "completion_tokens": 482, "total_tokens": 18091, "cost": 0.0026002200000000003, "total_cost": 0.005071920000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737823182} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737823182} +{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 18777, "completion_tokens": 468, "total_tokens": 19245, "cost": 0.0027598200000000005, "total_cost": 0.00783174}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737823199} +{"event": "command_undo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737823215} +{"event": "command_undo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737823220} +{"event": "command_clear", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737823236} +{"event": "command_model", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737823238} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737823241} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 17004, "completion_tokens": 449, "total_tokens": 17453, "cost": 0.057747, "total_cost": 0.06557874}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737823257} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737823279} +{"event": "command_undo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737823290} +{"event": "command_undo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737823293} +{"event": "command_model", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737823340} +{"event": "command_model", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737823343} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737823375} +{"event": "command_clear", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737823386} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737823387} +{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-reasoner", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 17012, "completion_tokens": 460, "total_tokens": 17472, "cost": 0.010364, "total_cost": 0.07594274}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737823418} diff --git a/aider/website/docs/config/adv-model-settings.md b/aider/website/docs/config/adv-model-settings.md index c19ed7b19..7f431d1ca 100644 --- a/aider/website/docs/config/adv-model-settings.md +++ b/aider/website/docs/config/adv-model-settings.md @@ -117,21 +117,21 @@ entry in the list below and adding the above `extra_body` entry: ``` - name: o1 - cache_control: false - caches_by_default: false edit_format: diff - editor_edit_format: editor-diff - editor_model_name: gpt-4o - examples_as_sys_msg: false - extra_params: null + weak_model_name: gpt-4o-mini + use_repo_map: true + send_undo_reply: false lazy: false reminder: user - send_undo_reply: false - streaming: false - use_repo_map: true + examples_as_sys_msg: false + extra_params: null + cache_control: false + caches_by_default: false use_system_prompt: true use_temperature: false - weak_model_name: gpt-4o-mini + streaming: false + editor_model_name: gpt-4o + editor_edit_format: editor-diff extra_body: reasoning_effort: high ``` @@ -151,1309 +151,1404 @@ cog.out(get_model_settings_as_yaml()) cog.out("```\n") ]]]--> ```yaml -- cache_control: false - caches_by_default: false +- name: gpt-3.5-turbo edit_format: whole - editor_edit_format: null - editor_model_name: null + weak_model_name: gpt-4o-mini + use_repo_map: false + send_undo_reply: false + lazy: false + reminder: sys examples_as_sys_msg: false extra_params: null - lazy: false - name: gpt-3.5-turbo - reminder: sys - send_undo_reply: false - streaming: true - use_repo_map: false + cache_control: false + caches_by_default: false use_system_prompt: true use_temperature: true - weak_model_name: gpt-4o-mini -- cache_control: false - caches_by_default: false - edit_format: whole - editor_edit_format: null + streaming: true editor_model_name: null + editor_edit_format: null + +- name: gpt-3.5-turbo-0125 + edit_format: whole + weak_model_name: gpt-4o-mini + use_repo_map: false + send_undo_reply: false + lazy: false + reminder: sys examples_as_sys_msg: false extra_params: null - lazy: false - name: gpt-3.5-turbo-0125 - reminder: sys - send_undo_reply: false - streaming: true - use_repo_map: false + cache_control: false + caches_by_default: false use_system_prompt: true use_temperature: true - weak_model_name: gpt-4o-mini -- cache_control: false - caches_by_default: false - edit_format: whole - editor_edit_format: null + streaming: true editor_model_name: null + editor_edit_format: null + +- name: gpt-3.5-turbo-1106 + edit_format: whole + weak_model_name: gpt-4o-mini + use_repo_map: false + send_undo_reply: false + lazy: false + reminder: sys examples_as_sys_msg: false extra_params: null - lazy: false - name: gpt-3.5-turbo-1106 - reminder: sys - send_undo_reply: false - streaming: true - use_repo_map: false + cache_control: false + caches_by_default: false use_system_prompt: true use_temperature: true - weak_model_name: gpt-4o-mini -- cache_control: false - caches_by_default: false - edit_format: whole - editor_edit_format: null + streaming: true editor_model_name: null + editor_edit_format: null + +- name: gpt-3.5-turbo-0613 + edit_format: whole + weak_model_name: gpt-4o-mini + use_repo_map: false + send_undo_reply: false + lazy: false + reminder: sys examples_as_sys_msg: false extra_params: null - lazy: false - name: gpt-3.5-turbo-0613 - reminder: sys - send_undo_reply: false - streaming: true - use_repo_map: false + cache_control: false + caches_by_default: false use_system_prompt: true use_temperature: true - weak_model_name: gpt-4o-mini -- cache_control: false - caches_by_default: false - edit_format: whole - editor_edit_format: null + streaming: true editor_model_name: null + editor_edit_format: null + +- name: gpt-3.5-turbo-16k-0613 + edit_format: whole + weak_model_name: gpt-4o-mini + use_repo_map: false + send_undo_reply: false + lazy: false + reminder: sys examples_as_sys_msg: false extra_params: null - lazy: false - name: gpt-3.5-turbo-16k-0613 - reminder: sys - send_undo_reply: false - streaming: true - use_repo_map: false + cache_control: false + caches_by_default: false use_system_prompt: true use_temperature: true - weak_model_name: gpt-4o-mini -- cache_control: false - caches_by_default: false + streaming: true + editor_model_name: null + editor_edit_format: null + +- name: gpt-4-turbo-2024-04-09 edit_format: udiff - editor_edit_format: null - editor_model_name: null + weak_model_name: gpt-4o-mini + use_repo_map: true + send_undo_reply: false + lazy: true + reminder: sys examples_as_sys_msg: false extra_params: null - lazy: true - name: gpt-4-turbo-2024-04-09 - reminder: sys - send_undo_reply: false - streaming: true - use_repo_map: true + cache_control: false + caches_by_default: false use_system_prompt: true use_temperature: true - weak_model_name: gpt-4o-mini -- cache_control: false - caches_by_default: false + streaming: true + editor_model_name: null + editor_edit_format: null + +- name: gpt-4-turbo edit_format: udiff - editor_edit_format: null - editor_model_name: null + weak_model_name: gpt-4o-mini + use_repo_map: true + send_undo_reply: false + lazy: true + reminder: sys examples_as_sys_msg: false extra_params: null - lazy: true - name: gpt-4-turbo - reminder: sys - send_undo_reply: false - streaming: true - use_repo_map: true + cache_control: false + caches_by_default: false use_system_prompt: true use_temperature: true - weak_model_name: gpt-4o-mini -- cache_control: false - caches_by_default: false + streaming: true + editor_model_name: null + editor_edit_format: null + +- name: openai/gpt-4o edit_format: diff + weak_model_name: gpt-4o-mini + use_repo_map: true + send_undo_reply: false + lazy: true + reminder: sys + examples_as_sys_msg: true + extra_params: null + cache_control: false + caches_by_default: false + use_system_prompt: true + use_temperature: true + streaming: true + editor_model_name: null editor_edit_format: editor-diff - editor_model_name: null + +- name: openai/gpt-4o-2024-08-06 + edit_format: diff + weak_model_name: gpt-4o-mini + use_repo_map: true + send_undo_reply: false + lazy: true + reminder: sys examples_as_sys_msg: true extra_params: null - lazy: true - name: openai/gpt-4o - reminder: sys - send_undo_reply: false - streaming: true - use_repo_map: true + cache_control: false + caches_by_default: false use_system_prompt: true use_temperature: true - weak_model_name: gpt-4o-mini -- cache_control: false - caches_by_default: false - edit_format: diff + streaming: true + editor_model_name: null editor_edit_format: null - editor_model_name: null + +- name: gpt-4o-2024-08-06 + edit_format: diff + weak_model_name: gpt-4o-mini + use_repo_map: true + send_undo_reply: false + lazy: true + reminder: sys examples_as_sys_msg: true extra_params: null - lazy: true - name: openai/gpt-4o-2024-08-06 - reminder: sys - send_undo_reply: false - streaming: true - use_repo_map: true + cache_control: false + caches_by_default: false use_system_prompt: true use_temperature: true - weak_model_name: gpt-4o-mini -- cache_control: false - caches_by_default: false - edit_format: diff + streaming: true + editor_model_name: null editor_edit_format: null - editor_model_name: null + +- name: gpt-4o-2024-11-20 + edit_format: diff + weak_model_name: gpt-4o-mini + use_repo_map: true + send_undo_reply: false + lazy: true + reminder: sys examples_as_sys_msg: true extra_params: null - lazy: true - name: gpt-4o-2024-08-06 - reminder: sys - send_undo_reply: false - streaming: true - use_repo_map: true + cache_control: false + caches_by_default: false use_system_prompt: true use_temperature: true - weak_model_name: gpt-4o-mini -- cache_control: false - caches_by_default: false - edit_format: diff + streaming: true + editor_model_name: null editor_edit_format: null - editor_model_name: null + +- name: openai/gpt-4o-2024-11-20 + edit_format: diff + weak_model_name: gpt-4o-mini + use_repo_map: true + send_undo_reply: false + lazy: true + reminder: sys examples_as_sys_msg: true extra_params: null - lazy: true - name: gpt-4o-2024-11-20 - reminder: sys - send_undo_reply: false - streaming: true - use_repo_map: true + cache_control: false + caches_by_default: false use_system_prompt: true use_temperature: true - weak_model_name: gpt-4o-mini -- cache_control: false - caches_by_default: false - edit_format: diff + streaming: true + editor_model_name: null editor_edit_format: null - editor_model_name: null + +- name: gpt-4o + edit_format: diff + weak_model_name: gpt-4o-mini + use_repo_map: true + send_undo_reply: false + lazy: true + reminder: sys examples_as_sys_msg: true extra_params: null - lazy: true - name: openai/gpt-4o-2024-11-20 - reminder: sys - send_undo_reply: false - streaming: true - use_repo_map: true + cache_control: false + caches_by_default: false use_system_prompt: true use_temperature: true - weak_model_name: gpt-4o-mini -- cache_control: false - caches_by_default: false - edit_format: diff + streaming: true + editor_model_name: null editor_edit_format: editor-diff - editor_model_name: null - examples_as_sys_msg: true - extra_params: null - lazy: true - name: gpt-4o - reminder: sys - send_undo_reply: false - streaming: true - use_repo_map: true - use_system_prompt: true - use_temperature: true - weak_model_name: gpt-4o-mini -- cache_control: false - caches_by_default: false + +- name: gpt-4o-mini edit_format: whole - editor_edit_format: null - editor_model_name: null + weak_model_name: gpt-4o-mini + use_repo_map: false + send_undo_reply: false + lazy: true + reminder: sys examples_as_sys_msg: false extra_params: null - lazy: true - name: gpt-4o-mini - reminder: sys - send_undo_reply: false - streaming: true - use_repo_map: false - use_system_prompt: true - use_temperature: true - weak_model_name: gpt-4o-mini -- cache_control: false + cache_control: false caches_by_default: false - edit_format: whole - editor_edit_format: null - editor_model_name: null - examples_as_sys_msg: false - extra_params: null - lazy: true - name: openai/gpt-4o-mini - reminder: sys - send_undo_reply: false - streaming: true - use_repo_map: false use_system_prompt: true use_temperature: true + streaming: true + editor_model_name: null + editor_edit_format: null + +- name: openai/gpt-4o-mini + edit_format: whole weak_model_name: openai/gpt-4o-mini -- cache_control: false + use_repo_map: false + send_undo_reply: false + lazy: true + reminder: sys + examples_as_sys_msg: false + extra_params: null + cache_control: false caches_by_default: false - edit_format: udiff - editor_edit_format: null + use_system_prompt: true + use_temperature: true + streaming: true editor_model_name: null + editor_edit_format: null + +- name: gpt-4-0125-preview + edit_format: udiff + weak_model_name: gpt-4o-mini + use_repo_map: true + send_undo_reply: false + lazy: true + reminder: sys examples_as_sys_msg: true extra_params: null - lazy: true - name: gpt-4-0125-preview - reminder: sys - send_undo_reply: false - streaming: true - use_repo_map: true + cache_control: false + caches_by_default: false use_system_prompt: true use_temperature: true - weak_model_name: gpt-4o-mini -- cache_control: false - caches_by_default: false + streaming: true + editor_model_name: null + editor_edit_format: null + +- name: gpt-4-1106-preview edit_format: udiff - editor_edit_format: null - editor_model_name: null - examples_as_sys_msg: false - extra_params: null + weak_model_name: gpt-4o-mini + use_repo_map: true + send_undo_reply: false lazy: true - name: gpt-4-1106-preview reminder: sys - send_undo_reply: false - streaming: true - use_repo_map: true - use_system_prompt: true - use_temperature: true - weak_model_name: gpt-4o-mini -- cache_control: false - caches_by_default: false - edit_format: diff - editor_edit_format: null - editor_model_name: null examples_as_sys_msg: false extra_params: null - lazy: false - name: gpt-4-vision-preview - reminder: sys - send_undo_reply: false - streaming: true - use_repo_map: true + cache_control: false + caches_by_default: false use_system_prompt: true use_temperature: true - weak_model_name: gpt-4o-mini -- cache_control: false - caches_by_default: false - edit_format: diff - editor_edit_format: null + streaming: true editor_model_name: null + editor_edit_format: null + +- name: gpt-4-vision-preview + edit_format: diff + weak_model_name: gpt-4o-mini + use_repo_map: true + send_undo_reply: false + lazy: false + reminder: sys + examples_as_sys_msg: false + extra_params: null + cache_control: false + caches_by_default: false + use_system_prompt: true + use_temperature: true + streaming: true + editor_model_name: null + editor_edit_format: null + +- name: gpt-4-0314 + edit_format: diff + weak_model_name: gpt-4o-mini + use_repo_map: true + send_undo_reply: false + lazy: false + reminder: sys examples_as_sys_msg: true extra_params: null - lazy: false - name: gpt-4-0314 - reminder: sys - send_undo_reply: false - streaming: true - use_repo_map: true + cache_control: false + caches_by_default: false use_system_prompt: true use_temperature: true - weak_model_name: gpt-4o-mini -- cache_control: false - caches_by_default: false - edit_format: diff - editor_edit_format: null + streaming: true editor_model_name: null + editor_edit_format: null + +- name: gpt-4-0613 + edit_format: diff + weak_model_name: gpt-4o-mini + use_repo_map: true + send_undo_reply: false + lazy: false + reminder: sys examples_as_sys_msg: false extra_params: null - lazy: false - name: gpt-4-0613 - reminder: sys - send_undo_reply: false - streaming: true - use_repo_map: true + cache_control: false + caches_by_default: false use_system_prompt: true use_temperature: true - weak_model_name: gpt-4o-mini -- cache_control: false - caches_by_default: false - edit_format: diff - editor_edit_format: null + streaming: true editor_model_name: null + editor_edit_format: null + +- name: gpt-4-32k-0613 + edit_format: diff + weak_model_name: gpt-4o-mini + use_repo_map: true + send_undo_reply: false + lazy: false + reminder: sys examples_as_sys_msg: false extra_params: null - lazy: false - name: gpt-4-32k-0613 - reminder: sys - send_undo_reply: false - streaming: true - use_repo_map: true - use_system_prompt: true - use_temperature: true - weak_model_name: gpt-4o-mini -- cache_control: false + cache_control: false caches_by_default: false - edit_format: diff - editor_edit_format: null - editor_model_name: null - examples_as_sys_msg: false - extra_params: null - lazy: false - name: claude-3-opus-20240229 - reminder: user - send_undo_reply: false - streaming: true - use_repo_map: true use_system_prompt: true use_temperature: true + streaming: true + editor_model_name: null + editor_edit_format: null + +- name: claude-3-opus-20240229 + edit_format: diff weak_model_name: claude-3-5-haiku-20241022 -- cache_control: false - caches_by_default: false - edit_format: diff - editor_edit_format: null - editor_model_name: null + use_repo_map: true + send_undo_reply: false + lazy: false + reminder: user examples_as_sys_msg: false extra_params: null - lazy: false - name: openrouter/anthropic/claude-3-opus - reminder: user - send_undo_reply: false - streaming: true - use_repo_map: true + cache_control: false + caches_by_default: false use_system_prompt: true use_temperature: true + streaming: true + editor_model_name: null + editor_edit_format: null + +- name: openrouter/anthropic/claude-3-opus + edit_format: diff weak_model_name: openrouter/anthropic/claude-3-5-haiku -- cache_control: false - caches_by_default: false - edit_format: whole - editor_edit_format: null - editor_model_name: null + use_repo_map: true + send_undo_reply: false + lazy: false + reminder: user examples_as_sys_msg: false extra_params: null - lazy: false - name: claude-3-sonnet-20240229 - reminder: user - send_undo_reply: false - streaming: true - use_repo_map: false + cache_control: false + caches_by_default: false use_system_prompt: true use_temperature: true - weak_model_name: claude-3-5-haiku-20241022 -- cache_control: true - caches_by_default: false - edit_format: diff - editor_edit_format: editor-diff - editor_model_name: claude-3-5-sonnet-20240620 - examples_as_sys_msg: true - extra_params: - extra_headers: - anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25 - max_tokens: 8192 - lazy: false - name: claude-3-5-sonnet-20240620 - reminder: user - send_undo_reply: false streaming: true - use_repo_map: true - use_system_prompt: true - use_temperature: true - weak_model_name: claude-3-5-haiku-20241022 -- cache_control: true - caches_by_default: false - edit_format: diff - editor_edit_format: editor-diff - editor_model_name: anthropic/claude-3-5-sonnet-20240620 - examples_as_sys_msg: true - extra_params: - extra_headers: - anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25 - max_tokens: 8192 - lazy: false - name: anthropic/claude-3-5-sonnet-20240620 - reminder: user - send_undo_reply: false - streaming: true - use_repo_map: true - use_system_prompt: true - use_temperature: true - weak_model_name: anthropic/claude-3-5-haiku-20241022 -- cache_control: true - caches_by_default: false - edit_format: diff - editor_edit_format: editor-diff - editor_model_name: anthropic/claude-3-5-sonnet-20241022 - examples_as_sys_msg: true - extra_params: - extra_headers: - anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25 - max_tokens: 8192 - lazy: false - name: anthropic/claude-3-5-sonnet-20241022 - reminder: user - send_undo_reply: false - streaming: true - use_repo_map: true - use_system_prompt: true - use_temperature: true - weak_model_name: anthropic/claude-3-5-haiku-20241022 -- cache_control: true - caches_by_default: false - edit_format: diff - editor_edit_format: editor-diff - editor_model_name: bedrock/anthropic.claude-3-5-sonnet-20241022-v2:0 - examples_as_sys_msg: true - extra_params: - extra_headers: - anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25 - max_tokens: 8192 - lazy: false - name: bedrock/anthropic.claude-3-5-sonnet-20241022-v2:0 - reminder: user - send_undo_reply: false - streaming: true - use_repo_map: true - use_system_prompt: true - use_temperature: true - weak_model_name: bedrock/anthropic.claude-3-5-haiku-20241022-v1:0 -- cache_control: true - caches_by_default: false - edit_format: diff - editor_edit_format: editor-diff - editor_model_name: anthropic/claude-3-5-sonnet-20241022 - examples_as_sys_msg: true - extra_params: - extra_headers: - anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25 - max_tokens: 8192 - lazy: false - name: anthropic/claude-3-5-sonnet-latest - reminder: user - send_undo_reply: false - streaming: true - use_repo_map: true - use_system_prompt: true - use_temperature: true - weak_model_name: anthropic/claude-3-5-haiku-20241022 -- cache_control: true - caches_by_default: false - edit_format: diff - editor_edit_format: editor-diff - editor_model_name: claude-3-5-sonnet-20241022 - examples_as_sys_msg: true - extra_params: - extra_headers: - anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25 - max_tokens: 8192 - lazy: false - name: claude-3-5-sonnet-20241022 - reminder: user - send_undo_reply: false - streaming: true - use_repo_map: true - use_system_prompt: true - use_temperature: true - weak_model_name: claude-3-5-haiku-20241022 -- cache_control: true - caches_by_default: false + editor_model_name: null + editor_edit_format: null + +- name: claude-3-sonnet-20240229 edit_format: whole - editor_edit_format: null - editor_model_name: null - examples_as_sys_msg: true - extra_params: - extra_headers: - anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25 - lazy: false - name: anthropic/claude-3-haiku-20240307 - reminder: user - send_undo_reply: false - streaming: true - use_repo_map: false - use_system_prompt: true - use_temperature: true - weak_model_name: anthropic/claude-3-haiku-20240307 -- cache_control: true - caches_by_default: false - edit_format: diff - editor_edit_format: null - editor_model_name: null - examples_as_sys_msg: false - extra_params: - extra_headers: - anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25 - lazy: false - name: anthropic/claude-3-5-haiku-20241022 - reminder: user - send_undo_reply: false - streaming: true - use_repo_map: true - use_system_prompt: true - use_temperature: true - weak_model_name: anthropic/claude-3-5-haiku-20241022 -- cache_control: true - caches_by_default: false - edit_format: diff - editor_edit_format: null - editor_model_name: null - examples_as_sys_msg: false - extra_params: - extra_headers: - anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25 - lazy: false - name: bedrock/anthropic.claude-3-5-haiku-20241022-v1:0 - reminder: user - send_undo_reply: false - streaming: true - use_repo_map: true - use_system_prompt: true - use_temperature: true - weak_model_name: bedrock/anthropic.claude-3-5-haiku-20241022-v1:0 -- cache_control: true - caches_by_default: false - edit_format: diff - editor_edit_format: null - editor_model_name: null - examples_as_sys_msg: true - extra_params: - extra_headers: - anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25 - lazy: false - name: claude-3-5-haiku-20241022 - reminder: user - send_undo_reply: false - streaming: true - use_repo_map: true - use_system_prompt: true - use_temperature: true weak_model_name: claude-3-5-haiku-20241022 -- cache_control: false + use_repo_map: false + send_undo_reply: false + lazy: false + reminder: user + examples_as_sys_msg: false + extra_params: null + cache_control: false caches_by_default: false - edit_format: diff - editor_edit_format: null + use_system_prompt: true + use_temperature: true + streaming: true editor_model_name: null + editor_edit_format: null + +- name: claude-3-5-sonnet-20240620 + edit_format: diff + weak_model_name: claude-3-5-haiku-20241022 + use_repo_map: true + send_undo_reply: false + lazy: false + reminder: user + examples_as_sys_msg: true + extra_params: + extra_headers: + anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25 + max_tokens: 8192 + cache_control: true + caches_by_default: false + use_system_prompt: true + use_temperature: true + streaming: true + editor_model_name: claude-3-5-sonnet-20240620 + editor_edit_format: editor-diff + +- name: anthropic/claude-3-5-sonnet-20240620 + edit_format: diff + weak_model_name: anthropic/claude-3-5-haiku-20241022 + use_repo_map: true + send_undo_reply: false + lazy: false + reminder: user + examples_as_sys_msg: true + extra_params: + extra_headers: + anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25 + max_tokens: 8192 + cache_control: true + caches_by_default: false + use_system_prompt: true + use_temperature: true + streaming: true + editor_model_name: anthropic/claude-3-5-sonnet-20240620 + editor_edit_format: editor-diff + +- name: anthropic/claude-3-5-sonnet-20241022 + edit_format: diff + weak_model_name: anthropic/claude-3-5-haiku-20241022 + use_repo_map: true + send_undo_reply: false + lazy: false + reminder: user + examples_as_sys_msg: true + extra_params: + extra_headers: + anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25 + max_tokens: 8192 + cache_control: true + caches_by_default: false + use_system_prompt: true + use_temperature: true + streaming: true + editor_model_name: anthropic/claude-3-5-sonnet-20241022 + editor_edit_format: editor-diff + +- name: bedrock/anthropic.claude-3-5-sonnet-20241022-v2:0 + edit_format: diff + weak_model_name: bedrock/anthropic.claude-3-5-haiku-20241022-v1:0 + use_repo_map: true + send_undo_reply: false + lazy: false + reminder: user + examples_as_sys_msg: true + extra_params: + extra_headers: + anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25 + max_tokens: 8192 + cache_control: true + caches_by_default: false + use_system_prompt: true + use_temperature: true + streaming: true + editor_model_name: bedrock/anthropic.claude-3-5-sonnet-20241022-v2:0 + editor_edit_format: editor-diff + +- name: anthropic/claude-3-5-sonnet-latest + edit_format: diff + weak_model_name: anthropic/claude-3-5-haiku-20241022 + use_repo_map: true + send_undo_reply: false + lazy: false + reminder: user + examples_as_sys_msg: true + extra_params: + extra_headers: + anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25 + max_tokens: 8192 + cache_control: true + caches_by_default: false + use_system_prompt: true + use_temperature: true + streaming: true + editor_model_name: anthropic/claude-3-5-sonnet-20241022 + editor_edit_format: editor-diff + +- name: claude-3-5-sonnet-20241022 + edit_format: diff + weak_model_name: claude-3-5-haiku-20241022 + use_repo_map: true + send_undo_reply: false + lazy: false + reminder: user + examples_as_sys_msg: true + extra_params: + extra_headers: + anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25 + max_tokens: 8192 + cache_control: true + caches_by_default: false + use_system_prompt: true + use_temperature: true + streaming: true + editor_model_name: claude-3-5-sonnet-20241022 + editor_edit_format: editor-diff + +- name: anthropic/claude-3-haiku-20240307 + edit_format: whole + weak_model_name: anthropic/claude-3-haiku-20240307 + use_repo_map: false + send_undo_reply: false + lazy: false + reminder: user + examples_as_sys_msg: true + extra_params: + extra_headers: + anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25 + cache_control: true + caches_by_default: false + use_system_prompt: true + use_temperature: true + streaming: true + editor_model_name: null + editor_edit_format: null + +- name: anthropic/claude-3-5-haiku-20241022 + edit_format: diff + weak_model_name: anthropic/claude-3-5-haiku-20241022 + use_repo_map: true + send_undo_reply: false + lazy: false + reminder: user + examples_as_sys_msg: false + extra_params: + extra_headers: + anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25 + cache_control: true + caches_by_default: false + use_system_prompt: true + use_temperature: true + streaming: true + editor_model_name: null + editor_edit_format: null + +- name: bedrock/anthropic.claude-3-5-haiku-20241022-v1:0 + edit_format: diff + weak_model_name: bedrock/anthropic.claude-3-5-haiku-20241022-v1:0 + use_repo_map: true + send_undo_reply: false + lazy: false + reminder: user + examples_as_sys_msg: false + extra_params: + extra_headers: + anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25 + cache_control: true + caches_by_default: false + use_system_prompt: true + use_temperature: true + streaming: true + editor_model_name: null + editor_edit_format: null + +- name: claude-3-5-haiku-20241022 + edit_format: diff + weak_model_name: claude-3-5-haiku-20241022 + use_repo_map: true + send_undo_reply: false + lazy: false + reminder: user + examples_as_sys_msg: true + extra_params: + extra_headers: + anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25 + cache_control: true + caches_by_default: false + use_system_prompt: true + use_temperature: true + streaming: true + editor_model_name: null + editor_edit_format: null + +- name: vertex_ai/claude-3-5-haiku@20241022 + edit_format: diff + weak_model_name: vertex_ai/claude-3-5-haiku@20241022 + use_repo_map: true + send_undo_reply: false + lazy: false + reminder: user examples_as_sys_msg: false extra_params: max_tokens: 4096 - lazy: false - name: vertex_ai/claude-3-5-haiku@20241022 - reminder: user - send_undo_reply: false - streaming: true - use_repo_map: true + cache_control: false + caches_by_default: false use_system_prompt: true use_temperature: true - weak_model_name: vertex_ai/claude-3-5-haiku@20241022 -- cache_control: true - caches_by_default: false - edit_format: whole - editor_edit_format: null + streaming: true editor_model_name: null + editor_edit_format: null + +- name: claude-3-haiku-20240307 + edit_format: whole + weak_model_name: claude-3-haiku-20240307 + use_repo_map: false + send_undo_reply: false + lazy: false + reminder: user examples_as_sys_msg: true extra_params: extra_headers: anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25 - lazy: false - name: claude-3-haiku-20240307 - reminder: user - send_undo_reply: false - streaming: true - use_repo_map: false - use_system_prompt: true - use_temperature: true - weak_model_name: claude-3-haiku-20240307 -- cache_control: true + cache_control: true caches_by_default: false - edit_format: diff - editor_edit_format: editor-diff - editor_model_name: openrouter/anthropic/claude-3.5-sonnet - examples_as_sys_msg: true - extra_params: - max_tokens: 8192 - lazy: false - name: openrouter/anthropic/claude-3.5-sonnet - reminder: user - send_undo_reply: false - streaming: true - use_repo_map: true use_system_prompt: true use_temperature: true + streaming: true + editor_model_name: null + editor_edit_format: null + +- name: openrouter/anthropic/claude-3.5-sonnet + edit_format: diff weak_model_name: openrouter/anthropic/claude-3-5-haiku -- cache_control: true - caches_by_default: false - edit_format: diff - editor_edit_format: editor-diff - editor_model_name: openrouter/anthropic/claude-3.5-sonnet:beta + use_repo_map: true + send_undo_reply: false + lazy: false + reminder: user examples_as_sys_msg: true extra_params: max_tokens: 8192 - lazy: false - name: openrouter/anthropic/claude-3.5-sonnet:beta - reminder: user - send_undo_reply: false - streaming: true - use_repo_map: true + cache_control: true + caches_by_default: false use_system_prompt: true use_temperature: true + streaming: true + editor_model_name: openrouter/anthropic/claude-3.5-sonnet + editor_edit_format: editor-diff + +- name: openrouter/anthropic/claude-3.5-sonnet:beta + edit_format: diff weak_model_name: openrouter/anthropic/claude-3-5-haiku:beta -- cache_control: false + use_repo_map: true + send_undo_reply: false + lazy: false + reminder: user + examples_as_sys_msg: true + extra_params: + max_tokens: 8192 + cache_control: true caches_by_default: false - edit_format: diff + use_system_prompt: true + use_temperature: true + streaming: true + editor_model_name: openrouter/anthropic/claude-3.5-sonnet:beta editor_edit_format: editor-diff + +- name: vertex_ai/claude-3-5-sonnet@20240620 + edit_format: diff + weak_model_name: vertex_ai/claude-3-5-haiku@20241022 + use_repo_map: true + send_undo_reply: false + lazy: false + reminder: user + examples_as_sys_msg: true + extra_params: + max_tokens: 8192 + cache_control: false + caches_by_default: false + use_system_prompt: true + use_temperature: true + streaming: true editor_model_name: vertex_ai/claude-3-5-sonnet@20240620 + editor_edit_format: editor-diff + +- name: vertex_ai/claude-3-5-sonnet-v2@20241022 + edit_format: diff + weak_model_name: vertex_ai/claude-3-5-haiku@20241022 + use_repo_map: true + send_undo_reply: false + lazy: false + reminder: user examples_as_sys_msg: true extra_params: max_tokens: 8192 - lazy: false - name: vertex_ai/claude-3-5-sonnet@20240620 - reminder: user - send_undo_reply: false - streaming: true - use_repo_map: true + cache_control: false + caches_by_default: false use_system_prompt: true use_temperature: true - weak_model_name: vertex_ai/claude-3-5-haiku@20241022 -- cache_control: false - caches_by_default: false - edit_format: diff - editor_edit_format: editor-diff + streaming: true editor_model_name: vertex_ai/claude-3-5-sonnet-v2@20241022 - examples_as_sys_msg: true - extra_params: - max_tokens: 8192 - lazy: false - name: vertex_ai/claude-3-5-sonnet-v2@20241022 - reminder: user - send_undo_reply: false - streaming: true - use_repo_map: true - use_system_prompt: true - use_temperature: true - weak_model_name: vertex_ai/claude-3-5-haiku@20241022 -- cache_control: false - caches_by_default: false + editor_edit_format: editor-diff + +- name: vertex_ai/claude-3-opus@20240229 edit_format: diff - editor_edit_format: null - editor_model_name: null + weak_model_name: vertex_ai/claude-3-5-haiku@20241022 + use_repo_map: true + send_undo_reply: false + lazy: false + reminder: user examples_as_sys_msg: false extra_params: null - lazy: false - name: vertex_ai/claude-3-opus@20240229 - reminder: user - send_undo_reply: false - streaming: true - use_repo_map: true + cache_control: false + caches_by_default: false use_system_prompt: true use_temperature: true - weak_model_name: vertex_ai/claude-3-5-haiku@20241022 -- cache_control: false - caches_by_default: false - edit_format: whole - editor_edit_format: null - editor_model_name: null - examples_as_sys_msg: false - extra_params: null - lazy: false - name: vertex_ai/claude-3-sonnet@20240229 - reminder: user - send_undo_reply: false streaming: true + editor_model_name: null + editor_edit_format: null + +- name: vertex_ai/claude-3-sonnet@20240229 + edit_format: whole + weak_model_name: vertex_ai/claude-3-5-haiku@20241022 use_repo_map: false - use_system_prompt: true - use_temperature: true - weak_model_name: vertex_ai/claude-3-5-haiku@20241022 -- cache_control: false - caches_by_default: false - edit_format: whole - editor_edit_format: null - editor_model_name: null + send_undo_reply: false + lazy: false + reminder: user examples_as_sys_msg: false extra_params: null - lazy: false - name: command-r-plus - reminder: user - send_undo_reply: false - streaming: true - use_repo_map: true + cache_control: false + caches_by_default: false use_system_prompt: true use_temperature: true + streaming: true + editor_model_name: null + editor_edit_format: null + +- name: command-r-plus + edit_format: whole weak_model_name: command-r-plus -- cache_control: false - caches_by_default: false - edit_format: whole - editor_edit_format: null - editor_model_name: null + use_repo_map: true + send_undo_reply: false + lazy: false + reminder: user examples_as_sys_msg: false extra_params: null - lazy: false - name: command-r-08-2024 - reminder: user - send_undo_reply: false - streaming: true - use_repo_map: true + cache_control: false + caches_by_default: false use_system_prompt: true use_temperature: true + streaming: true + editor_model_name: null + editor_edit_format: null + +- name: command-r-08-2024 + edit_format: whole weak_model_name: command-r-08-2024 -- cache_control: false - caches_by_default: false - edit_format: whole - editor_edit_format: null - editor_model_name: null + use_repo_map: true + send_undo_reply: false + lazy: false + reminder: user examples_as_sys_msg: false extra_params: null - lazy: false - name: command-r-plus-08-2024 - reminder: user - send_undo_reply: false - streaming: true - use_repo_map: true + cache_control: false + caches_by_default: false use_system_prompt: true use_temperature: true + streaming: true + editor_model_name: null + editor_edit_format: null + +- name: command-r-plus-08-2024 + edit_format: whole weak_model_name: command-r-plus-08-2024 -- cache_control: false - caches_by_default: false - edit_format: diff - editor_edit_format: null - editor_model_name: null - examples_as_sys_msg: true - extra_params: null - lazy: false - name: groq/llama3-70b-8192 - reminder: user + use_repo_map: true send_undo_reply: false - streaming: true - use_repo_map: false + lazy: false + reminder: user + examples_as_sys_msg: false + extra_params: null + cache_control: false + caches_by_default: false use_system_prompt: true use_temperature: true + streaming: true + editor_model_name: null + editor_edit_format: null + +- name: groq/llama3-70b-8192 + edit_format: diff weak_model_name: groq/llama3-8b-8192 -- cache_control: false - caches_by_default: false - edit_format: diff - editor_edit_format: null - editor_model_name: null + use_repo_map: false + send_undo_reply: false + lazy: false + reminder: user examples_as_sys_msg: true extra_params: null - lazy: false - name: openrouter/meta-llama/llama-3-70b-instruct - reminder: user - send_undo_reply: false - streaming: true - use_repo_map: false + cache_control: false + caches_by_default: false use_system_prompt: true use_temperature: true + streaming: true + editor_model_name: null + editor_edit_format: null + +- name: openrouter/meta-llama/llama-3-70b-instruct + edit_format: diff weak_model_name: openrouter/meta-llama/llama-3-70b-instruct -- cache_control: false - caches_by_default: false - edit_format: diff - editor_edit_format: null - editor_model_name: null - examples_as_sys_msg: false - extra_params: null - lazy: false - name: gemini/gemini-1.5-pro-002 - reminder: user - send_undo_reply: false - streaming: true - use_repo_map: true - use_system_prompt: true - use_temperature: true - weak_model_name: null -- cache_control: false - caches_by_default: false - edit_format: whole - editor_edit_format: null - editor_model_name: null - examples_as_sys_msg: false - extra_params: null - lazy: false - name: gemini/gemini-1.5-flash-002 - reminder: user - send_undo_reply: false - streaming: true use_repo_map: false - use_system_prompt: true - use_temperature: true - weak_model_name: null -- cache_control: false - caches_by_default: false - edit_format: diff-fenced - editor_edit_format: null - editor_model_name: null - examples_as_sys_msg: false - extra_params: null - lazy: false - name: gemini/gemini-1.5-pro - reminder: user send_undo_reply: false - streaming: true - use_repo_map: true - use_system_prompt: true - use_temperature: true - weak_model_name: null -- cache_control: false - caches_by_default: false - edit_format: diff-fenced - editor_edit_format: null - editor_model_name: null - examples_as_sys_msg: false - extra_params: null lazy: false - name: gemini/gemini-1.5-pro-latest reminder: user - send_undo_reply: false - streaming: true - use_repo_map: true - use_system_prompt: true - use_temperature: true - weak_model_name: null -- cache_control: false - caches_by_default: false - edit_format: diff-fenced - editor_edit_format: null - editor_model_name: null - examples_as_sys_msg: false - extra_params: null - lazy: false - name: gemini/gemini-1.5-pro-exp-0827 - reminder: user - send_undo_reply: false - streaming: true - use_repo_map: true - use_system_prompt: true - use_temperature: true - weak_model_name: null -- cache_control: false - caches_by_default: false - edit_format: diff - editor_edit_format: null - editor_model_name: null - examples_as_sys_msg: false - extra_params: null - lazy: false - name: gemini/gemini-exp-1206 - reminder: user - send_undo_reply: false - streaming: true - use_repo_map: true - use_system_prompt: true - use_temperature: true - weak_model_name: null -- cache_control: false - caches_by_default: false - edit_format: diff - editor_edit_format: null - editor_model_name: null - examples_as_sys_msg: false - extra_params: null - lazy: false - name: gemini/gemini-exp-1114 - reminder: user - send_undo_reply: false - streaming: true - use_repo_map: true - use_system_prompt: true - use_temperature: true - weak_model_name: null -- cache_control: false - caches_by_default: false - edit_format: diff - editor_edit_format: null - editor_model_name: null - examples_as_sys_msg: false - extra_params: null - lazy: false - name: gemini/gemini-exp-1121 - reminder: user - send_undo_reply: false - streaming: true - use_repo_map: true - use_system_prompt: true - use_temperature: true - weak_model_name: null -- cache_control: false - caches_by_default: false - edit_format: diff-fenced - editor_edit_format: null - editor_model_name: null - examples_as_sys_msg: false - extra_params: null - lazy: false - name: vertex_ai/gemini-pro-experimental - reminder: user - send_undo_reply: false - streaming: true - use_repo_map: true - use_system_prompt: true - use_temperature: true - weak_model_name: null -- cache_control: false - caches_by_default: false - edit_format: whole - editor_edit_format: null - editor_model_name: null - examples_as_sys_msg: false - extra_params: null - lazy: false - name: gemini/gemini-1.5-flash-exp-0827 - reminder: user - send_undo_reply: false - streaming: true - use_repo_map: false - use_system_prompt: true - use_temperature: true - weak_model_name: null -- cache_control: false - caches_by_default: false - edit_format: diff - editor_edit_format: null - editor_model_name: null - examples_as_sys_msg: false - extra_params: null - lazy: false - name: gemini/gemini-2.0-flash-exp - reminder: user - send_undo_reply: false - streaming: true - use_repo_map: true - use_system_prompt: true - use_temperature: true - weak_model_name: null -- cache_control: false - caches_by_default: true - edit_format: diff - editor_edit_format: editor-diff - editor_model_name: openrouter/deepseek/deepseek-chat examples_as_sys_msg: true - extra_params: - max_tokens: 8192 - lazy: false - name: openrouter/deepseek/deepseek-r1 - reminder: user - send_undo_reply: false - streaming: true - use_repo_map: true + extra_params: null + cache_control: false + caches_by_default: false use_system_prompt: true - use_temperature: false + use_temperature: true + streaming: true + editor_model_name: null + editor_edit_format: null + +- name: gemini/gemini-1.5-pro-002 + edit_format: diff + weak_model_name: null + use_repo_map: true + send_undo_reply: false + lazy: false + reminder: user + examples_as_sys_msg: false + extra_params: null + cache_control: false + caches_by_default: false + use_system_prompt: true + use_temperature: true + streaming: true + editor_model_name: null + editor_edit_format: null + +- name: gemini/gemini-1.5-flash-002 + edit_format: whole + weak_model_name: null + use_repo_map: false + send_undo_reply: false + lazy: false + reminder: user + examples_as_sys_msg: false + extra_params: null + cache_control: false + caches_by_default: false + use_system_prompt: true + use_temperature: true + streaming: true + editor_model_name: null + editor_edit_format: null + +- name: gemini/gemini-1.5-pro + edit_format: diff-fenced + weak_model_name: null + use_repo_map: true + send_undo_reply: false + lazy: false + reminder: user + examples_as_sys_msg: false + extra_params: null + cache_control: false + caches_by_default: false + use_system_prompt: true + use_temperature: true + streaming: true + editor_model_name: null + editor_edit_format: null + +- name: gemini/gemini-1.5-pro-latest + edit_format: diff-fenced + weak_model_name: null + use_repo_map: true + send_undo_reply: false + lazy: false + reminder: user + examples_as_sys_msg: false + extra_params: null + cache_control: false + caches_by_default: false + use_system_prompt: true + use_temperature: true + streaming: true + editor_model_name: null + editor_edit_format: null + +- name: gemini/gemini-1.5-pro-exp-0827 + edit_format: diff-fenced + weak_model_name: null + use_repo_map: true + send_undo_reply: false + lazy: false + reminder: user + examples_as_sys_msg: false + extra_params: null + cache_control: false + caches_by_default: false + use_system_prompt: true + use_temperature: true + streaming: true + editor_model_name: null + editor_edit_format: null + +- name: gemini/gemini-exp-1206 + edit_format: diff + weak_model_name: null + use_repo_map: true + send_undo_reply: false + lazy: false + reminder: user + examples_as_sys_msg: false + extra_params: null + cache_control: false + caches_by_default: false + use_system_prompt: true + use_temperature: true + streaming: true + editor_model_name: null + editor_edit_format: null + +- name: gemini/gemini-exp-1114 + edit_format: diff + weak_model_name: null + use_repo_map: true + send_undo_reply: false + lazy: false + reminder: user + examples_as_sys_msg: false + extra_params: null + cache_control: false + caches_by_default: false + use_system_prompt: true + use_temperature: true + streaming: true + editor_model_name: null + editor_edit_format: null + +- name: gemini/gemini-exp-1121 + edit_format: diff + weak_model_name: null + use_repo_map: true + send_undo_reply: false + lazy: false + reminder: user + examples_as_sys_msg: false + extra_params: null + cache_control: false + caches_by_default: false + use_system_prompt: true + use_temperature: true + streaming: true + editor_model_name: null + editor_edit_format: null + +- name: vertex_ai/gemini-pro-experimental + edit_format: diff-fenced + weak_model_name: null + use_repo_map: true + send_undo_reply: false + lazy: false + reminder: user + examples_as_sys_msg: false + extra_params: null + cache_control: false + caches_by_default: false + use_system_prompt: true + use_temperature: true + streaming: true + editor_model_name: null + editor_edit_format: null + +- name: gemini/gemini-1.5-flash-exp-0827 + edit_format: whole + weak_model_name: null + use_repo_map: false + send_undo_reply: false + lazy: false + reminder: user + examples_as_sys_msg: false + extra_params: null + cache_control: false + caches_by_default: false + use_system_prompt: true + use_temperature: true + streaming: true + editor_model_name: null + editor_edit_format: null + +- name: gemini/gemini-2.0-flash-exp + edit_format: diff + weak_model_name: null + use_repo_map: true + send_undo_reply: false + lazy: false + reminder: user + examples_as_sys_msg: false + extra_params: null + cache_control: false + caches_by_default: false + use_system_prompt: true + use_temperature: true + streaming: true + editor_model_name: null + editor_edit_format: null + +- name: openrouter/deepseek/deepseek-r1 + edit_format: diff weak_model_name: openrouter/deepseek/deepseek-chat -- cache_control: false - caches_by_default: true - edit_format: diff - editor_edit_format: editor-diff - editor_model_name: deepseek/deepseek-chat + use_repo_map: true + send_undo_reply: false + lazy: false + reminder: user examples_as_sys_msg: true extra_params: max_tokens: 8192 - lazy: false - name: deepseek/deepseek-reasoner - reminder: user - send_undo_reply: false - streaming: true - use_repo_map: true + cache_control: false + caches_by_default: true use_system_prompt: true use_temperature: false + streaming: true + editor_model_name: openrouter/deepseek/deepseek-chat + editor_edit_format: editor-diff + +- name: deepseek/deepseek-reasoner + edit_format: diff weak_model_name: deepseek/deepseek-chat -- cache_control: false + use_repo_map: true + send_undo_reply: false + lazy: false + reminder: user + examples_as_sys_msg: true + extra_params: + max_tokens: 8192 + cache_control: false caches_by_default: true - edit_format: diff - editor_edit_format: null - editor_model_name: null - examples_as_sys_msg: true - extra_params: - max_tokens: 8192 - lazy: false - name: deepseek/deepseek-chat - reminder: sys - send_undo_reply: false - streaming: true - use_repo_map: true use_system_prompt: true - use_temperature: true - weak_model_name: null -- cache_control: false - caches_by_default: true - edit_format: diff - editor_edit_format: null - editor_model_name: null - examples_as_sys_msg: true - extra_params: - max_tokens: 8192 - lazy: false - name: deepseek/deepseek-coder - reminder: sys - send_undo_reply: false + use_temperature: false streaming: true - use_repo_map: true - use_system_prompt: true - use_temperature: true - weak_model_name: null -- cache_control: false - caches_by_default: false - edit_format: diff - editor_edit_format: null - editor_model_name: null - examples_as_sys_msg: true - extra_params: - max_tokens: 8192 - lazy: false - name: deepseek-chat - reminder: sys - send_undo_reply: false - streaming: true - use_repo_map: true - use_system_prompt: true - use_temperature: true - weak_model_name: null -- cache_control: false - caches_by_default: true - edit_format: diff - editor_edit_format: null - editor_model_name: null - examples_as_sys_msg: true - extra_params: - max_tokens: 8192 - lazy: false - name: deepseek-coder - reminder: sys - send_undo_reply: false - streaming: true - use_repo_map: true - use_system_prompt: true - use_temperature: true - weak_model_name: null -- cache_control: false - caches_by_default: false - edit_format: diff - editor_edit_format: null - editor_model_name: null - examples_as_sys_msg: true - extra_params: null - lazy: false - name: openrouter/deepseek/deepseek-coder - reminder: sys - send_undo_reply: false - streaming: true - use_repo_map: true - use_system_prompt: true - use_temperature: true - weak_model_name: null -- cache_control: false - caches_by_default: false - edit_format: diff - editor_edit_format: null - editor_model_name: null - examples_as_sys_msg: true - extra_params: null - lazy: false - name: openrouter/deepseek/deepseek-chat - reminder: sys - send_undo_reply: false - streaming: true - use_repo_map: true - use_system_prompt: true - use_temperature: true - weak_model_name: null -- cache_control: false - caches_by_default: false - edit_format: diff + editor_model_name: deepseek/deepseek-chat editor_edit_format: editor-diff + +- name: deepseek/deepseek-chat + edit_format: diff + weak_model_name: null + use_repo_map: true + send_undo_reply: false + lazy: false + reminder: sys + examples_as_sys_msg: true + extra_params: + max_tokens: 8192 + cache_control: false + caches_by_default: true + use_system_prompt: true + use_temperature: true + streaming: true editor_model_name: null + editor_edit_format: null + +- name: deepseek/deepseek-coder + edit_format: diff + weak_model_name: null + use_repo_map: true + send_undo_reply: false + lazy: false + reminder: sys + examples_as_sys_msg: true + extra_params: + max_tokens: 8192 + cache_control: false + caches_by_default: true + use_system_prompt: true + use_temperature: true + streaming: true + editor_model_name: null + editor_edit_format: null + +- name: deepseek-chat + edit_format: diff + weak_model_name: null + use_repo_map: true + send_undo_reply: false + lazy: false + reminder: sys + examples_as_sys_msg: true + extra_params: + max_tokens: 8192 + cache_control: false + caches_by_default: false + use_system_prompt: true + use_temperature: true + streaming: true + editor_model_name: null + editor_edit_format: null + +- name: deepseek-coder + edit_format: diff + weak_model_name: null + use_repo_map: true + send_undo_reply: false + lazy: false + reminder: sys + examples_as_sys_msg: true + extra_params: + max_tokens: 8192 + cache_control: false + caches_by_default: true + use_system_prompt: true + use_temperature: true + streaming: true + editor_model_name: null + editor_edit_format: null + +- name: openrouter/deepseek/deepseek-coder + edit_format: diff + weak_model_name: null + use_repo_map: true + send_undo_reply: false + lazy: false + reminder: sys examples_as_sys_msg: true extra_params: null + cache_control: false + caches_by_default: false + use_system_prompt: true + use_temperature: true + streaming: true + editor_model_name: null + editor_edit_format: null + +- name: openrouter/deepseek/deepseek-chat + edit_format: diff + weak_model_name: null + use_repo_map: true + send_undo_reply: false + lazy: false + reminder: sys + examples_as_sys_msg: true + extra_params: null + cache_control: false + caches_by_default: false + use_system_prompt: true + use_temperature: true + streaming: true + editor_model_name: null + editor_edit_format: null + +- name: openrouter/openai/gpt-4o + edit_format: diff + weak_model_name: openrouter/openai/gpt-4o-mini + use_repo_map: true + send_undo_reply: false lazy: true - name: openrouter/openai/gpt-4o reminder: sys - send_undo_reply: false - streaming: true - use_repo_map: true + examples_as_sys_msg: true + extra_params: null + cache_control: false + caches_by_default: false use_system_prompt: true use_temperature: true - weak_model_name: openrouter/openai/gpt-4o-mini -- cache_control: false - caches_by_default: false - edit_format: whole - editor_edit_format: editor-diff - editor_model_name: openai/gpt-4o - examples_as_sys_msg: false - extra_params: null - lazy: false - name: openai/o1-mini - reminder: user - send_undo_reply: false streaming: true - use_repo_map: true - use_system_prompt: false - use_temperature: false + editor_model_name: null + editor_edit_format: editor-diff + +- name: openai/o1-mini + edit_format: whole weak_model_name: openai/gpt-4o-mini -- cache_control: false - caches_by_default: false - edit_format: whole - editor_edit_format: editor-diff - editor_model_name: azure/gpt-4o + use_repo_map: true + send_undo_reply: false + lazy: false + reminder: user examples_as_sys_msg: false extra_params: null - lazy: false - name: azure/o1-mini - reminder: user - send_undo_reply: false - streaming: true - use_repo_map: true + cache_control: false + caches_by_default: false use_system_prompt: false use_temperature: false + streaming: true + editor_model_name: openai/gpt-4o + editor_edit_format: editor-diff + +- name: azure/o1-mini + edit_format: whole weak_model_name: azure/gpt-4o-mini -- cache_control: false - caches_by_default: false - edit_format: whole - editor_edit_format: editor-diff - editor_model_name: gpt-4o + use_repo_map: true + send_undo_reply: false + lazy: false + reminder: user examples_as_sys_msg: false extra_params: null - lazy: false - name: o1-mini - reminder: user - send_undo_reply: false - streaming: true - use_repo_map: true + cache_control: false + caches_by_default: false use_system_prompt: false use_temperature: false + streaming: true + editor_model_name: azure/gpt-4o + editor_edit_format: editor-diff + +- name: o1-mini + edit_format: whole weak_model_name: gpt-4o-mini -- cache_control: false - caches_by_default: false - edit_format: diff - editor_edit_format: editor-diff - editor_model_name: openai/gpt-4o + use_repo_map: true + send_undo_reply: false + lazy: false + reminder: user examples_as_sys_msg: false extra_params: null - lazy: false - name: openai/o1-preview - reminder: user - send_undo_reply: false - streaming: true - use_repo_map: true + cache_control: false + caches_by_default: false use_system_prompt: false use_temperature: false + streaming: true + editor_model_name: gpt-4o + editor_edit_format: editor-diff + +- name: openai/o1-preview + edit_format: diff weak_model_name: openai/gpt-4o-mini -- cache_control: false - caches_by_default: false - edit_format: diff - editor_edit_format: editor-diff - editor_model_name: azure/gpt-4o + use_repo_map: true + send_undo_reply: false + lazy: false + reminder: user examples_as_sys_msg: false extra_params: null - lazy: false - name: azure/o1-preview - reminder: user - send_undo_reply: false - streaming: true - use_repo_map: true + cache_control: false + caches_by_default: false use_system_prompt: false use_temperature: false + streaming: true + editor_model_name: openai/gpt-4o + editor_edit_format: editor-diff + +- name: azure/o1-preview + edit_format: diff weak_model_name: azure/gpt-4o-mini -- cache_control: false + use_repo_map: true + send_undo_reply: false + lazy: false + reminder: user + examples_as_sys_msg: false + extra_params: null + cache_control: false caches_by_default: false + use_system_prompt: false + use_temperature: false + streaming: true + editor_model_name: azure/gpt-4o + editor_edit_format: editor-diff + +- name: azure/o1 + edit_format: diff + weak_model_name: azure/gpt-4o-mini + use_repo_map: true + send_undo_reply: false + lazy: false + reminder: user + examples_as_sys_msg: false + extra_params: null + cache_control: false + caches_by_default: false + use_system_prompt: true + use_temperature: false + streaming: false + editor_model_name: azure/gpt-4o + editor_edit_format: editor-diff + +- name: o1-preview edit_format: architect - editor_edit_format: editor-diff - editor_model_name: gpt-4o + weak_model_name: gpt-4o-mini + use_repo_map: true + send_undo_reply: false + lazy: false + reminder: user examples_as_sys_msg: false extra_params: null - lazy: false - name: o1-preview - reminder: user - send_undo_reply: false - streaming: true - use_repo_map: true + cache_control: false + caches_by_default: false use_system_prompt: false use_temperature: false - weak_model_name: gpt-4o-mini -- cache_control: false - caches_by_default: false + streaming: true + editor_model_name: gpt-4o + editor_edit_format: editor-diff + +- name: openrouter/openai/o1-mini edit_format: whole - editor_edit_format: editor-diff - editor_model_name: openrouter/openai/gpt-4o + weak_model_name: openrouter/openai/gpt-4o-mini + use_repo_map: true + send_undo_reply: false + lazy: false + reminder: user examples_as_sys_msg: false extra_params: null - lazy: false - name: openrouter/openai/o1-mini - reminder: user - send_undo_reply: false - streaming: false - use_repo_map: true + cache_control: false + caches_by_default: false use_system_prompt: false use_temperature: false - weak_model_name: openrouter/openai/gpt-4o-mini -- cache_control: false - caches_by_default: false - edit_format: diff - editor_edit_format: editor-diff + streaming: false editor_model_name: openrouter/openai/gpt-4o + editor_edit_format: editor-diff + +- name: openrouter/openai/o1-preview + edit_format: diff + weak_model_name: openrouter/openai/gpt-4o-mini + use_repo_map: true + send_undo_reply: false + lazy: false + reminder: user examples_as_sys_msg: false extra_params: null - lazy: false - name: openrouter/openai/o1-preview - reminder: user - send_undo_reply: false - streaming: false - use_repo_map: true + cache_control: false + caches_by_default: false use_system_prompt: false use_temperature: false - weak_model_name: openrouter/openai/gpt-4o-mini -- cache_control: false - caches_by_default: false - edit_format: diff - editor_edit_format: editor-diff + streaming: false editor_model_name: openrouter/openai/gpt-4o - examples_as_sys_msg: false - extra_params: null - lazy: false - name: openrouter/openai/o1 - reminder: user - send_undo_reply: false - streaming: false - use_repo_map: true - use_system_prompt: true - use_temperature: false - weak_model_name: openrouter/openai/gpt-4o-mini -- cache_control: false - caches_by_default: false - edit_format: diff editor_edit_format: editor-diff - editor_model_name: openai/gpt-4o + +- name: openrouter/openai/o1 + edit_format: diff + weak_model_name: openrouter/openai/gpt-4o-mini + use_repo_map: true + send_undo_reply: false + lazy: false + reminder: user examples_as_sys_msg: false extra_params: null - lazy: false - name: openai/o1 - reminder: user - send_undo_reply: false - streaming: false - use_repo_map: true + cache_control: false + caches_by_default: false use_system_prompt: true use_temperature: false + streaming: false + editor_model_name: openrouter/openai/gpt-4o + editor_edit_format: editor-diff + +- name: openai/o1 + edit_format: diff weak_model_name: openai/gpt-4o-mini -- cache_control: false - caches_by_default: false - edit_format: diff - editor_edit_format: editor-diff - editor_model_name: gpt-4o + use_repo_map: true + send_undo_reply: false + lazy: false + reminder: user examples_as_sys_msg: false extra_params: null - lazy: false - name: o1 - reminder: user - send_undo_reply: false - streaming: false - use_repo_map: true + cache_control: false + caches_by_default: false use_system_prompt: true use_temperature: false - weak_model_name: gpt-4o-mini -- cache_control: false - caches_by_default: false - edit_format: diff + streaming: false + editor_model_name: openai/gpt-4o editor_edit_format: editor-diff - editor_model_name: openrouter/qwen/qwen-2.5-coder-32b-instruct + +- name: o1 + edit_format: diff + weak_model_name: gpt-4o-mini + use_repo_map: true + send_undo_reply: false + lazy: false + reminder: user examples_as_sys_msg: false extra_params: null - lazy: false - name: openrouter/qwen/qwen-2.5-coder-32b-instruct - reminder: user - send_undo_reply: false - streaming: true + cache_control: false + caches_by_default: false + use_system_prompt: true + use_temperature: false + streaming: false + editor_model_name: gpt-4o + editor_edit_format: editor-diff + +- name: openrouter/qwen/qwen-2.5-coder-32b-instruct + edit_format: diff + weak_model_name: openrouter/qwen/qwen-2.5-coder-32b-instruct use_repo_map: true + send_undo_reply: false + lazy: false + reminder: user + examples_as_sys_msg: false + extra_params: null + cache_control: false + caches_by_default: false use_system_prompt: true use_temperature: true - weak_model_name: openrouter/qwen/qwen-2.5-coder-32b-instruct + streaming: true + editor_model_name: openrouter/qwen/qwen-2.5-coder-32b-instruct + editor_edit_format: editor-diff ``` diff --git a/aider/website/docs/faq.md b/aider/website/docs/faq.md index 7d4e73d6d..4e0ee55e9 100644 --- a/aider/website/docs/faq.md +++ b/aider/website/docs/faq.md @@ -249,14 +249,14 @@ tr:hover { background-color: #f5f5f5; } - - - - + + + + - - + +
Model NameTotal TokensPercent
deepseek/deepseek-chat1,373,93457.3%
claude-3-5-sonnet-20241022652,55627.2%
deepseek/REDACTED308,84112.9%
o125,1211.0%
deepseek/deepseek-chat1,285,46055.3%
claude-3-5-sonnet-20241022670,00928.8%
deepseek/REDACTED308,84113.3%
deepseek/deepseek-reasoner22,9891.0%
claude-3-5-haiku-2024102210,0830.4%
gemini/gemini-exp-120610,0680.4%
mistral/codestral-latest8,1370.3%
deepseek/deepseek-reasoner5,5170.2%
mistral/codestral-latest8,1370.4%
o14,9630.2%
gpt-4o1,7750.1%
o1-preview1750.0%
diff --git a/aider/website/index.md b/aider/website/index.md index 33ea4c25a..fae50719e 100644 --- a/aider/website/index.md +++ b/aider/website/index.md @@ -99,7 +99,7 @@ for more details. - Ask for changes: - Add new features or test cases. - Describe a bug. - - Paste in an error message or or GitHub issue URL. + - Paste in an error message or GitHub issue URL. - Refactor code. - Update docs. - Aider will edit your files to complete your request. From 2b59badde7e33f60cf43b50d2f92766dfa379d83 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Sat, 25 Jan 2025 08:46:40 -0800 Subject: [PATCH 134/229] copy --- aider/website/assets/sample-analytics.jsonl | 6 +++--- aider/website/docs/faq.md | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/aider/website/assets/sample-analytics.jsonl b/aider/website/assets/sample-analytics.jsonl index 1e952c6ae..660d63a1c 100644 --- a/aider/website/assets/sample-analytics.jsonl +++ b/aider/website/assets/sample-analytics.jsonl @@ -1,6 +1,3 @@ -{"event": "command_run", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736638988} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736638991} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 22062, "completion_tokens": 654, "total_tokens": 22716, "cost": 0.0032717999999980407, "total_cost": 0.022630999999984323}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736639007} {"event": "command_run", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736639019} {"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736639022} {"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 23367, "completion_tokens": 199, "total_tokens": 23566, "cost": 0.0033270999999980406, "total_cost": 0.025958099999982363}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736639031} @@ -998,3 +995,6 @@ {"event": "command_clear", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737823386} {"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737823387} {"event": "message_send", "properties": {"main_model": "deepseek/deepseek-reasoner", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 17012, "completion_tokens": 460, "total_tokens": 17472, "cost": 0.010364, "total_cost": 0.07594274}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737823418} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737823580} +{"event": "repo", "properties": {"num_files": 430}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737823582} +{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737823588} diff --git a/aider/website/docs/faq.md b/aider/website/docs/faq.md index 4e0ee55e9..97d393ad8 100644 --- a/aider/website/docs/faq.md +++ b/aider/website/docs/faq.md @@ -249,9 +249,9 @@ tr:hover { background-color: #f5f5f5; } - - - + + + From 3785f7621ce0f9b8ba8afef99c43e6ab945d548d Mon Sep 17 00:00:00 2001 From: Jintao Zhang Date: Sun, 26 Jan 2025 15:29:54 +0800 Subject: [PATCH 135/229] docs: update DeepSeek v2 Coder to v3 Chat Signed-off-by: Jintao Zhang --- aider/website/docs/llms/deepseek.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/aider/website/docs/llms/deepseek.md b/aider/website/docs/llms/deepseek.md index 361758427..d1f8ebfbf 100644 --- a/aider/website/docs/llms/deepseek.md +++ b/aider/website/docs/llms/deepseek.md @@ -6,7 +6,7 @@ nav_order: 500 # DeepSeek Aider can connect to the DeepSeek.com API. -The DeepSeek Coder V2 model has a top score on aider's code editing benchmark. +The DeepSeek Chat V3 model has a top score on aider's code editing benchmark. ``` python -m pip install -U aider-chat @@ -14,7 +14,7 @@ python -m pip install -U aider-chat export DEEPSEEK_API_KEY= # Mac/Linux setx DEEPSEEK_API_KEY # Windows, restart shell after setx -# Use DeepSeek Coder V2 +# Use DeepSeek Chat v3 aider --deepseek ``` From 3cb67939e48ab9c2fa824053f02f29ecead6d4e0 Mon Sep 17 00:00:00 2001 From: Jintao Zhang Date: Sun, 26 Jan 2025 23:11:14 +0800 Subject: [PATCH 136/229] docs: clean DeepSeek Coder v2 Signed-off-by: Jintao Zhang --- aider/website/docs/llms.md | 2 +- aider/website/docs/usage/caching.md | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/aider/website/docs/llms.md b/aider/website/docs/llms.md index 939bbef87..1e30795f8 100644 --- a/aider/website/docs/llms.md +++ b/aider/website/docs/llms.md @@ -19,7 +19,7 @@ Aider works best with these models, which are skilled at editing code: - [GPT-4o](/docs/llms/openai.html) - [Claude 3.5 Sonnet](/docs/llms/anthropic.html) - [Claude 3 Opus](/docs/llms/anthropic.html) -- [DeepSeek Coder V2](/docs/llms/deepseek.html) +- [DeepSeek V3](/docs/llms/deepseek.html) ## Free models diff --git a/aider/website/docs/usage/caching.md b/aider/website/docs/usage/caching.md index f79bc6d9c..3173a3e83 100644 --- a/aider/website/docs/usage/caching.md +++ b/aider/website/docs/usage/caching.md @@ -4,14 +4,13 @@ highlight_image: /assets/prompt-caching.jpg parent: Usage nav_order: 750 description: Aider supports prompt caching for cost savings and faster coding. - --- # Prompt caching Aider supports prompt caching for cost savings and faster coding. Currently Anthropic provides caching for Sonnet and Haiku, -and DeepSeek provides caching for Coder. +and DeepSeek provides caching for Chat. Aider organizes the chat history to try and cache: @@ -48,4 +47,3 @@ every 5 minutes to keep the cache warm. Aider will ping up to `N` times over a period of `N*5` minutes after each message you send. - From 4af583e5d51b50591ac90d63ab1af808b0ae7d86 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Sun, 26 Jan 2025 13:49:22 -0800 Subject: [PATCH 137/229] copy --- aider/website/docs/troubleshooting/edit-errors.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/aider/website/docs/troubleshooting/edit-errors.md b/aider/website/docs/troubleshooting/edit-errors.md index fac41767d..479e298ce 100644 --- a/aider/website/docs/troubleshooting/edit-errors.md +++ b/aider/website/docs/troubleshooting/edit-errors.md @@ -24,6 +24,8 @@ In these cases, here are some things you might try. Many LLMs now have very large context windows, but filling them with irrelevant code or conversation can confuse the model. +Above about 25k tokens of context, most models start to become distracted and become less likely +to conform to their system prompt. - Don't add too many files to the chat, *just* add the files you think need to be edited. Aider also sends the LLM a [map of your entire git repo](https://aider.chat/docs/repomap.html), so other relevant code will be included automatically. From f4d7fe8850c3857f37e32b96f49425c824eecf6f Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Sun, 26 Jan 2025 13:54:06 -0800 Subject: [PATCH 138/229] copy --- aider/website/docs/troubleshooting/edit-errors.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/aider/website/docs/troubleshooting/edit-errors.md b/aider/website/docs/troubleshooting/edit-errors.md index 479e298ce..a6de214e3 100644 --- a/aider/website/docs/troubleshooting/edit-errors.md +++ b/aider/website/docs/troubleshooting/edit-errors.md @@ -35,8 +35,8 @@ Aider also sends the LLM a [map of your entire git repo](https://aider.chat/docs ## Use a more capable model -If possible try using GPT-4o, Claude 3.5 Sonnet or Claude 3 Opus, -as they are the strongest and most capable models. +If possible try using GPT-4o, Claude 3.5 Sonnet, DeepSeek V3 or DeepSeek R1. +They are the strongest and most capable models. Weaker models are more prone to From 491fb14eaa01edb0f9a233ed91704c63f137baf9 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Sun, 26 Jan 2025 18:45:49 -0800 Subject: [PATCH 139/229] feat: append keyboard interrupt message to last user message --- aider/coders/base_coder.py | 1 + 1 file changed, 1 insertion(+) diff --git a/aider/coders/base_coder.py b/aider/coders/base_coder.py index a8fb3250e..3982c5d8e 100755 --- a/aider/coders/base_coder.py +++ b/aider/coders/base_coder.py @@ -1367,6 +1367,7 @@ class Coder: interrupted = True if interrupted: + # check if the last messages was role==user, append the ^C Key.. to it if so. ai! self.cur_messages += [ dict(role="user", content="^C KeyboardInterrupt"), dict(role="assistant", content="I see that you interrupted my previous reply."), From 162204f28fea53118322a71655c1932608cc7ddd Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Sun, 26 Jan 2025 18:45:51 -0800 Subject: [PATCH 140/229] feat: improve keyboard interrupt message handling --- aider/coders/base_coder.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/aider/coders/base_coder.py b/aider/coders/base_coder.py index 3982c5d8e..193b90d76 100755 --- a/aider/coders/base_coder.py +++ b/aider/coders/base_coder.py @@ -1367,10 +1367,11 @@ class Coder: interrupted = True if interrupted: - # check if the last messages was role==user, append the ^C Key.. to it if so. ai! - self.cur_messages += [ - dict(role="user", content="^C KeyboardInterrupt"), - dict(role="assistant", content="I see that you interrupted my previous reply."), + if self.cur_messages and self.cur_messages[-1]["role"] == "user": + self.cur_messages[-1]["content"] += "\n^C KeyboardInterrupt" + else: + self.cur_messages += [dict(role="user", content="^C KeyboardInterrupt")] + self.cur_messages += [dict(role="assistant", content="I see that you interrupted my previous reply.")] ] return From 17fde3df0c947988ba1459a99c8dbedb5a69cdf3 Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Sun, 26 Jan 2025 18:46:05 -0800 Subject: [PATCH 141/229] fix: remove extra bracket causing syntax error in base_coder.py --- aider/coders/base_coder.py | 1 - 1 file changed, 1 deletion(-) diff --git a/aider/coders/base_coder.py b/aider/coders/base_coder.py index 193b90d76..6f58dc470 100755 --- a/aider/coders/base_coder.py +++ b/aider/coders/base_coder.py @@ -1372,7 +1372,6 @@ class Coder: else: self.cur_messages += [dict(role="user", content="^C KeyboardInterrupt")] self.cur_messages += [dict(role="assistant", content="I see that you interrupted my previous reply.")] - ] return edited = self.apply_updates() From e14ea94b0de898564e7a4e3c20f7bedebb37f8ca Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Sun, 26 Jan 2025 18:46:11 -0800 Subject: [PATCH 142/229] style: fix line length in keyboard interrupt message handling --- aider/coders/base_coder.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/aider/coders/base_coder.py b/aider/coders/base_coder.py index 6f58dc470..99741b651 100755 --- a/aider/coders/base_coder.py +++ b/aider/coders/base_coder.py @@ -1371,7 +1371,9 @@ class Coder: self.cur_messages[-1]["content"] += "\n^C KeyboardInterrupt" else: self.cur_messages += [dict(role="user", content="^C KeyboardInterrupt")] - self.cur_messages += [dict(role="assistant", content="I see that you interrupted my previous reply.")] + self.cur_messages += [ + dict(role="assistant", content="I see that you interrupted my previous reply.") + ] return edited = self.apply_updates() From 3d2700d29d121d434cad4e959a9b1b17387cf193 Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Sun, 26 Jan 2025 18:46:42 -0800 Subject: [PATCH 143/229] feat: add token limit check before sending messages to LLM --- aider/coders/base_coder.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/aider/coders/base_coder.py b/aider/coders/base_coder.py index 99741b651..886314613 100755 --- a/aider/coders/base_coder.py +++ b/aider/coders/base_coder.py @@ -1230,6 +1230,23 @@ class Coder: return chunks + def check_tokens(self, messages): + """Check if the messages will fit within the model's token limits.""" + input_tokens = self.main_model.token_count(messages) + max_input_tokens = self.main_model.info.get("max_input_tokens") or 0 + + if max_input_tokens and input_tokens >= max_input_tokens: + self.io.tool_error( + f"\nInput tokens ({input_tokens:,}) exceeds model's" + f" {max_input_tokens:,} token limit!" + ) + self.io.tool_error("Try:") + self.io.tool_error("- Use /drop to remove unneeded files from the chat") + self.io.tool_error("- Use /clear to clear the chat history") + self.io.tool_error("- Break your code into smaller files") + return False + return True + def send_message(self, inp): self.event("message_send_starting") @@ -1239,6 +1256,8 @@ class Coder: chunks = self.format_messages() messages = chunks.all_messages() + if not self.check_tokens(messages): + return self.warm_cache(chunks) if self.verbose: From 58d763f971ca9ac840273d7588f4e100796bc591 Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Sun, 26 Jan 2025 18:47:39 -0800 Subject: [PATCH 144/229] feat: add confirmation prompt when token limits are exceeded --- aider/coders/base_coder.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/aider/coders/base_coder.py b/aider/coders/base_coder.py index 886314613..6d0f33c57 100755 --- a/aider/coders/base_coder.py +++ b/aider/coders/base_coder.py @@ -1244,7 +1244,8 @@ class Coder: self.io.tool_error("- Use /drop to remove unneeded files from the chat") self.io.tool_error("- Use /clear to clear the chat history") self.io.tool_error("- Break your code into smaller files") - return False + if not self.io.confirm_ask("Try to proceed anyway?", default="n"): + return False return True def send_message(self, inp): From 37cbe6c488b3f3a1f45deeaf0aca0f550a4fc26b Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Sun, 26 Jan 2025 18:49:21 -0800 Subject: [PATCH 145/229] feat: add Ollama context window size warning with documentation link --- aider/coders/base_coder.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/aider/coders/base_coder.py b/aider/coders/base_coder.py index 6d0f33c57..b99feb438 100755 --- a/aider/coders/base_coder.py +++ b/aider/coders/base_coder.py @@ -1244,6 +1244,17 @@ class Coder: self.io.tool_error("- Use /drop to remove unneeded files from the chat") self.io.tool_error("- Use /clear to clear the chat history") self.io.tool_error("- Break your code into smaller files") + + # Special warning for Ollama models about context window size + if self.main_model.name.startswith(("ollama/", "ollama_chat/")): + num_ctx = self.main_model.extra_params.get("num_ctx") + if num_ctx: + self.io.tool_error( + f"\nNote: Your Ollama model is configured with num_ctx={num_ctx}." + f" See https://aider.chat/docs/llms/ollama.html#setting-the-context-window-size" + " for help configuring larger context windows." + ) + if not self.io.confirm_ask("Try to proceed anyway?", default="n"): return False return True From 02e81589183a4b9d48de5170be78e28a47b85e43 Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Sun, 26 Jan 2025 18:49:28 -0800 Subject: [PATCH 146/229] style: fix line wrapping in Ollama context window message --- aider/coders/base_coder.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/aider/coders/base_coder.py b/aider/coders/base_coder.py index b99feb438..5cca1faf4 100755 --- a/aider/coders/base_coder.py +++ b/aider/coders/base_coder.py @@ -1250,8 +1250,8 @@ class Coder: num_ctx = self.main_model.extra_params.get("num_ctx") if num_ctx: self.io.tool_error( - f"\nNote: Your Ollama model is configured with num_ctx={num_ctx}." - f" See https://aider.chat/docs/llms/ollama.html#setting-the-context-window-size" + f"\nNote: Your Ollama model is configured with num_ctx={num_ctx}. See" + " https://aider.chat/docs/llms/ollama.html#setting-the-context-window-size" " for help configuring larger context windows." ) From 8ca81d09914fe76a2f024e90937edff1bcc66f9a Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Sun, 26 Jan 2025 18:50:12 -0800 Subject: [PATCH 147/229] fix: handle missing extra_params attribute in Ollama model --- aider/coders/base_coder.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/aider/coders/base_coder.py b/aider/coders/base_coder.py index 5cca1faf4..ab8d4f6bf 100755 --- a/aider/coders/base_coder.py +++ b/aider/coders/base_coder.py @@ -1247,7 +1247,8 @@ class Coder: # Special warning for Ollama models about context window size if self.main_model.name.startswith(("ollama/", "ollama_chat/")): - num_ctx = self.main_model.extra_params.get("num_ctx") + extra_params = getattr(self.main_model, "extra_params", None) or {} + num_ctx = extra_params.get("num_ctx") if num_ctx: self.io.tool_error( f"\nNote: Your Ollama model is configured with num_ctx={num_ctx}. See" From ef84c4dfad4474cf56dcb39c60594f1e4e96a301 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Sun, 26 Jan 2025 18:51:57 -0800 Subject: [PATCH 148/229] refactor: Add comment for future tool output conversion --- aider/coders/base_coder.py | 1 + 1 file changed, 1 insertion(+) diff --git a/aider/coders/base_coder.py b/aider/coders/base_coder.py index ab8d4f6bf..f6c4c3736 100755 --- a/aider/coders/base_coder.py +++ b/aider/coders/base_coder.py @@ -1240,6 +1240,7 @@ class Coder: f"\nInput tokens ({input_tokens:,}) exceeds model's" f" {max_input_tokens:,} token limit!" ) + # turn these into tool_output ai! self.io.tool_error("Try:") self.io.tool_error("- Use /drop to remove unneeded files from the chat") self.io.tool_error("- Use /clear to clear the chat history") From 546a662a30e5b42850e106997c217fb959335859 Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Sun, 26 Jan 2025 18:51:59 -0800 Subject: [PATCH 149/229] refactor: change token limit suggestions from tool_error to tool_output --- aider/coders/base_coder.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/aider/coders/base_coder.py b/aider/coders/base_coder.py index f6c4c3736..1543ad8da 100755 --- a/aider/coders/base_coder.py +++ b/aider/coders/base_coder.py @@ -1240,11 +1240,10 @@ class Coder: f"\nInput tokens ({input_tokens:,}) exceeds model's" f" {max_input_tokens:,} token limit!" ) - # turn these into tool_output ai! - self.io.tool_error("Try:") - self.io.tool_error("- Use /drop to remove unneeded files from the chat") - self.io.tool_error("- Use /clear to clear the chat history") - self.io.tool_error("- Break your code into smaller files") + self.io.tool_output("Try:") + self.io.tool_output("- Use /drop to remove unneeded files from the chat") + self.io.tool_output("- Use /clear to clear the chat history") + self.io.tool_output("- Break your code into smaller files") # Special warning for Ollama models about context window size if self.main_model.name.startswith(("ollama/", "ollama_chat/")): From cb6b8ea5ac2d97796943a17de5eed6872eb991d9 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Sun, 26 Jan 2025 18:53:31 -0800 Subject: [PATCH 150/229] refactor: Improve token limit error messages and fix typo in warning method --- aider/coders/base_coder.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/aider/coders/base_coder.py b/aider/coders/base_coder.py index 1543ad8da..9d7a5c8e4 100755 --- a/aider/coders/base_coder.py +++ b/aider/coders/base_coder.py @@ -1237,10 +1237,10 @@ class Coder: if max_input_tokens and input_tokens >= max_input_tokens: self.io.tool_error( - f"\nInput tokens ({input_tokens:,}) exceeds model's" + f"\nYour current chat context {input_tokens:,} exceeds the model's" f" {max_input_tokens:,} token limit!" ) - self.io.tool_output("Try:") + self.io.tool_output("To reduce the chat context:") self.io.tool_output("- Use /drop to remove unneeded files from the chat") self.io.tool_output("- Use /clear to clear the chat history") self.io.tool_output("- Break your code into smaller files") @@ -1250,7 +1250,7 @@ class Coder: extra_params = getattr(self.main_model, "extra_params", None) or {} num_ctx = extra_params.get("num_ctx") if num_ctx: - self.io.tool_error( + self.io.tool_waning( f"\nNote: Your Ollama model is configured with num_ctx={num_ctx}. See" " https://aider.chat/docs/llms/ollama.html#setting-the-context-window-size" " for help configuring larger context windows." From 1eb24981c60f3b819118561895aadcd81c2fcfa4 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Sun, 26 Jan 2025 18:58:43 -0800 Subject: [PATCH 151/229] copy --- aider/coders/base_coder.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/aider/coders/base_coder.py b/aider/coders/base_coder.py index 9d7a5c8e4..849f504b0 100755 --- a/aider/coders/base_coder.py +++ b/aider/coders/base_coder.py @@ -1251,7 +1251,8 @@ class Coder: num_ctx = extra_params.get("num_ctx") if num_ctx: self.io.tool_waning( - f"\nNote: Your Ollama model is configured with num_ctx={num_ctx}. See" + f"\nYour Ollama model is configured with num_ctx={num_ctx} tokens of" + " context window\nSee" " https://aider.chat/docs/llms/ollama.html#setting-the-context-window-size" " for help configuring larger context windows." ) From 1dcc5ca9f324e15ea69288432b79bcf4d7a45192 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Sun, 26 Jan 2025 19:01:07 -0800 Subject: [PATCH 152/229] proceed unless ollama --- aider/coders/base_coder.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/aider/coders/base_coder.py b/aider/coders/base_coder.py index 849f504b0..6a16d0e23 100755 --- a/aider/coders/base_coder.py +++ b/aider/coders/base_coder.py @@ -1237,13 +1237,14 @@ class Coder: if max_input_tokens and input_tokens >= max_input_tokens: self.io.tool_error( - f"\nYour current chat context {input_tokens:,} exceeds the model's" + f"Your current chat context {input_tokens:,} exceeds the model's" f" {max_input_tokens:,} token limit!" ) self.io.tool_output("To reduce the chat context:") self.io.tool_output("- Use /drop to remove unneeded files from the chat") self.io.tool_output("- Use /clear to clear the chat history") self.io.tool_output("- Break your code into smaller files") + proceed = "y" # Special warning for Ollama models about context window size if self.main_model.name.startswith(("ollama/", "ollama_chat/")): @@ -1251,13 +1252,14 @@ class Coder: num_ctx = extra_params.get("num_ctx") if num_ctx: self.io.tool_waning( - f"\nYour Ollama model is configured with num_ctx={num_ctx} tokens of" + f"Your Ollama model is configured with num_ctx={num_ctx} tokens of" " context window\nSee" " https://aider.chat/docs/llms/ollama.html#setting-the-context-window-size" " for help configuring larger context windows." ) + proceed = "n" - if not self.io.confirm_ask("Try to proceed anyway?", default="n"): + if not self.io.confirm_ask("Try to proceed anyway?", default=proceed): return False return True From 5d30c71ccf9268ef61265fb399ad0b12b332c94a Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Sun, 26 Jan 2025 19:02:55 -0800 Subject: [PATCH 153/229] copy --- aider/coders/base_coder.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/aider/coders/base_coder.py b/aider/coders/base_coder.py index 6a16d0e23..8648aa2fb 100755 --- a/aider/coders/base_coder.py +++ b/aider/coders/base_coder.py @@ -1237,8 +1237,8 @@ class Coder: if max_input_tokens and input_tokens >= max_input_tokens: self.io.tool_error( - f"Your current chat context {input_tokens:,} exceeds the model's" - f" {max_input_tokens:,} token limit!" + f"Your current chat context {input_tokens:,} exceeds the" + f" {max_input_tokens:,} token limit for {self.main_model.name}!" ) self.io.tool_output("To reduce the chat context:") self.io.tool_output("- Use /drop to remove unneeded files from the chat") From 980197cb05eee3a660e684297fc5735b175d9c9b Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Sun, 26 Jan 2025 19:05:52 -0800 Subject: [PATCH 154/229] copy --- aider/coders/base_coder.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/aider/coders/base_coder.py b/aider/coders/base_coder.py index 8648aa2fb..dae973908 100755 --- a/aider/coders/base_coder.py +++ b/aider/coders/base_coder.py @@ -1237,14 +1237,13 @@ class Coder: if max_input_tokens and input_tokens >= max_input_tokens: self.io.tool_error( - f"Your current chat context {input_tokens:,} exceeds the" + f"Your estimated chat context of {input_tokens:,} tokens exceeds the" f" {max_input_tokens:,} token limit for {self.main_model.name}!" ) self.io.tool_output("To reduce the chat context:") self.io.tool_output("- Use /drop to remove unneeded files from the chat") self.io.tool_output("- Use /clear to clear the chat history") self.io.tool_output("- Break your code into smaller files") - proceed = "y" # Special warning for Ollama models about context window size if self.main_model.name.startswith(("ollama/", "ollama_chat/")): @@ -1258,6 +1257,12 @@ class Coder: " for help configuring larger context windows." ) proceed = "n" + else: + proceed = "y" + self.io.tool_output( + "It's probably safe to try and send the request, most providers won't charge if" + " the context limit is exceeded." + ) if not self.io.confirm_ask("Try to proceed anyway?", default=proceed): return False From 3dec9e531f8974ef64e6cfff630af37be53423d6 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Sun, 26 Jan 2025 19:09:27 -0800 Subject: [PATCH 155/229] refactor: improve context window size handling for Ollama models --- aider/coders/base_coder.py | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/aider/coders/base_coder.py b/aider/coders/base_coder.py index dae973908..3556c4f2c 100755 --- a/aider/coders/base_coder.py +++ b/aider/coders/base_coder.py @@ -1235,6 +1235,8 @@ class Coder: input_tokens = self.main_model.token_count(messages) max_input_tokens = self.main_model.info.get("max_input_tokens") or 0 + proceed = None + if max_input_tokens and input_tokens >= max_input_tokens: self.io.tool_error( f"Your estimated chat context of {input_tokens:,} tokens exceeds the" @@ -1244,28 +1246,26 @@ class Coder: self.io.tool_output("- Use /drop to remove unneeded files from the chat") self.io.tool_output("- Use /clear to clear the chat history") self.io.tool_output("- Break your code into smaller files") + proceed = "y" + self.io.tool_output( + "It's probably safe to try and send the request, most providers won't charge if" + " the context limit is exceeded." + ) - # Special warning for Ollama models about context window size - if self.main_model.name.startswith(("ollama/", "ollama_chat/")): - extra_params = getattr(self.main_model, "extra_params", None) or {} - num_ctx = extra_params.get("num_ctx") - if num_ctx: - self.io.tool_waning( - f"Your Ollama model is configured with num_ctx={num_ctx} tokens of" - " context window\nSee" - " https://aider.chat/docs/llms/ollama.html#setting-the-context-window-size" - " for help configuring larger context windows." - ) - proceed = "n" - else: - proceed = "y" - self.io.tool_output( - "It's probably safe to try and send the request, most providers won't charge if" - " the context limit is exceeded." + # Special warning for Ollama models about context window size + if self.main_model.name.startswith(("ollama/", "ollama_chat/")): + extra_params = getattr(self.main_model, "extra_params", None) or {} + num_ctx = extra_params.get("num_ctx", 8192) + if max_input_tokens and max_input_tokens > num_ctx: + self.io.tool_waning( + f"Your Ollama model is configured with num_ctx={num_ctx} tokens of" + " context window\nSee" + " https://aider.chat/docs/llms/ollama.html#setting-the-context-window-size" + " for help configuring larger context windows." ) - if not self.io.confirm_ask("Try to proceed anyway?", default=proceed): - return False + if proceed and not self.io.confirm_ask("Try to proceed anyway?", default=proceed): + return False return True def send_message(self, inp): From 674dcba53c199c27b01b5bae7791a77be7a13a33 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Mon, 27 Jan 2025 09:29:49 -0800 Subject: [PATCH 156/229] copy --- README.md | 7 +- aider/website/_includes/get-started.md | 7 +- aider/website/assets/sample-analytics.jsonl | 250 ++++++++++---------- aider/website/docs/faq.md | 15 +- aider/website/index.md | 7 +- 5 files changed, 147 insertions(+), 139 deletions(-) diff --git a/README.md b/README.md index ed3e62673..675dd3468 100644 --- a/README.md +++ b/README.md @@ -52,11 +52,14 @@ aider-install # Change directory into your code base cd /to/your/project +# Work with DeepSeek on your code +aider --model deepseek --api-key deepseek=your-key-goes-here + # Work with Claude 3.5 Sonnet on your code -aider --model sonnet --anthropic-api-key your-key-goes-here +aider --model sonnet --api-key anthropic=your-key-goes-here # Work with GPT-4o on your code -aider --model gpt-4o --openai-api-key your-key-goes-here +aider --model gpt-4o --api-key openai=your-key-goes-here ``` diff --git a/aider/website/_includes/get-started.md b/aider/website/_includes/get-started.md index 425110d28..fe2ccd29a 100644 --- a/aider/website/_includes/get-started.md +++ b/aider/website/_includes/get-started.md @@ -8,9 +8,12 @@ aider-install # Change directory into your code base cd /to/your/project +# Work with DeepSeek on your code +aider --model deepseek --api-key deepseek=your-key-goes-here + # Work with Claude 3.5 Sonnet on your code -aider --model sonnet --anthropic-api-key your-key-goes-here +aider --model sonnet --api-key anthropic=your-key-goes-here # Work with GPT-4o on your code -aider --model gpt-4o --openai-api-key your-key-goes-here +aider --model gpt-4o --api-key openai=your-key-goes-here ``` diff --git a/aider/website/assets/sample-analytics.jsonl b/aider/website/assets/sample-analytics.jsonl index 660d63a1c..6d44fd631 100644 --- a/aider/website/assets/sample-analytics.jsonl +++ b/aider/website/assets/sample-analytics.jsonl @@ -1,128 +1,3 @@ -{"event": "command_run", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736639019} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736639022} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 23367, "completion_tokens": 199, "total_tokens": 23566, "cost": 0.0033270999999980406, "total_cost": 0.025958099999982363}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736639031} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736639042} -{"event": "command_run", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736639045} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736639048} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 19889, "completion_tokens": 271, "total_tokens": 20160, "cost": 0.0028603399999980405, "total_cost": 0.028818439999980402}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736639059} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736639070} -{"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736639072} -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736639072} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736639074} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 9977, "completion_tokens": 36, "total_tokens": 10013, "cost": 0.00140685999999804, "total_cost": 0.00140685999999804}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736639079} -{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736639089} -{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736639089} -{"event": "command_clear", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736639149} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736639174} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 15450, "completion_tokens": 518, "total_tokens": 15968, "cost": 0.00230803999999804, "total_cost": 0.031126479999978442}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736639187} -{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736639200} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736639200} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "ask", "prompt_tokens": 13931, "completion_tokens": 333, "total_tokens": 14264, "cost": 0.00204357999999804, "total_cost": 0.033170059999976485}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736639210} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736639271} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 16501, "completion_tokens": 471, "total_tokens": 16972, "cost": 0.0024420199999980402, "total_cost": 0.035612079999974525}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736639284} -{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736639292} -{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736639292} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736639357} -{"event": "gui session", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736639358} -{"event": "exit", "properties": {"reason": "GUI session ended"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736639358} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736639363} -{"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736639365} -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736639365} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736639375} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 15096, "completion_tokens": 103, "total_tokens": 15199, "cost": 0.00214227999999804, "total_cost": 0.00214227999999804}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736639381} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736639387} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 14360, "completion_tokens": 301, "total_tokens": 14661, "cost": 0.00209467999999804, "total_cost": 0.00423695999999608}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736639396} -{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736639424} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736639424} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "ask", "prompt_tokens": 12364, "completion_tokens": 238, "total_tokens": 12602, "cost": 0.00179759999999804, "total_cost": 0.006034559999994121}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736639433} -{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736639471} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736639471} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "ask", "prompt_tokens": 12621, "completion_tokens": 334, "total_tokens": 12955, "cost": 0.00186045999999804, "total_cost": 0.00789501999999216}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736639481} -{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736639497} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736639497} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "ask", "prompt_tokens": 13008, "completion_tokens": 347, "total_tokens": 13355, "cost": 0.00191827999999804, "total_cost": 0.0098132999999902}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736639507} -{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736639526} -{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736639526} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736639588} -{"event": "gui session", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736639588} -{"event": "exit", "properties": {"reason": "GUI session ended"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736639588} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736639781} -{"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736639783} -{"event": "cli session", "properties": {"main_model": "huggingface/REDACTED", "weak_model": "huggingface/REDACTED", "editor_model": "huggingface/REDACTED", "edit_format": "whole"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736639783} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736639784} -{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736639792} -{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736639792} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736640202} -{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736640204} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736640204} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 4692, "completion_tokens": 202, "total_tokens": 4894, "cost": 0.0007134399999980401, "total_cost": 0.0007134399999980401}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736640209} -{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736640209} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736640352} -{"event": "gui session", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736640352} -{"event": "exit", "properties": {"reason": "GUI session ended"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736640352} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736640454} -{"event": "gui session", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736640455} -{"event": "exit", "properties": {"reason": "GUI session ended"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736640455} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736787629} -{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736787631} -{"event": "cli session", "properties": {"main_model": "o1", "weak_model": "gpt-4o-mini", "editor_model": "gpt-4o", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736787631} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736787631} -{"event": "message_send", "properties": {"main_model": "o1", "weak_model": "gpt-4o-mini", "editor_model": "gpt-4o", "edit_format": "diff", "prompt_tokens": 2366, "completion_tokens": 212, "total_tokens": 2578, "cost": 0.04821, "total_cost": 0.04821}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736787636} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736787696} -{"event": "gui session", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736787697} -{"event": "exit", "properties": {"reason": "GUI session ended"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736787697} -{"event": "command_run", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736788221} -{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736788278} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736788436} -{"event": "gui session", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736788436} -{"event": "exit", "properties": {"reason": "GUI session ended"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736788436} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736788785} -{"event": "exit", "properties": {"reason": "Listed models"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736788787} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736788803} -{"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736788804} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736788805} -{"event": "message_send", "properties": {"main_model": "mistral/codestral-latest", "weak_model": "mistral/codestral-latest", "editor_model": "mistral/codestral-latest", "edit_format": "whole", "prompt_tokens": 8094, "completion_tokens": 43, "total_tokens": 8137, "cost": 0.008223000000000001, "total_cost": 0.008223000000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736788807} -{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736788807} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736789235} -{"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736789237} -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736789237} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736789251} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 18807, "completion_tokens": 478, "total_tokens": 19285, "cost": 0.0027668199999980403, "total_cost": 0.0027668199999980403}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736789270} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736789276} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 19375, "completion_tokens": 162, "total_tokens": 19537, "cost": 0.00275785999999804, "total_cost": 0.00552467999999608}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736789285} -{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736789291} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736789294} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 22233, "completion_tokens": 723, "total_tokens": 22956, "cost": 0.00331505999999804, "total_cost": 0.00883973999999412}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736789319} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736789595} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 23444, "completion_tokens": 232, "total_tokens": 23676, "cost": 0.0033471199999980405, "total_cost": 0.01218685999999216}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736789608} -{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736789640} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736789682} -{"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736789684} -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736789684} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736789686} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 18927, "completion_tokens": 241, "total_tokens": 19168, "cost": 0.00271725999999804, "total_cost": 0.00271725999999804}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736789699} -{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736789766} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736789768} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 21935, "completion_tokens": 374, "total_tokens": 22309, "cost": 0.0031756199999980403, "total_cost": 0.005892879999996081}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736789784} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736789879} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 24221, "completion_tokens": 208, "total_tokens": 24429, "cost": 0.0034491799999980407, "total_cost": 0.009342059999994122}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736789890} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736789900} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 26206, "completion_tokens": 251, "total_tokens": 26457, "cost": 0.00373911999999804, "total_cost": 0.013081179999992162}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736789914} -{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736789923} -{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736789923} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736792377} -{"event": "gui session", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736792378} -{"event": "exit", "properties": {"reason": "GUI session ended"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736792378} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736795974} -{"event": "gui session", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736795974} -{"event": "exit", "properties": {"reason": "GUI session ended"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736795974} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736796089} -{"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736796091} -{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736796094} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736797223} -{"event": "gui session", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736797224} -{"event": "exit", "properties": {"reason": "GUI session ended"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736797224} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736807243} {"event": "gui session", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736807243} {"event": "exit", "properties": {"reason": "GUI session ended"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736807243} {"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736812065} @@ -998,3 +873,128 @@ {"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737823580} {"event": "repo", "properties": {"num_files": 430}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737823582} {"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737823588} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737823682} +{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-reasoner", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 17526, "completion_tokens": 82, "total_tokens": 17608, "cost": 0.00981888, "total_cost": 0.08576162}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737823695} +{"event": "command_undo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737823700} +{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737823704} +{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737823704} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737945667} +{"event": "repo", "properties": {"num_files": 430}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737945670} +{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737945670} +{"event": "command_architect", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737945672} +{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737945675} +{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737945676} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737945697} +{"event": "command_model", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737945712} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737945713} +{"event": "message_send_exception", "properties": {"exception": "Messages don't properly alternate user/assistant:\n\n-------\nSYSTEM Act as an expert code analyst.\nSYSTEM Answer questions about the supplied code.\nSYSTEM Always reply to the user in the same language they are using.\nSYSTEM \nSYSTEM Describe code changes however you like. Don't use SEARCH/REPLACE blocks!\n-------\nUSER I am working with you on code in a git repository.\nUSER Here are summaries of some files present in my git repo.\nUSER If you need to see the full contents of any files to answer my questions, ask me to *add them to the chat*.\nUSER \nUSER aider/analytics.py:\nUSER \u22ee...\nUSER \u2502class Analytics:\nUSER \u2502 # providers\nUSER \u2502 mp = None\nUSER \u22ee...\nUSER \u2502 def event(self, event_name, main_model=None, **kwargs):\nUSER \u22ee...\nUSER \nUSER aider/args.py:\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER aider/coders/base_prompts.py:\nUSER \u2502class CoderPrompts:\nUSER \u22ee...\nUSER \nUSER aider/coders/chat_chunks.py:\nUSER \u22ee...\nUSER \u2502@dataclass\nUSER \u2502class ChatChunks:\nUSER \u2502 system: List = field(default_factory=list)\nUSER \u22ee...\nUSER \u2502 def all_messages(self):\nUSER \u22ee...\nUSER \u2502 def add_cache_control(self, messages):\nUSER \u22ee...\nUSER \nUSER aider/coders/editblock_coder.py:\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER aider/coders/help_prompts.py:\nUSER \u22ee...\nUSER \u2502class HelpPrompts(CoderPrompts):\nUSER \u22ee...\nUSER \nUSER aider/coders/search_replace.py:\nUSER \u22ee...\nUSER \u2502def read_text(fname):\nUSER \u22ee...\nUSER \u2502def main(dnames):\nUSER \u22ee...\nUSER \nUSER aider/coders/udiff_coder.py:\nUSER \u22ee...\nUSER \u2502class UnifiedDiffCoder(Coder):\nUSER \u2502 \"\"\"A coder that uses unified diff format for code modifications.\"\"\"\nUSER \u22ee...\nUSER \u2502 def get_edits(self):\nUSER \u22ee...\nUSER \nUSER aider/coders/wholefile_coder.py:\nUSER \u22ee...\nUSER \u2502class WholeFileCoder(Coder):\nUSER \u2502 \"\"\"A coder that operates on entire files for code modifications.\"\"\"\nUSER \u2502\nUSER \u22ee...\nUSER \u2502 def render_incremental_response(self, final):\nUSER \u22ee...\nUSER \u2502 def get_edits(self, mode=\"update\"):\nUSER \u22ee...\nUSER \nUSER aider/commands.py:\nUSER \u22ee...\nUSER \u2502class Commands:\nUSER \u2502 voice = None\nUSER \u22ee...\nUSER \u2502 def get_raw_completions(self, cmd):\nUSER \u22ee...\nUSER \u2502 def get_completions(self, cmd):\nUSER \u22ee...\nUSER \u2502 def get_commands(self):\nUSER \u22ee...\nUSER \u2502 def matching_commands(self, inp):\nUSER \u22ee...\nUSER \u2502 def run(self, inp):\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER aider/copypaste.py:\nUSER \u22ee...\nUSER \u2502class ClipboardWatcher:\nUSER \u2502 \"\"\"Watches clipboard for changes and updates IO placeholder\"\"\"\nUSER \u2502\nUSER \u22ee...\nUSER \u2502 def start(self):\nUSER \u22ee...\nUSER \u2502 def stop(self):\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER aider/diffs.py:\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER aider/dump.py:\nUSER \u22ee...\nUSER \u2502def cvt(s):\nUSER \u22ee...\nUSER \u2502def dump(*vals):\nUSER \u22ee...\nUSER \nUSER aider/exceptions.py:\nUSER \u22ee...\nUSER \u2502@dataclass\nUSER \u2502class ExInfo:\nUSER \u22ee...\nUSER \u2502class LiteLLMExceptions:\nUSER \u2502 exceptions = dict()\nUSER \u2502\nUSER \u22ee...\nUSER \u2502 def exceptions_tuple(self):\nUSER \u22ee...\nUSER \u2502 def get_ex_info(self, ex):\nUSER \u22ee...\nUSER \nUSER aider/gui.py:\nUSER \u22ee...\nUSER \u2502class CaptureIO(InputOutput):\nUSER \u2502 lines = []\nUSER \u2502\nUSER \u2502 def tool_output(self, msg, log_only=False):\nUSER \u22ee...\nUSER \u2502 def tool_error(self, msg):\nUSER \u22ee...\nUSER \u2502 def tool_warning(self, msg):\nUSER \u22ee...\nUSER \u2502 def get_captured_lines(self):\nUSER \u22ee...\nUSER \u2502class State:\nUSER \u2502 keys = set()\nUSER \u2502\nUSER \u2502 def init(self, key, val=None):\nUSER \u22ee...\nUSER \u2502class GUI:\nUSER \u2502 prompt = None\nUSER \u22ee...\nUSER \u2502 def show_edit_info(self, edit):\nUSER \u22ee...\nUSER \u2502 def add_undo(self, commit_hash):\nUSER \u22ee...\nUSER \u2502 def button(self, args, **kwargs):\nUSER \u22ee...\nUSER \u2502 def prompt_pending(self):\nUSER \u22ee...\nUSER \u2502 def info(self, message, echo=True):\nUSER \u22ee...\nUSER \nUSER aider/history.py:\nUSER \u22ee...\nUSER \u2502class ChatSummary:\nUSER \u2502 def __init__(self, models=None, max_tokens=1024):\nUSER \u2502 if not models:\nUSER \u2502 raise ValueError(\"At least one model must be provided\")\nUSER \u2502 self.models = models if isinstance(models, list) else [models]\nUSER \u2502 self.max_tokens = max_tokens\nUSER \u22ee...\nUSER \u2502 def tokenize(self, messages):\nUSER \u22ee...\nUSER \u2502 def summarize_all(self, messages):\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER aider/io.py:\nUSER \u22ee...\nUSER \u2502@dataclass\nUSER \u2502class ConfirmGroup:\nUSER \u22ee...\nUSER \u2502class AutoCompleter(Completer):\nUSER \u2502 def __init__(\nUSER \u2502 self, root, rel_fnames, addable_rel_fnames, commands, encoding, abs_read_only_fnames=None\nUSER \u22ee...\nUSER \u2502 def tokenize(self):\nUSER \u22ee...\nUSER \u2502 def get_command_completions(self, document, complete_event, text, words):\nUSER \u22ee...\nUSER \u2502 def get_completions(self, document, complete_event):\nUSER \u22ee...\nUSER \u2502class InputOutput:\nUSER \u2502 num_error_outputs = 0\nUSER \u22ee...\nUSER \u2502 def read_image(self, filename):\nUSER \u22ee...\nUSER \u2502 def read_text(self, filename, silent=False):\nUSER \u22ee...\nUSER \u2502 def write_text(self, filename, content, max_retries=5, initial_delay=0.1):\nUSER \u22ee...\nUSER \u2502 def rule(self):\nUSER \u22ee...\nUSER \u2502 def get_input(\nUSER \u2502 self,\nUSER \u2502 root,\nUSER \u2502 rel_fnames,\nUSER \u2502 addable_rel_fnames,\nUSER \u2502 commands,\nUSER \u2502 abs_read_only_fnames=None,\nUSER \u2502 edit_format=None,\nUSER \u2502 ):\nUSER \u2502 self.rule()\nUSER \u2502\nUSER \u22ee...\nUSER \u2502 def suspend_to_bg(event):\nUSER \u22ee...\nUSER \u2502 def add_to_input_history(self, inp):\nUSER \u22ee...\nUSER \u2502 def log_llm_history(self, role, content):\nUSER \u22ee...\nUSER \u2502 def display_user_input(self, inp):\nUSER \u22ee...\nUSER \u2502 def user_input(self, inp, log_only=True):\nUSER \u22ee...\nUSER \u2502 def ai_output(self, content):\nUSER \u22ee...\nUSER \u2502 def offer_url(self, url, prompt=\"Open URL for more info?\", allow_never=True):\nUSER \u22ee...\nUSER \u2502 def confirm_ask(\nUSER \u2502 self,\nUSER \u2502 question,\nUSER \u2502 default=\"y\",\nUSER \u2502 subject=None,\nUSER \u2502 explicit_yes_required=False,\nUSER \u2502 group=None,\nUSER \u2502 allow_never=False,\nUSER \u22ee...\nUSER \u2502 def tool_error(self, message=\"\", strip=True):\nUSER \u22ee...\nUSER \u2502 def tool_warning(self, message=\"\", strip=True):\nUSER \u22ee...\nUSER \u2502 def tool_output(self, *messages, log_only=False, bold=False):\nUSER \u22ee...\nUSER \u2502 def print(self, message=\"\"):\nUSER \u22ee...\nUSER \u2502 def append_chat_history(self, text, linebreak=False, blockquote=False, strip=True):\nUSER \u22ee...\nUSER \u2502 def format_files_for_input(self, rel_fnames, rel_read_only_fnames):\nUSER \u22ee...\nUSER \u2502def get_rel_fname(fname, root):\nUSER \u22ee...\nUSER \nUSER aider/linter.py:\nUSER \u22ee...\nUSER \u2502class Linter:\nUSER \u2502 def __init__(self, encoding=\"utf-8\", root=None):\nUSER \u2502 self.encoding = encoding\nUSER \u2502 self.root = root\nUSER \u2502\nUSER \u2502 self.languages = dict(\nUSER \u2502 python=self.py_lint,\nUSER \u2502 )\nUSER \u22ee...\nUSER \u2502 def get_rel_fname(self, fname):\nUSER \u22ee...\nUSER \u2502 def run_cmd(self, cmd, rel_fname, code):\nUSER \u22ee...\nUSER \u2502 def lint(self, fname, cmd=None):\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER aider/main.py:\nUSER \u22ee...\nUSER \u2502def main(argv=None, input=None, output=None, force_git_root=None, return_coder=False):\nUSER \u22ee...\nUSER \nUSER aider/mdstream.py:\nUSER \u22ee...\nUSER \u2502class MarkdownStream:\nUSER \u2502 \"\"\"Streaming markdown renderer that progressively displays content with a live updating window.\nUSER \u2502\nUSER \u2502 Uses rich.console and rich.live to render markdown content with smooth scrolling\nUSER \u2502 and partial updates. Maintains a sliding window of visible content while streaming\nUSER \u2502 in new markdown text.\nUSER \u22ee...\nUSER \u2502 def update(self, text, final=False):\nUSER \u22ee...\nUSER \nUSER aider/models.py:\nUSER \u22ee...\nUSER \u2502@dataclass\nUSER \u2502class ModelSettings:\nUSER \u22ee...\nUSER \u2502class Model(ModelSettings):\nUSER \u2502 def __init__(self, model, weak_model=None, editor_model=None, editor_edit_format=None):\nUSER \u2502 # Map any alias to its canonical name\nUSER \u2502 model = MODEL_ALIASES.get(model, model)\nUSER \u2502\nUSER \u2502 self.name = model\nUSER \u2502\nUSER \u2502 self.max_chat_history_tokens = 1024\nUSER \u2502 self.weak_model = None\nUSER \u2502 self.editor_model = None\nUSER \u2502\nUSER \u22ee...\nUSER \u2502 def token_count(self, messages):\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER aider/repo.py:\nUSER \u22ee...\nUSER \u2502class GitRepo:\nUSER \u2502 repo = None\nUSER \u22ee...\nUSER \u2502 def commit(self, fnames=None, context=None, message=None, aider_edits=False):\nUSER \u22ee...\nUSER \u2502 def diff_commits(self, pretty, from_commit, to_commit):\nUSER \u22ee...\nUSER \u2502 def get_tracked_files(self):\nUSER \u22ee...\nUSER \u2502 def normalize_path(self, path):\nUSER \u22ee...\nUSER \u2502 def git_ignored_file(self, path):\nUSER \u22ee...\nUSER \u2502 def ignored_file(self, fname):\nUSER \u22ee...\nUSER \u2502 def path_in_repo(self, path):\nUSER \u22ee...\nUSER \u2502 def abs_root_path(self, path):\nUSER \u22ee...\nUSER \u2502 def is_dirty(self, path=None):\nUSER \u22ee...\nUSER \u2502 def get_head_commit_sha(self, short=False):\nUSER \u22ee...\nUSER \nUSER aider/repomap.py:\nUSER \u22ee...\nUSER \u2502class RepoMap:\nUSER \u2502 CACHE_VERSION = 3\nUSER \u22ee...\nUSER \u2502 def token_count(self, text):\nUSER \u22ee...\nUSER \u2502 def get_repo_map(\nUSER \u2502 self,\nUSER \u2502 chat_files,\nUSER \u2502 other_files,\nUSER \u2502 mentioned_fnames=None,\nUSER \u2502 mentioned_idents=None,\nUSER \u2502 force_refresh=False,\nUSER \u22ee...\nUSER \u2502 def get_rel_fname(self, fname):\nUSER \u22ee...\nUSER \nUSER aider/report.py:\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER aider/run_cmd.py:\nUSER \u22ee...\nUSER \u2502def run_cmd(command, verbose=False, error_print=None, cwd=None):\nUSER \u22ee...\nUSER \nUSER aider/scrape.py:\nUSER \u22ee...\nUSER \u2502class Scraper:\nUSER \u2502 pandoc_available = None\nUSER \u22ee...\nUSER \u2502 def scrape(self, url):\nUSER \u22ee...\nUSER \u2502def main(url):\nUSER \u22ee...\nUSER \nUSER aider/sendchat.py:\nUSER \u22ee...\nUSER \u2502def send_completion(\nUSER \u2502 model_name,\nUSER \u2502 messages,\nUSER \u2502 functions,\nUSER \u2502 stream,\nUSER \u2502 temperature=0,\nUSER \u2502 extra_params=None,\nUSER \u22ee...\nUSER \nUSER aider/utils.py:\nUSER \u22ee...\nUSER \u2502def is_image_file(file_name):\nUSER \u22ee...\nUSER \u2502def safe_abs_path(res):\nUSER \u22ee...\nUSER \u2502def format_content(role, content):\nUSER \u22ee...\nUSER \u2502def format_messages(messages, title=None):\nUSER \u22ee...\nUSER \u2502def format_tokens(count):\nUSER \u22ee...\nUSER \u2502def touch_file(fname):\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER aider/watch.py:\nUSER \u22ee...\nUSER \u2502class FileWatcher:\nUSER \u2502 \"\"\"Watches source files for changes and AI comments\"\"\"\nUSER \u2502\nUSER \u22ee...\nUSER \u2502 def start(self):\nUSER \u22ee...\nUSER \u2502 def stop(self):\nUSER \u22ee...\nUSER \u2502 def process_changes(self):\nUSER \u22ee...\nUSER \u2502 def get_ai_comments(self, filepath):\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER benchmark/benchmark.py:\nUSER \u22ee...\nUSER \u2502@app.command()\nUSER \u2502def main(\nUSER \u2502 dirnames: Optional[List[str]] = typer.Argument(None, help=\"Directory names\"),\nUSER \u2502 graphs: bool = typer.Option(False, \"--graphs\", help=\"Generate graphs\"),\nUSER \u2502 model: str = typer.Option(\"gpt-3.5-turbo\", \"--model\", \"-m\", help=\"Model name\"),\nUSER \u2502 sleep: float = typer.Option(\nUSER \u2502 0, \"--sleep\", help=\"Sleep seconds between tests when single threaded\"\nUSER \u2502 ),\nUSER \u2502 languages: str = typer.Option(\nUSER \u2502 None, \"--languages\", \"-l\", help=\"Only run tests for specific languages (comma separated)\"\nUSER \u2502 ),\nUSER \u22ee...\nUSER \nUSER benchmark/over_time.py:\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER benchmark/refactor_tools.py:\nUSER \u22ee...\nUSER \u2502def main(paths):\nUSER \u22ee...\nUSER \nUSER benchmark/rungrid.py:\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \u2502def run(dirname, model, edit_format):\nUSER \u22ee...\nUSER \nUSER scripts/blame.py:\nUSER \u22ee...\nUSER \u2502def run(cmd):\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER scripts/issues.py:\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER scripts/update-history.py:\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER scripts/versionbump.py:\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER scripts/yank-old-versions.py:\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER tests/basic/test_watch.py:\nUSER \u22ee...\nUSER \u2502def test_ai_comment_pattern():\nUSER \u2502 # Create minimal IO and Coder instances for testing\nUSER \u2502 class MinimalCoder:\nUSER \u2502 def __init__(self, io):\nUSER \u2502 self.io = io\nUSER \u2502 self.root = \".\"\nUSER \u2502 self.abs_fnames = set()\nUSER \u2502\nUSER \u2502 def get_rel_fname(self, fname):\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/c/test.c:\nUSER \u22ee...\nUSER \u2502int main() {\nUSER \u2502 printf(\"Hello, World!\\n\");\nUSER \u2502 return 0;\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/cpp/test.cpp:\nUSER \u22ee...\nUSER \u2502int main() {\nUSER \u2502 std::cout << \"Hello, World!\" << std::endl;\nUSER \u2502 return 0;\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/csharp/test.cs:\nUSER \u22ee...\nUSER \u2502namespace Greetings {\nUSER \u2502 public interface IGreeter {\nUSER \u2502 string Greet(string name);\nUSER \u2502 }\nUSER \u2502\nUSER \u2502 public class Person {\nUSER \u2502 public string Name { get; set; }\nUSER \u2502 public int Age { get; set; }\nUSER \u2502\nUSER \u2502 public Person(string name, int age) {\nUSER \u2502 Name = name;\nUSER \u2502 Age = age;\nUSER \u2502 }\nUSER \u22ee...\nUSER \u2502 public class FormalGreeter : IGreeter {\nUSER \u2502 private const string PREFIX = \"Good day\";\nUSER \u2502 private static readonly int MAX_AGE = 150;\nUSER \u2502\nUSER \u2502 public string Greet(string name) {\nUSER \u2502 return $\"{PREFIX}, {name}!\";\nUSER \u2502 }\nUSER \u2502\nUSER \u2502 public string GreetPerson(Person person) {\nUSER \u2502 return $\"{PREFIX}, {person.Name} ({person.Age})!\";\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/elisp/test.el:\nUSER \u22ee...\nUSER \u2502(defun main ()\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/elixir/test.ex:\nUSER \u2502defmodule Greeter do\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/elm/test.elm:\nUSER \u22ee...\nUSER \u2502type Greeting\nUSER \u22ee...\nUSER \u2502greet style person =\nUSER \u22ee...\nUSER \u2502main =\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/go/test.go:\nUSER \u22ee...\nUSER \u2502type Person struct {\nUSER \u2502 Name string\nUSER \u2502 Age int\nUSER \u22ee...\nUSER \u2502type Greeter interface {\nUSER \u2502 Greet(p Person) string\nUSER \u22ee...\nUSER \u2502type FormalGreeter struct {\nUSER \u2502 Prefix string\nUSER \u22ee...\nUSER \u2502}\nUSER \u2502\nUSER \u2502func main() {\nUSER \u2502 greeter := NewFormalGreeter()\nUSER \u2502 person := Person{Name: DefaultName, Age: 42}\nUSER \u2502 fmt.Println(greeter.Greet(person))\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/java/test.java:\nUSER \u2502public interface Greeting {\nUSER \u2502 String greet(String name);\nUSER \u22ee...\nUSER \u2502public class Test implements Greeting {\nUSER \u2502 private String prefix = \"Hello\";\nUSER \u2502\nUSER \u2502 public String greet(String name) {\nUSER \u2502 return prefix + \", \" + name + \"!\";\nUSER \u2502 }\nUSER \u2502\nUSER \u2502 public static void main(String[] args) {\nUSER \u2502 Test greeter = new Test();\nUSER \u2502 System.out.println(greeter.greet(\"World\"));\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/javascript/test.js:\nUSER \u22ee...\nUSER \u2502class Person {\nUSER \u2502 constructor(name) {\nUSER \u2502 this.name = name;\nUSER \u2502 }\nUSER \u2502\nUSER \u2502 sayHello() {\nUSER \u2502 return `Hello, ${this.name}!`;\nUSER \u2502 }\nUSER \u22ee...\nUSER \u2502function greet(person) {\nUSER \u2502 return person.sayHello();\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/kotlin/test.kt:\nUSER \u2502interface Greeting {\nUSER \u2502 fun greet(name: String): String\nUSER \u22ee...\nUSER \u2502class Test : Greeting {\nUSER \u2502 private val prefix = \"Hello\"\nUSER \u2502\nUSER \u2502 override fun greet(name: String): String {\nUSER \u2502 return \"$prefix, $name!\"\nUSER \u2502 }\nUSER \u22ee...\nUSER \u2502fun main(args: Array) {\nUSER \u2502 val greeter = Test()\nUSER \u2502 println(greeter.greet(\"World\"))\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/ocaml/test.ml:\nUSER \u22ee...\nUSER \u2502module Greeter = struct\nUSER \u2502 type person = {\nUSER \u2502 name: string;\nUSER \u2502 age: int\nUSER \u2502 }\nUSER \u2502\nUSER \u2502 let create_person name age =\nUSER \u2502 {name; age}\nUSER \u2502\nUSER \u2502 let greet person =\nUSER \u2502 Printf.printf \"Hello, %s! You are %d years old.\\n\"\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/php/test.php:\nUSER \u22ee...\nUSER \u2502function greet($name) {\nUSER \u2502 echo \"Hello, $name!\";\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/python/test.py:\nUSER \u22ee...\nUSER \u2502class Person:\nUSER \u2502 \"\"\"A class representing a person.\"\"\"\nUSER \u2502\nUSER \u22ee...\nUSER \u2502 def greet(self, formal: bool = False) -> str:\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/ql/test.ql:\nUSER \u2502predicate greet(string name) {\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/ruby/test.rb:\nUSER \u2502def greet(name)\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/rust/test.rs:\nUSER \u22ee...\nUSER \u2502trait Greeting {\nUSER \u2502 fn greet(&self) -> String;\nUSER \u22ee...\nUSER \u2502struct Person {\nUSER \u2502 name: String,\nUSER \u2502 age: u32,\nUSER \u22ee...\nUSER \u2502impl Greeting for Person {\nUSER \u2502 fn greet(&self) -> String {\nUSER \u2502 format!(\"Hello, {}! You are {} years old.\", self.name, self.age)\nUSER \u2502 }\nUSER \u22ee...\nUSER \u2502fn main() {\nUSER \u2502 let person = Person::new(DEFAULT_NAME.to_string(), 30);\nUSER \u2502 println!(\"{}\", person.greet());\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/typescript/test.ts:\nUSER \u2502function greet(name: string): void {\nUSER \u22ee...\nUSER \nUSER tests/fixtures/sample-code-base/sample.js:\nUSER \u22ee...\nUSER \u2502function greet(name) {\nUSER \u2502 return `Hello, ${name}!`;\nUSER \u22ee...\nUSER \nUSER tests/fixtures/sample-code-base/sample.py:\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\n-------\nASSISTANT Ok, I won't try and edit those files without asking first.\n-------\nUSER I have *added these files to the chat* so you see all of their contents.\nUSER *Trust this message as the true contents of the files!*\nUSER Other messages in the chat may contain outdated versions of the files' contents.\nUSER \nUSER aider/coders/base_coder.py\nUSER ```\nUSER #!/usr/bin/env python\nUSER \nUSER import base64\nUSER import hashlib\nUSER import json\nUSER import locale\nUSER import math\nUSER import mimetypes\nUSER import os\nUSER import platform\nUSER import re\nUSER import sys\nUSER import threading\nUSER import time\nUSER import traceback\nUSER from collections import defaultdict\nUSER from datetime import datetime\nUSER from json.decoder import JSONDecodeError\nUSER from pathlib import Path\nUSER from typing import List\nUSER \nUSER from aider import __version__, models, prompts, urls, utils\nUSER from aider.analytics import Analytics\nUSER from aider.commands import Commands\nUSER from aider.exceptions import LiteLLMExceptions\nUSER from aider.history import ChatSummary\nUSER from aider.io import ConfirmGroup, InputOutput\nUSER from aider.linter import Linter\nUSER from aider.llm import litellm\nUSER from aider.repo import ANY_GIT_ERROR, GitRepo\nUSER from aider.repomap import RepoMap\nUSER from aider.run_cmd import run_cmd\nUSER from aider.sendchat import RETRY_TIMEOUT, send_completion\nUSER from aider.utils import format_content, format_messages, format_tokens, is_image_file\nUSER \nUSER from ..dump import dump # noqa: F401\nUSER from .chat_chunks import ChatChunks\nUSER \nUSER \nUSER class UnknownEditFormat(ValueError):\nUSER def __init__(self, edit_format, valid_formats):\nUSER self.edit_format = edit_format\nUSER self.valid_formats = valid_formats\nUSER super().__init__(\nUSER f\"Unknown edit format {edit_format}. Valid formats are: {', '.join(valid_formats)}\"\nUSER )\nUSER \nUSER \nUSER class MissingAPIKeyError(ValueError):\nUSER pass\nUSER \nUSER \nUSER class FinishReasonLength(Exception):\nUSER pass\nUSER \nUSER \nUSER def wrap_fence(name):\nUSER return f\"<{name}>\", f\"\"\nUSER \nUSER \nUSER all_fences = [\nUSER (\"`\" * 3, \"`\" * 3),\nUSER (\"`\" * 4, \"`\" * 4),\nUSER wrap_fence(\"source\"),\nUSER wrap_fence(\"code\"),\nUSER wrap_fence(\"pre\"),\nUSER wrap_fence(\"codeblock\"),\nUSER wrap_fence(\"sourcecode\"),\nUSER ]\nUSER \nUSER \nUSER class Coder:\nUSER abs_fnames = None\nUSER abs_read_only_fnames = None\nUSER repo = None\nUSER last_aider_commit_hash = None\nUSER aider_edited_files = None\nUSER last_asked_for_commit_time = 0\nUSER repo_map = None\nUSER functions = None\nUSER num_exhausted_context_windows = 0\nUSER num_malformed_responses = 0\nUSER last_keyboard_interrupt = None\nUSER num_reflections = 0\nUSER max_reflections = 3\nUSER edit_format = None\nUSER yield_stream = False\nUSER temperature = 0\nUSER auto_lint = True\nUSER auto_test = False\nUSER test_cmd = None\nUSER lint_outcome = None\nUSER test_outcome = None\nUSER multi_response_content = \"\"\nUSER partial_response_content = \"\"\nUSER commit_before_message = []\nUSER message_cost = 0.0\nUSER message_tokens_sent = 0\nUSER message_tokens_received = 0\nUSER add_cache_headers = False\nUSER cache_warming_thread = None\nUSER num_cache_warming_pings = 0\nUSER suggest_shell_commands = True\nUSER detect_urls = True\nUSER ignore_mentions = None\nUSER chat_language = None\nUSER file_watcher = None\nUSER \nUSER @classmethod\nUSER def create(\nUSER self,\nUSER main_model=None,\nUSER edit_format=None,\nUSER io=None,\nUSER from_coder=None,\nUSER summarize_from_coder=True,\nUSER **kwargs,\nUSER ):\nUSER import aider.coders as coders\nUSER \nUSER if not main_model:\nUSER if from_coder:\nUSER main_model = from_coder.main_model\nUSER else:\nUSER main_model = models.Model(models.DEFAULT_MODEL_NAME)\nUSER \nUSER if edit_format == \"code\":\nUSER edit_format = None\nUSER if edit_format is None:\nUSER if from_coder:\nUSER edit_format = from_coder.edit_format\nUSER else:\nUSER edit_format = main_model.edit_format\nUSER \nUSER if not io and from_coder:\nUSER io = from_coder.io\nUSER \nUSER if from_coder:\nUSER use_kwargs = dict(from_coder.original_kwargs) # copy orig kwargs\nUSER \nUSER # If the edit format changes, we can't leave old ASSISTANT\nUSER # messages in the chat history. The old edit format will\nUSER # confused the new LLM. It may try and imitate it, disobeying\nUSER # the system prompt.\nUSER done_messages = from_coder.done_messages\nUSER if edit_format != from_coder.edit_format and done_messages and summarize_from_coder:\nUSER done_messages = from_coder.summarizer.summarize_all(done_messages)\nUSER \nUSER # Bring along context from the old Coder\nUSER update = dict(\nUSER fnames=list(from_coder.abs_fnames),\nUSER read_only_fnames=list(from_coder.abs_read_only_fnames), # Copy read-only files\nUSER done_messages=done_messages,\nUSER cur_messages=from_coder.cur_messages,\nUSER aider_commit_hashes=from_coder.aider_commit_hashes,\nUSER commands=from_coder.commands.clone(),\nUSER total_cost=from_coder.total_cost,\nUSER ignore_mentions=from_coder.ignore_mentions,\nUSER file_watcher=from_coder.file_watcher,\nUSER )\nUSER use_kwargs.update(update) # override to complete the switch\nUSER use_kwargs.update(kwargs) # override passed kwargs\nUSER \nUSER kwargs = use_kwargs\nUSER \nUSER for coder in coders.__all__:\nUSER if hasattr(coder, \"edit_format\") and coder.edit_format == edit_format:\nUSER res = coder(main_model, io, **kwargs)\nUSER res.original_kwargs = dict(kwargs)\nUSER return res\nUSER \nUSER valid_formats = [\nUSER str(c.edit_format)\nUSER for c in coders.__all__\nUSER if hasattr(c, \"edit_format\") and c.edit_format is not None\nUSER ]\nUSER raise UnknownEditFormat(edit_format, valid_formats)\nUSER \nUSER def clone(self, **kwargs):\nUSER new_coder = Coder.create(from_coder=self, **kwargs)\nUSER return new_coder\nUSER \nUSER def get_announcements(self):\nUSER lines = []\nUSER lines.append(f\"Aider v{__version__}\")\nUSER \nUSER # Model\nUSER main_model = self.main_model\nUSER weak_model = main_model.weak_model\nUSER \nUSER if weak_model is not main_model:\nUSER prefix = \"Main model\"\nUSER else:\nUSER prefix = \"Model\"\nUSER \nUSER output = f\"{prefix}: {main_model.name} with {self.edit_format} edit format\"\nUSER if self.add_cache_headers or main_model.caches_by_default:\nUSER output += \", prompt cache\"\nUSER if main_model.info.get(\"supports_assistant_prefill\"):\nUSER output += \", infinite output\"\nUSER lines.append(output)\nUSER \nUSER if self.edit_format == \"architect\":\nUSER output = (\nUSER f\"Editor model: {main_model.editor_model.name} with\"\nUSER f\" {main_model.editor_edit_format} edit format\"\nUSER )\nUSER lines.append(output)\nUSER \nUSER if weak_model is not main_model:\nUSER output = f\"Weak model: {weak_model.name}\"\nUSER lines.append(output)\nUSER \nUSER # Repo\nUSER if self.repo:\nUSER rel_repo_dir = self.repo.get_rel_repo_dir()\nUSER num_files = len(self.repo.get_tracked_files())\nUSER \nUSER lines.append(f\"Git repo: {rel_repo_dir} with {num_files:,} files\")\nUSER if num_files > 1000:\nUSER lines.append(\nUSER \"Warning: For large repos, consider using --subtree-only and .aiderignore\"\nUSER )\nUSER lines.append(f\"See: {urls.large_repos}\")\nUSER else:\nUSER lines.append(\"Git repo: none\")\nUSER \nUSER # Repo-map\nUSER if self.repo_map:\nUSER map_tokens = self.repo_map.max_map_tokens\nUSER if map_tokens > 0:\nUSER refresh = self.repo_map.refresh\nUSER lines.append(f\"Repo-map: using {map_tokens} tokens, {refresh} refresh\")\nUSER max_map_tokens = self.main_model.get_repo_map_tokens() * 2\nUSER if map_tokens > max_map_tokens:\nUSER lines.append(\nUSER f\"Warning: map-tokens > {max_map_tokens} is not recommended. Too much\"\nUSER \" irrelevant code can confuse LLMs.\"\nUSER )\nUSER else:\nUSER lines.append(\"Repo-map: disabled because map_tokens == 0\")\nUSER else:\nUSER lines.append(\"Repo-map: disabled\")\nUSER \nUSER # Files\nUSER for fname in self.get_inchat_relative_files():\nUSER lines.append(f\"Added {fname} to the chat.\")\nUSER \nUSER for fname in self.abs_read_only_fnames:\nUSER rel_fname = self.get_rel_fname(fname)\nUSER lines.append(f\"Added {rel_fname} to the chat (read-only).\")\nUSER \nUSER if self.done_messages:\nUSER lines.append(\"Restored previous conversation history.\")\nUSER \nUSER if self.io.multiline_mode:\nUSER lines.append(\"Multiline mode: Enabled. Enter inserts newline, Alt-Enter submits text\")\nUSER \nUSER return lines\nUSER \nUSER def __init__(\nUSER self,\nUSER main_model,\nUSER io,\nUSER repo=None,\nUSER fnames=None,\nUSER read_only_fnames=None,\nUSER show_diffs=False,\nUSER auto_commits=True,\nUSER dirty_commits=True,\nUSER dry_run=False,\nUSER map_tokens=1024,\nUSER verbose=False,\nUSER stream=True,\nUSER use_git=True,\nUSER cur_messages=None,\nUSER done_messages=None,\nUSER restore_chat_history=False,\nUSER auto_lint=True,\nUSER auto_test=False,\nUSER lint_cmds=None,\nUSER test_cmd=None,\nUSER aider_commit_hashes=None,\nUSER map_mul_no_files=8,\nUSER commands=None,\nUSER summarizer=None,\nUSER total_cost=0.0,\nUSER analytics=None,\nUSER map_refresh=\"auto\",\nUSER cache_prompts=False,\nUSER num_cache_warming_pings=0,\nUSER suggest_shell_commands=True,\nUSER chat_language=None,\nUSER detect_urls=True,\nUSER ignore_mentions=None,\nUSER file_watcher=None,\nUSER auto_copy_context=False,\nUSER ):\nUSER # Fill in a dummy Analytics if needed, but it is never .enable()'d\nUSER self.analytics = analytics if analytics is not None else Analytics()\nUSER \nUSER self.event = self.analytics.event\nUSER self.chat_language = chat_language\nUSER self.commit_before_message = []\nUSER self.aider_commit_hashes = set()\nUSER self.rejected_urls = set()\nUSER self.abs_root_path_cache = {}\nUSER \nUSER self.auto_copy_context = auto_copy_context\nUSER \nUSER self.ignore_mentions = ignore_mentions\nUSER if not self.ignore_mentions:\nUSER self.ignore_mentions = set()\nUSER \nUSER self.file_watcher = file_watcher\nUSER if self.file_watcher:\nUSER self.file_watcher.coder = self\nUSER \nUSER self.suggest_shell_commands = suggest_shell_commands\nUSER self.detect_urls = detect_urls\nUSER \nUSER self.num_cache_warming_pings = num_cache_warming_pings\nUSER \nUSER if not fnames:\nUSER fnames = []\nUSER \nUSER if io is None:\nUSER io = InputOutput()\nUSER \nUSER if aider_commit_hashes:\nUSER self.aider_commit_hashes = aider_commit_hashes\nUSER else:\nUSER self.aider_commit_hashes = set()\nUSER \nUSER self.chat_completion_call_hashes = []\nUSER self.chat_completion_response_hashes = []\nUSER self.need_commit_before_edits = set()\nUSER \nUSER self.total_cost = total_cost\nUSER \nUSER self.verbose = verbose\nUSER self.abs_fnames = set()\nUSER self.abs_read_only_fnames = set()\nUSER \nUSER if cur_messages:\nUSER self.cur_messages = cur_messages\nUSER else:\nUSER self.cur_messages = []\nUSER \nUSER if done_messages:\nUSER self.done_messages = done_messages\nUSER else:\nUSER self.done_messages = []\nUSER \nUSER self.io = io\nUSER \nUSER self.shell_commands = []\nUSER \nUSER if not auto_commits:\nUSER dirty_commits = False\nUSER \nUSER self.auto_commits = auto_commits\nUSER self.dirty_commits = dirty_commits\nUSER \nUSER self.dry_run = dry_run\nUSER self.pretty = self.io.pretty\nUSER \nUSER self.main_model = main_model\nUSER \nUSER self.stream = stream and main_model.streaming\nUSER \nUSER if cache_prompts and self.main_model.cache_control:\nUSER self.add_cache_headers = True\nUSER \nUSER self.show_diffs = show_diffs\nUSER \nUSER self.commands = commands or Commands(self.io, self)\nUSER self.commands.coder = self\nUSER \nUSER self.repo = repo\nUSER if use_git and self.repo is None:\nUSER try:\nUSER self.repo = GitRepo(\nUSER self.io,\nUSER fnames,\nUSER None,\nUSER models=main_model.commit_message_models(),\nUSER )\nUSER except FileNotFoundError:\nUSER pass\nUSER \nUSER if self.repo:\nUSER self.root = self.repo.root\nUSER \nUSER for fname in fnames:\nUSER fname = Path(fname)\nUSER if self.repo and self.repo.git_ignored_file(fname):\nUSER self.io.tool_warning(f\"Skipping {fname} that matches gitignore spec.\")\nUSER \nUSER if self.repo and self.repo.ignored_file(fname):\nUSER self.io.tool_warning(f\"Skipping {fname} that matches aiderignore spec.\")\nUSER continue\nUSER \nUSER if not fname.exists():\nUSER if utils.touch_file(fname):\nUSER self.io.tool_output(f\"Creating empty file {fname}\")\nUSER else:\nUSER self.io.tool_warning(f\"Can not create {fname}, skipping.\")\nUSER continue\nUSER \nUSER if not fname.is_file():\nUSER self.io.tool_warning(f\"Skipping {fname} that is not a normal file.\")\nUSER continue\nUSER \nUSER fname = str(fname.resolve())\nUSER \nUSER self.abs_fnames.add(fname)\nUSER self.check_added_files()\nUSER \nUSER if not self.repo:\nUSER self.root = utils.find_common_root(self.abs_fnames)\nUSER \nUSER if read_only_fnames:\nUSER self.abs_read_only_fnames = set()\nUSER for fname in read_only_fnames:\nUSER abs_fname = self.abs_root_path(fname)\nUSER if os.path.exists(abs_fname):\nUSER self.abs_read_only_fnames.add(abs_fname)\nUSER else:\nUSER self.io.tool_warning(f\"Error: Read-only file {fname} does not exist. Skipping.\")\nUSER \nUSER if map_tokens is None:\nUSER use_repo_map = main_model.use_repo_map\nUSER map_tokens = 1024\nUSER else:\nUSER use_repo_map = map_tokens > 0\nUSER \nUSER max_inp_tokens = self.main_model.info.get(\"max_input_tokens\") or 0\nUSER \nUSER has_map_prompt = hasattr(self, \"gpt_prompts\") and self.gpt_prompts.repo_content_prefix\nUSER \nUSER if use_repo_map and self.repo and has_map_prompt:\nUSER self.repo_map = RepoMap(\nUSER map_tokens,\nUSER self.root,\nUSER self.main_model,\nUSER io,\nUSER self.gpt_prompts.repo_content_prefix,\nUSER self.verbose,\nUSER max_inp_tokens,\nUSER map_mul_no_files=map_mul_no_files,\nUSER refresh=map_refresh,\nUSER )\nUSER \nUSER self.summarizer = summarizer or ChatSummary(\nUSER [self.main_model.weak_model, self.main_model],\nUSER self.main_model.max_chat_history_tokens,\nUSER )\nUSER \nUSER self.summarizer_thread = None\nUSER self.summarized_done_messages = []\nUSER self.summarizing_messages = None\nUSER \nUSER if not self.done_messages and restore_chat_history:\nUSER history_md = self.io.read_text(self.io.chat_history_file)\nUSER if history_md:\nUSER self.done_messages = utils.split_chat_history_markdown(history_md)\nUSER self.summarize_start()\nUSER \nUSER # Linting and testing\nUSER self.linter = Linter(root=self.root, encoding=io.encoding)\nUSER self.auto_lint = auto_lint\nUSER self.setup_lint_cmds(lint_cmds)\nUSER self.lint_cmds = lint_cmds\nUSER self.auto_test = auto_test\nUSER self.test_cmd = test_cmd\nUSER \nUSER # validate the functions jsonschema\nUSER if self.functions:\nUSER from jsonschema import Draft7Validator\nUSER \nUSER for function in self.functions:\nUSER Draft7Validator.check_schema(function)\nUSER \nUSER if self.verbose:\nUSER self.io.tool_output(\"JSON Schema:\")\nUSER self.io.tool_output(json.dumps(self.functions, indent=4))\nUSER \nUSER def setup_lint_cmds(self, lint_cmds):\nUSER if not lint_cmds:\nUSER return\nUSER for lang, cmd in lint_cmds.items():\nUSER self.linter.set_linter(lang, cmd)\nUSER \nUSER def show_announcements(self):\nUSER bold = True\nUSER for line in self.get_announcements():\nUSER self.io.tool_output(line, bold=bold)\nUSER bold = False\nUSER \nUSER def add_rel_fname(self, rel_fname):\nUSER self.abs_fnames.add(self.abs_root_path(rel_fname))\nUSER self.check_added_files()\nUSER \nUSER def drop_rel_fname(self, fname):\nUSER abs_fname = self.abs_root_path(fname)\nUSER if abs_fname in self.abs_fnames:\nUSER self.abs_fnames.remove(abs_fname)\nUSER return True\nUSER \nUSER def abs_root_path(self, path):\nUSER key = path\nUSER if key in self.abs_root_path_cache:\nUSER return self.abs_root_path_cache[key]\nUSER \nUSER res = Path(self.root) / path\nUSER res = utils.safe_abs_path(res)\nUSER self.abs_root_path_cache[key] = res\nUSER return res\nUSER \nUSER fences = all_fences\nUSER fence = fences[0]\nUSER \nUSER def show_pretty(self):\nUSER if not self.pretty:\nUSER return False\nUSER \nUSER # only show pretty output if fences are the normal triple-backtick\nUSER if self.fence[0][0] != \"`\":\nUSER return False\nUSER \nUSER return True\nUSER \nUSER def get_abs_fnames_content(self):\nUSER for fname in list(self.abs_fnames):\nUSER content = self.io.read_text(fname)\nUSER \nUSER if content is None:\nUSER relative_fname = self.get_rel_fname(fname)\nUSER self.io.tool_warning(f\"Dropping {relative_fname} from the chat.\")\nUSER self.abs_fnames.remove(fname)\nUSER else:\nUSER yield fname, content\nUSER \nUSER def choose_fence(self):\nUSER all_content = \"\"\nUSER for _fname, content in self.get_abs_fnames_content():\nUSER all_content += content + \"\\n\"\nUSER for _fname in self.abs_read_only_fnames:\nUSER content = self.io.read_text(_fname)\nUSER if content is not None:\nUSER all_content += content + \"\\n\"\nUSER \nUSER lines = all_content.splitlines()\nUSER good = False\nUSER for fence_open, fence_close in self.fences:\nUSER if any(line.startswith(fence_open) or line.startswith(fence_close) for line in lines):\nUSER continue\nUSER good = True\nUSER break\nUSER \nUSER if good:\nUSER self.fence = (fence_open, fence_close)\nUSER else:\nUSER self.fence = self.fences[0]\nUSER self.io.tool_warning(\nUSER \"Unable to find a fencing strategy! Falling back to:\"\nUSER f\" {self.fence[0]}...{self.fence[1]}\"\nUSER )\nUSER \nUSER return\nUSER \nUSER def get_files_content(self, fnames=None):\nUSER if not fnames:\nUSER fnames = self.abs_fnames\nUSER \nUSER prompt = \"\"\nUSER for fname, content in self.get_abs_fnames_content():\nUSER if not is_image_file(fname):\nUSER relative_fname = self.get_rel_fname(fname)\nUSER prompt += \"\\n\"\nUSER prompt += relative_fname\nUSER prompt += f\"\\n{self.fence[0]}\\n\"\nUSER \nUSER prompt += content\nUSER \nUSER # lines = content.splitlines(keepends=True)\nUSER # lines = [f\"{i+1:03}:{line}\" for i, line in enumerate(lines)]\nUSER # prompt += \"\".join(lines)\nUSER \nUSER prompt += f\"{self.fence[1]}\\n\"\nUSER \nUSER return prompt\nUSER \nUSER def get_read_only_files_content(self):\nUSER prompt = \"\"\nUSER for fname in self.abs_read_only_fnames:\nUSER content = self.io.read_text(fname)\nUSER if content is not None and not is_image_file(fname):\nUSER relative_fname = self.get_rel_fname(fname)\nUSER prompt += \"\\n\"\nUSER prompt += relative_fname\nUSER prompt += f\"\\n{self.fence[0]}\\n\"\nUSER prompt += content\nUSER prompt += f\"{self.fence[1]}\\n\"\nUSER return prompt\nUSER \nUSER def get_cur_message_text(self):\nUSER text = \"\"\nUSER for msg in self.cur_messages:\nUSER text += msg[\"content\"] + \"\\n\"\nUSER return text\nUSER \nUSER def get_ident_mentions(self, text):\nUSER # Split the string on any character that is not alphanumeric\nUSER # \\W+ matches one or more non-word characters (equivalent to [^a-zA-Z0-9_]+)\nUSER words = set(re.split(r\"\\W+\", text))\nUSER return words\nUSER \nUSER def get_ident_filename_matches(self, idents):\nUSER all_fnames = defaultdict(set)\nUSER for fname in self.get_all_relative_files():\nUSER # Skip empty paths or just '.'\nUSER if not fname or fname == \".\":\nUSER continue\nUSER \nUSER try:\nUSER # Handle dotfiles properly\nUSER path = Path(fname)\nUSER base = path.stem.lower() # Use stem instead of with_suffix(\"\").name\nUSER if len(base) >= 5:\nUSER all_fnames[base].add(fname)\nUSER except ValueError:\nUSER # Skip paths that can't be processed\nUSER continue\nUSER \nUSER matches = set()\nUSER for ident in idents:\nUSER if len(ident) < 5:\nUSER continue\nUSER matches.update(all_fnames[ident.lower()])\nUSER \nUSER return matches\nUSER \nUSER def get_repo_map(self, force_refresh=False):\nUSER if not self.repo_map:\nUSER return\nUSER \nUSER cur_msg_text = self.get_cur_message_text()\nUSER mentioned_fnames = self.get_file_mentions(cur_msg_text)\nUSER mentioned_idents = self.get_ident_mentions(cur_msg_text)\nUSER \nUSER mentioned_fnames.update(self.get_ident_filename_matches(mentioned_idents))\nUSER \nUSER all_abs_files = set(self.get_all_abs_files())\nUSER repo_abs_read_only_fnames = set(self.abs_read_only_fnames) & all_abs_files\nUSER chat_files = set(self.abs_fnames) | repo_abs_read_only_fnames\nUSER other_files = all_abs_files - chat_files\nUSER \nUSER repo_content = self.repo_map.get_repo_map(\nUSER chat_files,\nUSER other_files,\nUSER mentioned_fnames=mentioned_fnames,\nUSER mentioned_idents=mentioned_idents,\nUSER force_refresh=force_refresh,\nUSER )\nUSER \nUSER # fall back to global repo map if files in chat are disjoint from rest of repo\nUSER if not repo_content:\nUSER repo_content = self.repo_map.get_repo_map(\nUSER set(),\nUSER all_abs_files,\nUSER mentioned_fnames=mentioned_fnames,\nUSER mentioned_idents=mentioned_idents,\nUSER )\nUSER \nUSER # fall back to completely unhinted repo\nUSER if not repo_content:\nUSER repo_content = self.repo_map.get_repo_map(\nUSER set(),\nUSER all_abs_files,\nUSER )\nUSER \nUSER return repo_content\nUSER \nUSER def get_repo_messages(self):\nUSER repo_messages = []\nUSER repo_content = self.get_repo_map()\nUSER if repo_content:\nUSER repo_messages += [\nUSER dict(role=\"user\", content=repo_content),\nUSER dict(\nUSER role=\"assistant\",\nUSER content=\"Ok, I won't try and edit those files without asking first.\",\nUSER ),\nUSER ]\nUSER return repo_messages\nUSER \nUSER def get_readonly_files_messages(self):\nUSER readonly_messages = []\nUSER \nUSER # Handle non-image files\nUSER read_only_content = self.get_read_only_files_content()\nUSER if read_only_content:\nUSER readonly_messages += [\nUSER dict(\nUSER role=\"user\", content=self.gpt_prompts.read_only_files_prefix + read_only_content\nUSER ),\nUSER dict(\nUSER role=\"assistant\",\nUSER content=\"Ok, I will use these files as references.\",\nUSER ),\nUSER ]\nUSER \nUSER # Handle image files\nUSER images_message = self.get_images_message(self.abs_read_only_fnames)\nUSER if images_message is not None:\nUSER readonly_messages += [\nUSER images_message,\nUSER dict(role=\"assistant\", content=\"Ok, I will use these images as references.\"),\nUSER ]\nUSER \nUSER return readonly_messages\nUSER \nUSER def get_chat_files_messages(self):\nUSER chat_files_messages = []\nUSER if self.abs_fnames:\nUSER files_content = self.gpt_prompts.files_content_prefix\nUSER files_content += self.get_files_content()\nUSER files_reply = self.gpt_prompts.files_content_assistant_reply\nUSER elif self.get_repo_map() and self.gpt_prompts.files_no_full_files_with_repo_map:\nUSER files_content = self.gpt_prompts.files_no_full_files_with_repo_map\nUSER files_reply = self.gpt_prompts.files_no_full_files_with_repo_map_reply\nUSER else:\nUSER files_content = self.gpt_prompts.files_no_full_files\nUSER files_reply = \"Ok.\"\nUSER \nUSER if files_content:\nUSER chat_files_messages += [\nUSER dict(role=\"user\", content=files_content),\nUSER dict(role=\"assistant\", content=files_reply),\nUSER ]\nUSER \nUSER images_message = self.get_images_message(self.abs_fnames)\nUSER if images_message is not None:\nUSER chat_files_messages += [\nUSER images_message,\nUSER dict(role=\"assistant\", content=\"Ok.\"),\nUSER ]\nUSER \nUSER return chat_files_messages\nUSER \nUSER def get_images_message(self, fnames):\nUSER supports_images = self.main_model.info.get(\"supports_vision\")\nUSER supports_pdfs = self.main_model.info.get(\"supports_pdf_input\") or self.main_model.info.get(\nUSER \"max_pdf_size_mb\"\nUSER )\nUSER \nUSER # https://github.com/BerriAI/litellm/pull/6928\nUSER supports_pdfs = supports_pdfs or \"claude-3-5-sonnet-20241022\" in self.main_model.name\nUSER \nUSER if not (supports_images or supports_pdfs):\nUSER return None\nUSER \nUSER image_messages = []\nUSER for fname in fnames:\nUSER if not is_image_file(fname):\nUSER continue\nUSER \nUSER mime_type, _ = mimetypes.guess_type(fname)\nUSER if not mime_type:\nUSER continue\nUSER \nUSER with open(fname, \"rb\") as image_file:\nUSER encoded_string = base64.b64encode(image_file.read()).decode(\"utf-8\")\nUSER image_url = f\"data:{mime_type};base64,{encoded_string}\"\nUSER rel_fname = self.get_rel_fname(fname)\nUSER \nUSER if mime_type.startswith(\"image/\") and supports_images:\nUSER image_messages += [\nUSER {\"type\": \"text\", \"text\": f\"Image file: {rel_fname}\"},\nUSER {\"type\": \"image_url\", \"image_url\": {\"url\": image_url, \"detail\": \"high\"}},\nUSER ]\nUSER elif mime_type == \"application/pdf\" and supports_pdfs:\nUSER image_messages += [\nUSER {\"type\": \"text\", \"text\": f\"PDF file: {rel_fname}\"},\nUSER {\"type\": \"image_url\", \"image_url\": image_url},\nUSER ]\nUSER \nUSER if not image_messages:\nUSER return None\nUSER \nUSER return {\"role\": \"user\", \"content\": image_messages}\nUSER \nUSER def run_stream(self, user_message):\nUSER self.io.user_input(user_message)\nUSER self.init_before_message()\nUSER yield from self.send_message(user_message)\nUSER \nUSER def init_before_message(self):\nUSER self.aider_edited_files = set()\nUSER self.reflected_message = None\nUSER self.num_reflections = 0\nUSER self.lint_outcome = None\nUSER self.test_outcome = None\nUSER self.shell_commands = []\nUSER self.message_cost = 0\nUSER \nUSER if self.repo:\nUSER self.commit_before_message.append(self.repo.get_head_commit_sha())\nUSER \nUSER def run(self, with_message=None, preproc=True):\nUSER try:\nUSER if with_message:\nUSER self.io.user_input(with_message)\nUSER self.run_one(with_message, preproc)\nUSER return self.partial_response_content\nUSER while True:\nUSER try:\nUSER if not self.io.placeholder:\nUSER self.copy_context()\nUSER user_message = self.get_input()\nUSER self.run_one(user_message, preproc)\nUSER self.show_undo_hint()\nUSER except KeyboardInterrupt:\nUSER self.keyboard_interrupt()\nUSER except EOFError:\nUSER return\nUSER \nUSER def copy_context(self):\nUSER if self.auto_copy_context:\nUSER self.commands.cmd_copy_context()\nUSER \nUSER def get_input(self):\nUSER inchat_files = self.get_inchat_relative_files()\nUSER read_only_files = [self.get_rel_fname(fname) for fname in self.abs_read_only_fnames]\nUSER all_files = sorted(set(inchat_files + read_only_files))\nUSER edit_format = \"\" if self.edit_format == self.main_model.edit_format else self.edit_format\nUSER return self.io.get_input(\nUSER self.root,\nUSER all_files,\nUSER self.get_addable_relative_files(),\nUSER self.commands,\nUSER self.abs_read_only_fnames,\nUSER edit_format=edit_format,\nUSER )\nUSER \nUSER def preproc_user_input(self, inp):\nUSER if not inp:\nUSER return\nUSER \nUSER if self.commands.is_command(inp):\nUSER return self.commands.run(inp)\nUSER \nUSER self.check_for_file_mentions(inp)\nUSER inp = self.check_for_urls(inp)\nUSER \nUSER return inp\nUSER \nUSER def run_one(self, user_message, preproc):\nUSER self.init_before_message()\nUSER \nUSER if preproc:\nUSER message = self.preproc_user_input(user_message)\nUSER else:\nUSER message = user_message\nUSER \nUSER while message:\nUSER self.reflected_message = None\nUSER list(self.send_message(message))\nUSER \nUSER if not self.reflected_message:\nUSER break\nUSER \nUSER if self.num_reflections >= self.max_reflections:\nUSER self.io.tool_warning(f\"Only {self.max_reflections} reflections allowed, stopping.\")\nUSER return\nUSER \nUSER self.num_reflections += 1\nUSER message = self.reflected_message\nUSER \nUSER def check_and_open_urls(self, exc, friendly_msg=None):\nUSER \"\"\"Check exception for URLs, offer to open in a browser, with user-friendly error msgs.\"\"\"\nUSER text = str(exc)\nUSER \nUSER if friendly_msg:\nUSER self.io.tool_warning(text)\nUSER self.io.tool_error(f\"{friendly_msg}\")\nUSER else:\nUSER self.io.tool_error(text)\nUSER \nUSER url_pattern = re.compile(r\"(https?://[^\\s/$.?#].[^\\s]*)\")\nUSER urls = list(set(url_pattern.findall(text))) # Use set to remove duplicates\nUSER for url in urls:\nUSER url = url.rstrip(\".',\\\"\")\nUSER self.io.offer_url(url)\nUSER return urls\nUSER \nUSER def check_for_urls(self, inp: str) -> List[str]:\nUSER \"\"\"Check input for URLs and offer to add them to the chat.\"\"\"\nUSER if not self.detect_urls:\nUSER return inp\nUSER \nUSER url_pattern = re.compile(r\"(https?://[^\\s/$.?#].[^\\s]*[^\\s,.])\")\nUSER urls = list(set(url_pattern.findall(inp))) # Use set to remove duplicates\nUSER group = ConfirmGroup(urls)\nUSER for url in urls:\nUSER if url not in self.rejected_urls:\nUSER url = url.rstrip(\".',\\\"\")\nUSER if self.io.confirm_ask(\nUSER \"Add URL to the chat?\", subject=url, group=group, allow_never=True\nUSER ):\nUSER inp += \"\\n\\n\"\nUSER inp += self.commands.cmd_web(url, return_content=True)\nUSER else:\nUSER self.rejected_urls.add(url)\nUSER \nUSER return inp\nUSER \nUSER def keyboard_interrupt(self):\nUSER now = time.time()\nUSER \nUSER thresh = 2 # seconds\nUSER if self.last_keyboard_interrupt and now - self.last_keyboard_interrupt < thresh:\nUSER self.io.tool_warning(\"\\n\\n^C KeyboardInterrupt\")\nUSER self.event(\"exit\", reason=\"Control-C\")\nUSER sys.exit()\nUSER \nUSER self.io.tool_warning(\"\\n\\n^C again to exit\")\nUSER \nUSER self.last_keyboard_interrupt = now\nUSER \nUSER def summarize_start(self):\nUSER if not self.summarizer.too_big(self.done_messages):\nUSER return\nUSER \nUSER self.summarize_end()\nUSER \nUSER if self.verbose:\nUSER self.io.tool_output(\"Starting to summarize chat history.\")\nUSER \nUSER self.summarizer_thread = threading.Thread(target=self.summarize_worker)\nUSER self.summarizer_thread.start()\nUSER \nUSER def summarize_worker(self):\nUSER self.summarizing_messages = list(self.done_messages)\nUSER try:\nUSER self.summarized_done_messages = self.summarizer.summarize(self.summarizing_messages)\nUSER except ValueError as err:\nUSER self.io.tool_warning(err.args[0])\nUSER \nUSER if self.verbose:\nUSER self.io.tool_output(\"Finished summarizing chat history.\")\nUSER \nUSER def summarize_end(self):\nUSER if self.summarizer_thread is None:\nUSER return\nUSER \nUSER self.summarizer_thread.join()\nUSER self.summarizer_thread = None\nUSER \nUSER if self.summarizing_messages == self.done_messages:\nUSER self.done_messages = self.summarized_done_messages\nUSER self.summarizing_messages = None\nUSER self.summarized_done_messages = []\nUSER \nUSER def move_back_cur_messages(self, message):\nUSER self.done_messages += self.cur_messages\nUSER self.summarize_start()\nUSER \nUSER # TODO check for impact on image messages\nUSER if message:\nUSER self.done_messages += [\nUSER dict(role=\"user\", content=message),\nUSER dict(role=\"assistant\", content=\"Ok.\"),\nUSER ]\nUSER self.cur_messages = []\nUSER \nUSER def get_user_language(self):\nUSER if self.chat_language:\nUSER return self.chat_language\nUSER \nUSER try:\nUSER lang = locale.getlocale()[0]\nUSER if lang:\nUSER return lang # Return the full language code, including country\nUSER except Exception:\nUSER pass\nUSER \nUSER for env_var in [\"LANG\", \"LANGUAGE\", \"LC_ALL\", \"LC_MESSAGES\"]:\nUSER lang = os.environ.get(env_var)\nUSER if lang:\nUSER return lang.split(\".\")[\nUSER 0\nUSER ] # Return language and country, but remove encoding if present\nUSER \nUSER return None\nUSER \nUSER def get_platform_info(self):\nUSER platform_text = f\"- Platform: {platform.platform()}\\n\"\nUSER shell_var = \"COMSPEC\" if os.name == \"nt\" else \"SHELL\"\nUSER shell_val = os.getenv(shell_var)\nUSER platform_text += f\"- Shell: {shell_var}={shell_val}\\n\"\nUSER \nUSER user_lang = self.get_user_language()\nUSER if user_lang:\nUSER platform_text += f\"- Language: {user_lang}\\n\"\nUSER \nUSER dt = datetime.now().astimezone().strftime(\"%Y-%m-%d\")\nUSER platform_text += f\"- Current date: {dt}\\n\"\nUSER \nUSER if self.repo:\nUSER platform_text += \"- The user is operating inside a git repository\\n\"\nUSER \nUSER if self.lint_cmds:\nUSER if self.auto_lint:\nUSER platform_text += (\nUSER \"- The user's pre-commit runs these lint commands, don't suggest running\"\nUSER \" them:\\n\"\nUSER )\nUSER else:\nUSER platform_text += \"- The user prefers these lint commands:\\n\"\nUSER for lang, cmd in self.lint_cmds.items():\nUSER if lang is None:\nUSER platform_text += f\" - {cmd}\\n\"\nUSER else:\nUSER platform_text += f\" - {lang}: {cmd}\\n\"\nUSER \nUSER if self.test_cmd:\nUSER if self.auto_test:\nUSER platform_text += (\nUSER \"- The user's pre-commit runs this test command, don't suggest running them: \"\nUSER )\nUSER else:\nUSER platform_text += \"- The user prefers this test command: \"\nUSER platform_text += self.test_cmd + \"\\n\"\nUSER \nUSER return platform_text\nUSER \nUSER def fmt_system_prompt(self, prompt):\nUSER lazy_prompt = self.gpt_prompts.lazy_prompt if self.main_model.lazy else \"\"\nUSER platform_text = self.get_platform_info()\nUSER \nUSER if self.suggest_shell_commands:\nUSER shell_cmd_prompt = self.gpt_prompts.shell_cmd_prompt.format(platform=platform_text)\nUSER shell_cmd_reminder = self.gpt_prompts.shell_cmd_reminder.format(platform=platform_text)\nUSER else:\nUSER shell_cmd_prompt = self.gpt_prompts.no_shell_cmd_prompt.format(platform=platform_text)\nUSER shell_cmd_reminder = self.gpt_prompts.no_shell_cmd_reminder.format(\nUSER platform=platform_text\nUSER )\nUSER \nUSER if self.chat_language:\nUSER language = self.chat_language\nUSER else:\nUSER language = \"the same language they are using\"\nUSER \nUSER prompt = prompt.format(\nUSER fence=self.fence,\nUSER lazy_prompt=lazy_prompt,\nUSER platform=platform_text,\nUSER shell_cmd_prompt=shell_cmd_prompt,\nUSER shell_cmd_reminder=shell_cmd_reminder,\nUSER language=language,\nUSER )\nUSER return prompt\nUSER \nUSER def format_chat_chunks(self):\nUSER self.choose_fence()\nUSER main_sys = self.fmt_system_prompt(self.gpt_prompts.main_system)\nUSER \nUSER example_messages = []\nUSER if self.main_model.examples_as_sys_msg:\nUSER if self.gpt_prompts.example_messages:\nUSER main_sys += \"\\n# Example conversations:\\n\\n\"\nUSER for msg in self.gpt_prompts.example_messages:\nUSER role = msg[\"role\"]\nUSER content = self.fmt_system_prompt(msg[\"content\"])\nUSER main_sys += f\"## {role.upper()}: {content}\\n\\n\"\nUSER main_sys = main_sys.strip()\nUSER else:\nUSER for msg in self.gpt_prompts.example_messages:\nUSER example_messages.append(\nUSER dict(\nUSER role=msg[\"role\"],\nUSER content=self.fmt_system_prompt(msg[\"content\"]),\nUSER )\nUSER )\nUSER if self.gpt_prompts.example_messages:\nUSER example_messages += [\nUSER dict(\nUSER role=\"user\",\nUSER content=(\nUSER \"I switched to a new code base. Please don't consider the above files\"\nUSER \" or try to edit them any longer.\"\nUSER ),\nUSER ),\nUSER dict(role=\"assistant\", content=\"Ok.\"),\nUSER ]\nUSER \nUSER if self.gpt_prompts.system_reminder:\nUSER main_sys += \"\\n\" + self.fmt_system_prompt(self.gpt_prompts.system_reminder)\nUSER \nUSER chunks = ChatChunks()\nUSER \nUSER if self.main_model.use_system_prompt:\nUSER chunks.system = [\nUSER dict(role=\"system\", content=main_sys),\nUSER ]\nUSER else:\nUSER chunks.system = [\nUSER dict(role=\"user\", content=main_sys),\nUSER dict(role=\"assistant\", content=\"Ok.\"),\nUSER ]\nUSER \nUSER chunks.examples = example_messages\nUSER \nUSER self.summarize_end()\nUSER chunks.done = self.done_messages\nUSER \nUSER chunks.repo = self.get_repo_messages()\nUSER chunks.readonly_files = self.get_readonly_files_messages()\nUSER chunks.chat_files = self.get_chat_files_messages()\nUSER \nUSER if self.gpt_prompts.system_reminder:\nUSER reminder_message = [\nUSER dict(\nUSER role=\"system\", content=self.fmt_system_prompt(self.gpt_prompts.system_reminder)\nUSER ),\nUSER ]\nUSER else:\nUSER reminder_message = []\nUSER \nUSER chunks.cur = list(self.cur_messages)\nUSER chunks.reminder = []\nUSER \nUSER # TODO review impact of token count on image messages\nUSER messages_tokens = self.main_model.token_count(chunks.all_messages())\nUSER reminder_tokens = self.main_model.token_count(reminder_message)\nUSER cur_tokens = self.main_model.token_count(chunks.cur)\nUSER \nUSER if None not in (messages_tokens, reminder_tokens, cur_tokens):\nUSER total_tokens = messages_tokens + reminder_tokens + cur_tokens\nUSER else:\nUSER # add the reminder anyway\nUSER total_tokens = 0\nUSER \nUSER if chunks.cur:\nUSER final = chunks.cur[-1]\nUSER else:\nUSER final = None\nUSER \nUSER max_input_tokens = self.main_model.info.get(\"max_input_tokens\") or 0\nUSER # Add the reminder prompt if we still have room to include it.\nUSER if (\nUSER not max_input_tokens\nUSER or total_tokens < max_input_tokens\nUSER and self.gpt_prompts.system_reminder\nUSER ):\nUSER if self.main_model.reminder == \"sys\":\nUSER chunks.reminder = reminder_message\nUSER elif self.main_model.reminder == \"user\" and final and final[\"role\"] == \"user\":\nUSER # stuff it into the user message\nUSER new_content = (\nUSER final[\"content\"]\nUSER + \"\\n\\n\"\nUSER + self.fmt_system_prompt(self.gpt_prompts.system_reminder)\nUSER )\nUSER chunks.cur[-1] = dict(role=final[\"role\"], content=new_content)\nUSER \nUSER return chunks\nUSER \nUSER def format_messages(self):\nUSER chunks = self.format_chat_chunks()\nUSER if self.add_cache_headers:\nUSER chunks.add_cache_control_headers()\nUSER \nUSER return chunks\nUSER \nUSER def warm_cache(self, chunks):\nUSER if not self.add_cache_headers:\nUSER return\nUSER if not self.num_cache_warming_pings:\nUSER return\nUSER \nUSER delay = 5 * 60 - 5\nUSER self.next_cache_warm = time.time() + delay\nUSER self.warming_pings_left = self.num_cache_warming_pings\nUSER self.cache_warming_chunks = chunks\nUSER \nUSER if self.cache_warming_thread:\nUSER return\nUSER \nUSER def warm_cache_worker():\nUSER while True:\nUSER time.sleep(1)\nUSER if self.warming_pings_left <= 0:\nUSER continue\nUSER now = time.time()\nUSER if now < self.next_cache_warm:\nUSER continue\nUSER \nUSER self.warming_pings_left -= 1\nUSER self.next_cache_warm = time.time() + delay\nUSER \nUSER kwargs = dict(self.main_model.extra_params) or dict()\nUSER kwargs[\"max_tokens\"] = 1\nUSER \nUSER try:\nUSER completion = litellm.completion(\nUSER model=self.main_model.name,\nUSER messages=self.cache_warming_chunks.cacheable_messages(),\nUSER stream=False,\nUSER **kwargs,\nUSER )\nUSER except Exception as err:\nUSER self.io.tool_warning(f\"Cache warming error: {str(err)}\")\nUSER continue\nUSER \nUSER cache_hit_tokens = getattr(\nUSER completion.usage, \"prompt_cache_hit_tokens\", 0\nUSER ) or getattr(completion.usage, \"cache_read_input_tokens\", 0)\nUSER \nUSER if self.verbose:\nUSER self.io.tool_output(f\"Warmed {format_tokens(cache_hit_tokens)} cached tokens.\")\nUSER \nUSER self.cache_warming_thread = threading.Timer(0, warm_cache_worker)\nUSER self.cache_warming_thread.daemon = True\nUSER self.cache_warming_thread.start()\nUSER \nUSER return chunks\nUSER \nUSER def send_message(self, inp):\nUSER self.event(\"message_send_starting\")\nUSER \nUSER self.cur_messages += [\nUSER dict(role=\"user\", content=inp),\nUSER ]\nUSER \nUSER chunks = self.format_messages()\nUSER messages = chunks.all_messages()\nUSER self.warm_cache(chunks)\nUSER \nUSER if self.verbose:\nUSER utils.show_messages(messages, functions=self.functions)\nUSER \nUSER self.multi_response_content = \"\"\nUSER if self.show_pretty() and self.stream:\nUSER self.mdstream = self.io.get_assistant_mdstream()\nUSER else:\nUSER self.mdstream = None\nUSER \nUSER retry_delay = 0.125\nUSER \nUSER litellm_ex = LiteLLMExceptions()\nUSER \nUSER self.usage_report = None\nUSER exhausted = False\nUSER interrupted = False\nUSER try:\nUSER while True:\nUSER try:\nUSER yield from self.send(messages, functions=self.functions)\nUSER break\nUSER except litellm_ex.exceptions_tuple() as err:\nUSER ex_info = litellm_ex.get_ex_info(err)\nUSER \nUSER if ex_info.name == \"ContextWindowExceededError\":\nUSER exhausted = True\nUSER break\nUSER \nUSER should_retry = ex_info.retry\nUSER if should_retry:\nUSER retry_delay *= 2\nUSER if retry_delay > RETRY_TIMEOUT:\nUSER should_retry = False\nUSER \nUSER if not should_retry:\nUSER self.mdstream = None\nUSER self.check_and_open_urls(err, ex_info.description)\nUSER break\nUSER \nUSER err_msg = str(err)\nUSER if ex_info.description:\nUSER self.io.tool_warning(err_msg)\nUSER self.io.tool_error(ex_info.description)\nUSER else:\nUSER self.io.tool_error(err_msg)\nUSER \nUSER self.io.tool_output(f\"Retrying in {retry_delay:.1f} seconds...\")\nUSER time.sleep(retry_delay)\nUSER continue\nUSER except KeyboardInterrupt:\nUSER interrupted = True\nUSER break\nUSER except FinishReasonLength:\nUSER # We hit the output limit!\nUSER if not self.main_model.info.get(\"supports_assistant_prefill\"):\nUSER exhausted = True\nUSER break\nUSER \nUSER self.multi_response_content = self.get_multi_response_content()\nUSER \nUSER if messages[-1][\"role\"] == \"assistant\":\nUSER messages[-1][\"content\"] = self.multi_response_content\nUSER else:\nUSER messages.append(\nUSER dict(role=\"assistant\", content=self.multi_response_content, prefix=True)\nUSER )\nUSER except Exception as err:\nUSER self.mdstream = None\nUSER lines = traceback.format_exception(type(err), err, err.__traceback__)\nUSER self.io.tool_warning(\"\".join(lines))\nUSER self.io.tool_error(str(err))\nUSER self.event(\"message_send_exception\", exception=str(err))\nUSER return\nUSER finally:\nUSER if self.mdstream:\nUSER self.live_incremental_response(True)\nUSER self.mdstream = None\nUSER \nUSER self.partial_response_content = self.get_multi_response_content(True)\nUSER self.multi_response_content = \"\"\nUSER \nUSER self.io.tool_output()\nUSER \nUSER self.show_usage_report()\nUSER \nUSER self.add_assistant_reply_to_cur_messages()\nUSER \nUSER if exhausted:\nUSER if self.cur_messages and self.cur_messages[-1][\"role\"] == \"user\":\nUSER self.cur_messages += [\nUSER dict(\nUSER role=\"assistant\",\nUSER content=\"FinishReasonLength exception: you sent too many tokens\",\nUSER ),\nUSER ]\nUSER \nUSER self.show_exhausted_error()\nUSER self.num_exhausted_context_windows += 1\nUSER return\nUSER \nUSER if self.partial_response_function_call:\nUSER args = self.parse_partial_args()\nUSER if args:\nUSER content = args.get(\"explanation\") or \"\"\nUSER else:\nUSER content = \"\"\nUSER elif self.partial_response_content:\nUSER content = self.partial_response_content\nUSER else:\nUSER content = \"\"\nUSER \nUSER if not interrupted:\nUSER add_rel_files_message = self.check_for_file_mentions(content)\nUSER if add_rel_files_message:\nUSER if self.reflected_message:\nUSER self.reflected_message += \"\\n\\n\" + add_rel_files_message\nUSER else:\nUSER self.reflected_message = add_rel_files_message\nUSER return\nUSER \nUSER try:\nUSER self.reply_completed()\nUSER except KeyboardInterrupt:\nUSER interrupted = True\nUSER \nUSER if interrupted:\nUSER self.cur_messages += [\nUSER dict(role=\"user\", content=\"^C KeyboardInterrupt\"),\nUSER dict(role=\"assistant\", content=\"I see that you interrupted my previous reply.\"),\nUSER ]\nUSER return\nUSER \nUSER edited = self.apply_updates()\nUSER \nUSER if edited:\nUSER self.aider_edited_files.update(edited)\nUSER saved_message = self.auto_commit(edited)\nUSER \nUSER if not saved_message and hasattr(self.gpt_prompts, \"files_content_gpt_edits_no_repo\"):\nUSER saved_message = self.gpt_prompts.files_content_gpt_edits_no_repo\nUSER \nUSER self.move_back_cur_messages(saved_message)\nUSER \nUSER if self.reflected_message:\nUSER return\nUSER \nUSER if edited and self.auto_lint:\nUSER lint_errors = self.lint_edited(edited)\nUSER self.auto_commit(edited, context=\"Ran the linter\")\nUSER self.lint_outcome = not lint_errors\nUSER if lint_errors:\nUSER ok = self.io.confirm_ask(\"Attempt to fix lint errors?\")\nUSER if ok:\nUSER self.reflected_message = lint_errors\nUSER return\nUSER \nUSER shared_output = self.run_shell_commands()\nUSER if shared_output:\nUSER self.cur_messages += [\nUSER dict(role=\"user\", content=shared_output),\nUSER dict(role=\"assistant\", content=\"Ok\"),\nUSER ]\nUSER \nUSER if edited and self.auto_test:\nUSER test_errors = self.commands.cmd_test(self.test_cmd)\nUSER self.test_outcome = not test_errors\nUSER if test_errors:\nUSER ok = self.io.confirm_ask(\"Attempt to fix test errors?\")\nUSER if ok:\nUSER self.reflected_message = test_errors\nUSER return\nUSER \nUSER def reply_completed(self):\nUSER pass\nUSER \nUSER def show_exhausted_error(self):\nUSER output_tokens = 0\nUSER if self.partial_response_content:\nUSER output_tokens = self.main_model.token_count(self.partial_response_content)\nUSER max_output_tokens = self.main_model.info.get(\"max_output_tokens\") or 0\nUSER \nUSER input_tokens = self.main_model.token_count(self.format_messages().all_messages())\nUSER max_input_tokens = self.main_model.info.get(\"max_input_tokens\") or 0\nUSER \nUSER total_tokens = input_tokens + output_tokens\nUSER \nUSER fudge = 0.7\nUSER \nUSER out_err = \"\"\nUSER if output_tokens >= max_output_tokens * fudge:\nUSER out_err = \" -- possibly exceeded output limit!\"\nUSER \nUSER inp_err = \"\"\nUSER if input_tokens >= max_input_tokens * fudge:\nUSER inp_err = \" -- possibly exhausted context window!\"\nUSER \nUSER tot_err = \"\"\nUSER if total_tokens >= max_input_tokens * fudge:\nUSER tot_err = \" -- possibly exhausted context window!\"\nUSER \nUSER res = [\"\", \"\"]\nUSER res.append(f\"Model {self.main_model.name} has hit a token limit!\")\nUSER res.append(\"Token counts below are approximate.\")\nUSER res.append(\"\")\nUSER res.append(f\"Input tokens: ~{input_tokens:,} of {max_input_tokens:,}{inp_err}\")\nUSER res.append(f\"Output tokens: ~{output_tokens:,} of {max_output_tokens:,}{out_err}\")\nUSER res.append(f\"Total tokens: ~{total_tokens:,} of {max_input_tokens:,}{tot_err}\")\nUSER \nUSER if output_tokens >= max_output_tokens:\nUSER res.append(\"\")\nUSER res.append(\"To reduce output tokens:\")\nUSER res.append(\"- Ask for smaller changes in each request.\")\nUSER res.append(\"- Break your code into smaller source files.\")\nUSER if \"diff\" not in self.main_model.edit_format:\nUSER res.append(\"- Use a stronger model that can return diffs.\")\nUSER \nUSER if input_tokens >= max_input_tokens or total_tokens >= max_input_tokens:\nUSER res.append(\"\")\nUSER res.append(\"To reduce input tokens:\")\nUSER res.append(\"- Use /tokens to see token usage.\")\nUSER res.append(\"- Use /drop to remove unneeded files from the chat session.\")\nUSER res.append(\"- Use /clear to clear the chat history.\")\nUSER res.append(\"- Break your code into smaller source files.\")\nUSER \nUSER res = \"\".join([line + \"\\n\" for line in res])\nUSER self.io.tool_error(res)\nUSER self.io.offer_url(urls.token_limits)\nUSER \nUSER def lint_edited(self, fnames):\nUSER res = \"\"\nUSER for fname in fnames:\nUSER if not fname:\nUSER continue\nUSER errors = self.linter.lint(self.abs_root_path(fname))\nUSER \nUSER if errors:\nUSER res += \"\\n\"\nUSER res += errors\nUSER res += \"\\n\"\nUSER \nUSER if res:\nUSER self.io.tool_warning(res)\nUSER \nUSER return res\nUSER \nUSER def add_assistant_reply_to_cur_messages(self):\nUSER if self.partial_response_content:\nUSER self.cur_messages += [dict(role=\"assistant\", content=self.partial_response_content)]\nUSER if self.partial_response_function_call:\nUSER self.cur_messages += [\nUSER dict(\nUSER role=\"assistant\",\nUSER content=None,\nUSER function_call=self.partial_response_function_call,\nUSER )\nUSER ]\nUSER \nUSER def get_file_mentions(self, content):\nUSER words = set(word for word in content.split())\nUSER \nUSER # drop sentence punctuation from the end\nUSER words = set(word.rstrip(\",.!;:?\") for word in words)\nUSER \nUSER # strip away all kinds of quotes\nUSER quotes = \"\".join(['\"', \"'\", \"`\"])\nUSER words = set(word.strip(quotes) for word in words)\nUSER \nUSER addable_rel_fnames = self.get_addable_relative_files()\nUSER \nUSER # Get basenames of files already in chat or read-only\nUSER existing_basenames = {os.path.basename(f) for f in self.get_inchat_relative_files()} | {\nUSER os.path.basename(self.get_rel_fname(f)) for f in self.abs_read_only_fnames\nUSER }\nUSER \nUSER mentioned_rel_fnames = set()\nUSER fname_to_rel_fnames = {}\nUSER for rel_fname in addable_rel_fnames:\nUSER # Skip files that share a basename with files already in chat\nUSER if os.path.basename(rel_fname) in existing_basenames:\nUSER continue\nUSER \nUSER normalized_rel_fname = rel_fname.replace(\"\\\\\", \"/\")\nUSER normalized_words = set(word.replace(\"\\\\\", \"/\") for word in words)\nUSER if normalized_rel_fname in normalized_words:\nUSER mentioned_rel_fnames.add(rel_fname)\nUSER \nUSER fname = os.path.basename(rel_fname)\nUSER \nUSER # Don't add basenames that could be plain words like \"run\" or \"make\"\nUSER if \"/\" in fname or \"\\\\\" in fname or \".\" in fname or \"_\" in fname or \"-\" in fname:\nUSER if fname not in fname_to_rel_fnames:\nUSER fname_to_rel_fnames[fname] = []\nUSER fname_to_rel_fnames[fname].append(rel_fname)\nUSER \nUSER for fname, rel_fnames in fname_to_rel_fnames.items():\nUSER if len(rel_fnames) == 1 and fname in words:\nUSER mentioned_rel_fnames.add(rel_fnames[0])\nUSER \nUSER return mentioned_rel_fnames\nUSER \nUSER def check_for_file_mentions(self, content):\nUSER mentioned_rel_fnames = self.get_file_mentions(content)\nUSER \nUSER new_mentions = mentioned_rel_fnames - self.ignore_mentions\nUSER \nUSER if not new_mentions:\nUSER return\nUSER \nUSER added_fnames = []\nUSER group = ConfirmGroup(new_mentions)\nUSER for rel_fname in sorted(new_mentions):\nUSER if self.io.confirm_ask(f\"Add {rel_fname} to the chat?\", group=group, allow_never=True):\nUSER self.add_rel_fname(rel_fname)\nUSER added_fnames.append(rel_fname)\nUSER else:\nUSER self.ignore_mentions.add(rel_fname)\nUSER \nUSER if added_fnames:\nUSER return prompts.added_files.format(fnames=\", \".join(added_fnames))\nUSER \nUSER def send(self, messages, model=None, functions=None):\nUSER if not model:\nUSER model = self.main_model\nUSER \nUSER self.partial_response_content = \"\"\nUSER self.partial_response_function_call = dict()\nUSER \nUSER self.io.log_llm_history(\"TO LLM\", format_messages(messages))\nUSER \nUSER if self.main_model.use_temperature:\nUSER temp = self.temperature\nUSER else:\nUSER temp = None\nUSER \nUSER completion = None\nUSER try:\nUSER hash_object, completion = send_completion(\nUSER model.name,\nUSER messages,\nUSER functions,\nUSER self.stream,\nUSER temp,\nUSER extra_params=model.extra_params,\nUSER )\nUSER self.chat_completion_call_hashes.append(hash_object.hexdigest())\nUSER \nUSER if self.stream:\nUSER yield from self.show_send_output_stream(completion)\nUSER else:\nUSER self.show_send_output(completion)\nUSER \nUSER # Calculate costs for successful responses\nUSER self.calculate_and_show_tokens_and_cost(messages, completion)\nUSER \nUSER except LiteLLMExceptions().exceptions_tuple() as err:\nUSER ex_info = LiteLLMExceptions().get_ex_info(err)\nUSER if ex_info.name == \"ContextWindowExceededError\":\nUSER # Still calculate costs for context window errors\nUSER self.calculate_and_show_tokens_and_cost(messages, completion)\nUSER raise\nUSER except KeyboardInterrupt as kbi:\nUSER self.keyboard_interrupt()\nUSER raise kbi\nUSER finally:\nUSER self.io.log_llm_history(\nUSER \"LLM RESPONSE\",\nUSER format_content(\"ASSISTANT\", self.partial_response_content),\nUSER )\nUSER \nUSER if self.partial_response_content:\nUSER self.io.ai_output(self.partial_response_content)\nUSER elif self.partial_response_function_call:\nUSER # TODO: push this into subclasses\nUSER args = self.parse_partial_args()\nUSER if args:\nUSER self.io.ai_output(json.dumps(args, indent=4))\nUSER \nUSER def show_send_output(self, completion):\nUSER if self.verbose:\nUSER print(completion)\nUSER \nUSER if not completion.choices:\nUSER self.io.tool_error(str(completion))\nUSER return\nUSER \nUSER show_func_err = None\nUSER show_content_err = None\nUSER try:\nUSER if completion.choices[0].message.tool_calls:\nUSER self.partial_response_function_call = (\nUSER completion.choices[0].message.tool_calls[0].function\nUSER )\nUSER except AttributeError as func_err:\nUSER show_func_err = func_err\nUSER \nUSER try:\nUSER self.partial_response_content = completion.choices[0].message.content or \"\"\nUSER except AttributeError as content_err:\nUSER show_content_err = content_err\nUSER \nUSER resp_hash = dict(\nUSER function_call=str(self.partial_response_function_call),\nUSER content=self.partial_response_content,\nUSER )\nUSER resp_hash = hashlib.sha1(json.dumps(resp_hash, sort_keys=True).encode())\nUSER self.chat_completion_response_hashes.append(resp_hash.hexdigest())\nUSER \nUSER if show_func_err and show_content_err:\nUSER self.io.tool_error(show_func_err)\nUSER self.io.tool_error(show_content_err)\nUSER raise Exception(\"No data found in LLM response!\")\nUSER \nUSER show_resp = self.render_incremental_response(True)\nUSER self.io.assistant_output(show_resp, pretty=self.show_pretty())\nUSER \nUSER if (\nUSER hasattr(completion.choices[0], \"finish_reason\")\nUSER and completion.choices[0].finish_reason == \"length\"\nUSER ):\nUSER raise FinishReasonLength()\nUSER \nUSER def show_send_output_stream(self, completion):\nUSER for chunk in completion:\nUSER if len(chunk.choices) == 0:\nUSER continue\nUSER \nUSER if (\nUSER hasattr(chunk.choices[0], \"finish_reason\")\nUSER and chunk.choices[0].finish_reason == \"length\"\nUSER ):\nUSER raise FinishReasonLength()\nUSER \nUSER try:\nUSER func = chunk.choices[0].delta.function_call\nUSER # dump(func)\nUSER for k, v in func.items():\nUSER if k in self.partial_response_function_call:\nUSER self.partial_response_function_call[k] += v\nUSER else:\nUSER self.partial_response_function_call[k] = v\nUSER except AttributeError:\nUSER pass\nUSER \nUSER try:\nUSER text = chunk.choices[0].delta.content\nUSER if text:\nUSER self.partial_response_content += text\nUSER except AttributeError:\nUSER text = None\nUSER \nUSER if self.show_pretty():\nUSER self.live_incremental_response(False)\nUSER elif text:\nUSER try:\nUSER sys.stdout.write(text)\nUSER except UnicodeEncodeError:\nUSER # Safely encode and decode the text\nUSER safe_text = text.encode(sys.stdout.encoding, errors=\"backslashreplace\").decode(\nUSER sys.stdout.encoding\nUSER )\nUSER sys.stdout.write(safe_text)\nUSER sys.stdout.flush()\nUSER yield text\nUSER \nUSER def live_incremental_response(self, final):\nUSER show_resp = self.render_incremental_response(final)\nUSER self.mdstream.update(show_resp, final=final)\nUSER \nUSER def render_incremental_response(self, final):\nUSER return self.get_multi_response_content()\nUSER \nUSER def calculate_and_show_tokens_and_cost(self, messages, completion=None):\nUSER prompt_tokens = 0\nUSER completion_tokens = 0\nUSER cache_hit_tokens = 0\nUSER cache_write_tokens = 0\nUSER \nUSER if completion and hasattr(completion, \"usage\") and completion.usage is not None:\nUSER prompt_tokens = completion.usage.prompt_tokens\nUSER completion_tokens = completion.usage.completion_tokens\nUSER cache_hit_tokens = getattr(completion.usage, \"prompt_cache_hit_tokens\", 0) or getattr(\nUSER completion.usage, \"cache_read_input_tokens\", 0\nUSER )\nUSER cache_write_tokens = getattr(completion.usage, \"cache_creation_input_tokens\", 0)\nUSER \nUSER if hasattr(completion.usage, \"cache_read_input_tokens\") or hasattr(\nUSER completion.usage, \"cache_creation_input_tokens\"\nUSER ):\nUSER self.message_tokens_sent += prompt_tokens\nUSER self.message_tokens_sent += cache_write_tokens\nUSER else:\nUSER self.message_tokens_sent += prompt_tokens\nUSER \nUSER else:\nUSER prompt_tokens = self.main_model.token_count(messages)\nUSER completion_tokens = self.main_model.token_count(self.partial_response_content)\nUSER self.message_tokens_sent += prompt_tokens\nUSER \nUSER self.message_tokens_received += completion_tokens\nUSER \nUSER tokens_report = f\"Tokens: {format_tokens(self.message_tokens_sent)} sent\"\nUSER \nUSER if cache_write_tokens:\nUSER tokens_report += f\", {format_tokens(cache_write_tokens)} cache write\"\nUSER if cache_hit_tokens:\nUSER tokens_report += f\", {format_tokens(cache_hit_tokens)} cache hit\"\nUSER tokens_report += f\", {format_tokens(self.message_tokens_received)} received.\"\nUSER \nUSER if not self.main_model.info.get(\"input_cost_per_token\"):\nUSER self.usage_report = tokens_report\nUSER return\nUSER \nUSER cost = 0\nUSER \nUSER input_cost_per_token = self.main_model.info.get(\"input_cost_per_token\") or 0\nUSER output_cost_per_token = self.main_model.info.get(\"output_cost_per_token\") or 0\nUSER input_cost_per_token_cache_hit = (\nUSER self.main_model.info.get(\"input_cost_per_token_cache_hit\") or 0\nUSER )\nUSER \nUSER # deepseek\nUSER # prompt_cache_hit_tokens + prompt_cache_miss_tokens\nUSER # == prompt_tokens == total tokens that were sent\nUSER #\nUSER # Anthropic\nUSER # cache_creation_input_tokens + cache_read_input_tokens + prompt\nUSER # == total tokens that were\nUSER \nUSER if input_cost_per_token_cache_hit:\nUSER # must be deepseek\nUSER cost += input_cost_per_token_cache_hit * cache_hit_tokens\nUSER cost += (prompt_tokens - input_cost_per_token_cache_hit) * input_cost_per_token\nUSER else:\nUSER # hard code the anthropic adjustments, no-ops for other models since cache_x_tokens==0\nUSER cost += cache_write_tokens * input_cost_per_token * 1.25\nUSER cost += cache_hit_tokens * input_cost_per_token * 0.10\nUSER cost += prompt_tokens * input_cost_per_token\nUSER \nUSER cost += completion_tokens * output_cost_per_token\nUSER \nUSER self.total_cost += cost\nUSER self.message_cost += cost\nUSER \nUSER def format_cost(value):\nUSER if value == 0:\nUSER return \"0.00\"\nUSER magnitude = abs(value)\nUSER if magnitude >= 0.01:\nUSER return f\"{value:.2f}\"\nUSER else:\nUSER return f\"{value:.{max(2, 2 - int(math.log10(magnitude)))}f}\"\nUSER \nUSER cost_report = (\nUSER f\"Cost: ${format_cost(self.message_cost)} message,\"\nUSER f\" ${format_cost(self.total_cost)} session.\"\nUSER )\nUSER \nUSER if self.add_cache_headers and self.stream:\nUSER warning = \" Use --no-stream for accurate caching costs.\"\nUSER self.usage_report = tokens_report + \"\\n\" + cost_report + warning\nUSER return\nUSER \nUSER if cache_hit_tokens and cache_write_tokens:\nUSER sep = \"\\n\"\nUSER else:\nUSER sep = \" \"\nUSER \nUSER self.usage_report = tokens_report + sep + cost_report\nUSER \nUSER def show_usage_report(self):\nUSER if not self.usage_report:\nUSER return\nUSER \nUSER self.io.tool_output(self.usage_report)\nUSER \nUSER prompt_tokens = self.message_tokens_sent\nUSER completion_tokens = self.message_tokens_received\nUSER self.event(\nUSER \"message_send\",\nUSER main_model=self.main_model,\nUSER edit_format=self.edit_format,\nUSER prompt_tokens=prompt_tokens,\nUSER completion_tokens=completion_tokens,\nUSER total_tokens=prompt_tokens + completion_tokens,\nUSER cost=self.message_cost,\nUSER total_cost=self.total_cost,\nUSER )\nUSER \nUSER self.message_cost = 0.0\nUSER self.message_tokens_sent = 0\nUSER self.message_tokens_received = 0\nUSER \nUSER def get_multi_response_content(self, final=False):\nUSER cur = self.multi_response_content or \"\"\nUSER new = self.partial_response_content or \"\"\nUSER \nUSER if new.rstrip() != new and not final:\nUSER new = new.rstrip()\nUSER return cur + new\nUSER \nUSER def get_rel_fname(self, fname):\nUSER try:\nUSER return os.path.relpath(fname, self.root)\nUSER except ValueError:\nUSER return fname\nUSER \nUSER def get_inchat_relative_files(self):\nUSER files = [self.get_rel_fname(fname) for fname in self.abs_fnames]\nUSER return sorted(set(files))\nUSER \nUSER def is_file_safe(self, fname):\nUSER try:\nUSER return Path(self.abs_root_path(fname)).is_file()\nUSER except OSError:\nUSER return\nUSER \nUSER def get_all_relative_files(self):\nUSER if self.repo:\nUSER files = self.repo.get_tracked_files()\nUSER else:\nUSER files = self.get_inchat_relative_files()\nUSER \nUSER # This is quite slow in large repos\nUSER # files = [fname for fname in files if self.is_file_safe(fname)]\nUSER \nUSER return sorted(set(files))\nUSER \nUSER def get_all_abs_files(self):\nUSER files = self.get_all_relative_files()\nUSER files = [self.abs_root_path(path) for path in files]\nUSER return files\nUSER \nUSER def get_addable_relative_files(self):\nUSER all_files = set(self.get_all_relative_files())\nUSER inchat_files = set(self.get_inchat_relative_files())\nUSER read_only_files = set(self.get_rel_fname(fname) for fname in self.abs_read_only_fnames)\nUSER return all_files - inchat_files - read_only_files\nUSER \nUSER def check_for_dirty_commit(self, path):\nUSER if not self.repo:\nUSER return\nUSER if not self.dirty_commits:\nUSER return\nUSER if not self.repo.is_dirty(path):\nUSER return\nUSER \nUSER # We need a committed copy of the file in order to /undo, so skip this\nUSER # fullp = Path(self.abs_root_path(path))\nUSER # if not fullp.stat().st_size:\nUSER # return\nUSER \nUSER self.io.tool_output(f\"Committing {path} before applying edits.\")\nUSER self.need_commit_before_edits.add(path)\nUSER \nUSER def allowed_to_edit(self, path):\nUSER full_path = self.abs_root_path(path)\nUSER if self.repo:\nUSER need_to_add = not self.repo.path_in_repo(path)\nUSER else:\nUSER need_to_add = False\nUSER \nUSER if full_path in self.abs_fnames:\nUSER self.check_for_dirty_commit(path)\nUSER return True\nUSER \nUSER if self.repo and self.repo.git_ignored_file(path):\nUSER self.io.tool_warning(f\"Skipping edits to {path} that matches gitignore spec.\")\nUSER return\nUSER \nUSER if not Path(full_path).exists():\nUSER if not self.io.confirm_ask(\"Create new file?\", subject=path):\nUSER self.io.tool_output(f\"Skipping edits to {path}\")\nUSER return\nUSER \nUSER if not self.dry_run:\nUSER if not utils.touch_file(full_path):\nUSER self.io.tool_error(f\"Unable to create {path}, skipping edits.\")\nUSER return\nUSER \nUSER # Seems unlikely that we needed to create the file, but it was\nUSER # actually already part of the repo.\nUSER # But let's only add if we need to, just to be safe.\nUSER if need_to_add:\nUSER self.repo.repo.git.add(full_path)\nUSER \nUSER self.abs_fnames.add(full_path)\nUSER self.check_added_files()\nUSER return True\nUSER \nUSER if not self.io.confirm_ask(\nUSER \"Allow edits to file that has not been added to the chat?\",\nUSER subject=path,\nUSER ):\nUSER self.io.tool_output(f\"Skipping edits to {path}\")\nUSER return\nUSER \nUSER if need_to_add:\nUSER self.repo.repo.git.add(full_path)\nUSER \nUSER self.abs_fnames.add(full_path)\nUSER self.check_added_files()\nUSER self.check_for_dirty_commit(path)\nUSER \nUSER return True\nUSER \nUSER warning_given = False\nUSER \nUSER def check_added_files(self):\nUSER if self.warning_given:\nUSER return\nUSER \nUSER warn_number_of_files = 4\nUSER warn_number_of_tokens = 20 * 1024\nUSER \nUSER num_files = len(self.abs_fnames)\nUSER if num_files < warn_number_of_files:\nUSER return\nUSER \nUSER tokens = 0\nUSER for fname in self.abs_fnames:\nUSER if is_image_file(fname):\nUSER continue\nUSER content = self.io.read_text(fname)\nUSER tokens += self.main_model.token_count(content)\nUSER \nUSER if tokens < warn_number_of_tokens:\nUSER return\nUSER \nUSER self.io.tool_warning(\"Warning: it's best to only add files that need changes to the chat.\")\nUSER self.io.tool_warning(urls.edit_errors)\nUSER self.warning_given = True\nUSER \nUSER def prepare_to_edit(self, edits):\nUSER res = []\nUSER seen = dict()\nUSER \nUSER self.need_commit_before_edits = set()\nUSER \nUSER for edit in edits:\nUSER path = edit[0]\nUSER if path is None:\nUSER res.append(edit)\nUSER continue\nUSER if path == \"python\":\nUSER dump(edits)\nUSER if path in seen:\nUSER allowed = seen[path]\nUSER else:\nUSER allowed = self.allowed_to_edit(path)\nUSER seen[path] = allowed\nUSER \nUSER if allowed:\nUSER res.append(edit)\nUSER \nUSER self.dirty_commit()\nUSER self.need_commit_before_edits = set()\nUSER \nUSER return res\nUSER \nUSER def apply_updates(self):\nUSER edited = set()\nUSER try:\nUSER edits = self.get_edits()\nUSER edits = self.apply_edits_dry_run(edits)\nUSER edits = self.prepare_to_edit(edits)\nUSER edited = set(edit[0] for edit in edits)\nUSER \nUSER self.apply_edits(edits)\nUSER except ValueError as err:\nUSER self.num_malformed_responses += 1\nUSER \nUSER err = err.args[0]\nUSER \nUSER self.io.tool_error(\"The LLM did not conform to the edit format.\")\nUSER self.io.tool_output(urls.edit_errors)\nUSER self.io.tool_output()\nUSER self.io.tool_output(str(err))\nUSER \nUSER self.reflected_message = str(err)\nUSER return edited\nUSER \nUSER except ANY_GIT_ERROR as err:\nUSER self.io.tool_error(str(err))\nUSER return edited\nUSER except Exception as err:\nUSER self.io.tool_error(\"Exception while updating files:\")\nUSER self.io.tool_error(str(err), strip=False)\nUSER \nUSER traceback.print_exc()\nUSER \nUSER self.reflected_message = str(err)\nUSER return edited\nUSER \nUSER for path in edited:\nUSER if self.dry_run:\nUSER self.io.tool_output(f\"Did not apply edit to {path} (--dry-run)\")\nUSER else:\nUSER self.io.tool_output(f\"Applied edit to {path}\")\nUSER \nUSER return edited\nUSER \nUSER def parse_partial_args(self):\nUSER # dump(self.partial_response_function_call)\nUSER \nUSER data = self.partial_response_function_call.get(\"arguments\")\nUSER if not data:\nUSER return\nUSER \nUSER try:\nUSER return json.loads(data)\nUSER except JSONDecodeError:\nUSER pass\nUSER \nUSER try:\nUSER return json.loads(data + \"]}\")\nUSER except JSONDecodeError:\nUSER pass\nUSER \nUSER try:\nUSER return json.loads(data + \"}]}\")\nUSER except JSONDecodeError:\nUSER pass\nUSER \nUSER try:\nUSER return json.loads(data + '\"}]}')\nUSER except JSONDecodeError:\nUSER pass\nUSER \nUSER # commits...\nUSER \nUSER def get_context_from_history(self, history):\nUSER context = \"\"\nUSER if history:\nUSER for msg in history:\nUSER context += \"\\n\" + msg[\"role\"].upper() + \": \" + msg[\"content\"] + \"\\n\"\nUSER \nUSER return context\nUSER \nUSER def auto_commit(self, edited, context=None):\nUSER if not self.repo or not self.auto_commits or self.dry_run:\nUSER return\nUSER \nUSER if not context:\nUSER context = self.get_context_from_history(self.cur_messages)\nUSER \nUSER try:\nUSER res = self.repo.commit(fnames=edited, context=context, aider_edits=True)\nUSER if res:\nUSER self.show_auto_commit_outcome(res)\nUSER commit_hash, commit_message = res\nUSER return self.gpt_prompts.files_content_gpt_edits.format(\nUSER hash=commit_hash,\nUSER message=commit_message,\nUSER )\nUSER \nUSER return self.gpt_prompts.files_content_gpt_no_edits\nUSER except ANY_GIT_ERROR as err:\nUSER self.io.tool_error(f\"Unable to commit: {str(err)}\")\nUSER return\nUSER \nUSER def show_auto_commit_outcome(self, res):\nUSER commit_hash, commit_message = res\nUSER self.last_aider_commit_hash = commit_hash\nUSER self.aider_commit_hashes.add(commit_hash)\nUSER self.last_aider_commit_message = commit_message\nUSER if self.show_diffs:\nUSER self.commands.cmd_diff()\nUSER \nUSER def show_undo_hint(self):\nUSER if not self.commit_before_message:\nUSER return\nUSER if self.commit_before_message[-1] != self.repo.get_head_commit_sha():\nUSER self.io.tool_output(\"You can use /undo to undo and discard each aider commit.\")\nUSER \nUSER def dirty_commit(self):\nUSER if not self.need_commit_before_edits:\nUSER return\nUSER if not self.dirty_commits:\nUSER return\nUSER if not self.repo:\nUSER return\nUSER \nUSER self.repo.commit(fnames=self.need_commit_before_edits)\nUSER \nUSER # files changed, move cur messages back behind the files messages\nUSER # self.move_back_cur_messages(self.gpt_prompts.files_content_local_edits)\nUSER return True\nUSER \nUSER def get_edits(self, mode=\"update\"):\nUSER return []\nUSER \nUSER def apply_edits(self, edits):\nUSER return\nUSER \nUSER def apply_edits_dry_run(self, edits):\nUSER return edits\nUSER \nUSER def run_shell_commands(self):\nUSER if not self.suggest_shell_commands:\nUSER return \"\"\nUSER \nUSER done = set()\nUSER group = ConfirmGroup(set(self.shell_commands))\nUSER accumulated_output = \"\"\nUSER for command in self.shell_commands:\nUSER if command in done:\nUSER continue\nUSER done.add(command)\nUSER output = self.handle_shell_commands(command, group)\nUSER if output:\nUSER accumulated_output += output + \"\\n\\n\"\nUSER return accumulated_output\nUSER \nUSER def handle_shell_commands(self, commands_str, group):\nUSER commands = commands_str.strip().splitlines()\nUSER command_count = sum(\nUSER 1 for cmd in commands if cmd.strip() and not cmd.strip().startswith(\"#\")\nUSER )\nUSER prompt = \"Run shell command?\" if command_count == 1 else \"Run shell commands?\"\nUSER if not self.io.confirm_ask(\nUSER prompt,\nUSER subject=\"\\n\".join(commands),\nUSER explicit_yes_required=True,\nUSER group=group,\nUSER allow_never=True,\nUSER ):\nUSER return\nUSER \nUSER accumulated_output = \"\"\nUSER for command in commands:\nUSER command = command.strip()\nUSER if not command or command.startswith(\"#\"):\nUSER continue\nUSER \nUSER self.io.tool_output()\nUSER self.io.tool_output(f\"Running {command}\")\nUSER # Add the command to input history\nUSER self.io.add_to_input_history(f\"/run {command.strip()}\")\nUSER exit_status, output = run_cmd(command, error_print=self.io.tool_error, cwd=self.root)\nUSER if output:\nUSER accumulated_output += f\"Output from {command}\\n{output}\\n\"\nUSER \nUSER if accumulated_output.strip() and self.io.confirm_ask(\nUSER \"Add command output to the chat?\", allow_never=True\nUSER ):\nUSER num_lines = len(accumulated_output.strip().splitlines())\nUSER line_plural = \"line\" if num_lines == 1 else \"lines\"\nUSER self.io.tool_output(f\"Added {num_lines} {line_plural} of output to the chat.\")\nUSER return accumulated_output\nUSER ```\n-------\nASSISTANT Ok, I will use that as the true, current contents of the files.\n-------\nUSER i'd like to check the tokens that will be sent to the llm before sending a message. is there a logical place to do this?\n-------\nUSER ^C KeyboardInterrupt\n-------\nASSISTANT I see that you interrupted my previous reply.\n-------\nUSER i'd like to check the tokens that will be sent to the llm before sending a message. is there a logical place to do this?"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737945714} +{"event": "command_reset", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737945766} +{"event": "ai-comments file-add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737945826} +{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737945826} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737945826} +{"event": "command_model", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737945835} +{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737945839} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737945839} +{"event": "message_send_exception", "properties": {"exception": "Messages don't properly alternate user/assistant:\n\n-------\nSYSTEM type: text\nSYSTEM text: Act as an expert code analyst.\nAnswer questions about the supplied code.\nAlways reply to the user in the same language they are using.\n\nDescribe code changes however you like. Don't use SEARCH/REPLACE blocks!\nSYSTEM cache_control: {'type': 'ephemeral'}\n-------\nUSER I am working with you on code in a git repository.\nUSER Here are summaries of some files present in my git repo.\nUSER If you need to see the full contents of any files to answer my questions, ask me to *add them to the chat*.\nUSER \nUSER aider/analytics.py:\nUSER \u22ee...\nUSER \u2502def compute_hex_threshold(percent):\nUSER \u22ee...\nUSER \u2502def is_uuid_in_percentage(uuid_str, percent):\nUSER \u22ee...\nUSER \u2502class Analytics:\nUSER \u2502 # providers\nUSER \u2502 mp = None\nUSER \u22ee...\nUSER \u2502 def disable(self, permanently):\nUSER \u22ee...\nUSER \u2502 def get_data_file_path(self):\nUSER \u22ee...\nUSER \u2502 def get_or_create_uuid(self):\nUSER \u22ee...\nUSER \u2502 def load_data(self):\nUSER \u22ee...\nUSER \u2502 def save_data(self):\nUSER \u22ee...\nUSER \u2502 def get_system_info(self):\nUSER \u22ee...\nUSER \u2502 def event(self, event_name, main_model=None, **kwargs):\nUSER \u22ee...\nUSER \nUSER aider/args.py:\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER aider/coders/base_prompts.py:\nUSER \u2502class CoderPrompts:\nUSER \u22ee...\nUSER \nUSER aider/coders/chat_chunks.py:\nUSER \u22ee...\nUSER \u2502@dataclass\nUSER \u2502class ChatChunks:\nUSER \u2502 system: List = field(default_factory=list)\nUSER \u22ee...\nUSER \u2502 def all_messages(self):\nUSER \u22ee...\nUSER \u2502 def add_cache_control(self, messages):\nUSER \u22ee...\nUSER \nUSER aider/coders/editblock_coder.py:\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER aider/coders/help_prompts.py:\nUSER \u22ee...\nUSER \u2502class HelpPrompts(CoderPrompts):\nUSER \u22ee...\nUSER \nUSER aider/coders/search_replace.py:\nUSER \u22ee...\nUSER \u2502def read_text(fname):\nUSER \u22ee...\nUSER \u2502def main(dnames):\nUSER \u22ee...\nUSER \nUSER aider/coders/wholefile_coder.py:\nUSER \u22ee...\nUSER \u2502class WholeFileCoder(Coder):\nUSER \u2502 \"\"\"A coder that operates on entire files for code modifications.\"\"\"\nUSER \u2502\nUSER \u22ee...\nUSER \u2502 def render_incremental_response(self, final):\nUSER \u22ee...\nUSER \nUSER aider/commands.py:\nUSER \u22ee...\nUSER \u2502class Commands:\nUSER \u2502 voice = None\nUSER \u22ee...\nUSER \u2502 def get_raw_completions(self, cmd):\nUSER \u22ee...\nUSER \u2502 def get_completions(self, cmd):\nUSER \u22ee...\nUSER \u2502 def get_commands(self):\nUSER \u22ee...\nUSER \u2502 def matching_commands(self, inp):\nUSER \u22ee...\nUSER \u2502 def run(self, inp):\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER aider/copypaste.py:\nUSER \u22ee...\nUSER \u2502class ClipboardWatcher:\nUSER \u2502 \"\"\"Watches clipboard for changes and updates IO placeholder\"\"\"\nUSER \u2502\nUSER \u22ee...\nUSER \u2502 def start(self):\nUSER \u22ee...\nUSER \u2502 def stop(self):\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER aider/diffs.py:\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER aider/dump.py:\nUSER \u22ee...\nUSER \u2502def cvt(s):\nUSER \u22ee...\nUSER \u2502def dump(*vals):\nUSER \u22ee...\nUSER \nUSER aider/exceptions.py:\nUSER \u22ee...\nUSER \u2502@dataclass\nUSER \u2502class ExInfo:\nUSER \u22ee...\nUSER \u2502class LiteLLMExceptions:\nUSER \u2502 exceptions = dict()\nUSER \u2502\nUSER \u22ee...\nUSER \u2502 def exceptions_tuple(self):\nUSER \u22ee...\nUSER \u2502 def get_ex_info(self, ex):\nUSER \u22ee...\nUSER \nUSER aider/gui.py:\nUSER \u22ee...\nUSER \u2502class CaptureIO(InputOutput):\nUSER \u2502 lines = []\nUSER \u2502\nUSER \u2502 def tool_output(self, msg, log_only=False):\nUSER \u22ee...\nUSER \u2502 def tool_error(self, msg):\nUSER \u22ee...\nUSER \u2502 def tool_warning(self, msg):\nUSER \u22ee...\nUSER \u2502 def get_captured_lines(self):\nUSER \u22ee...\nUSER \u2502class State:\nUSER \u2502 keys = set()\nUSER \u2502\nUSER \u2502 def init(self, key, val=None):\nUSER \u22ee...\nUSER \u2502class GUI:\nUSER \u2502 prompt = None\nUSER \u22ee...\nUSER \u2502 def show_edit_info(self, edit):\nUSER \u22ee...\nUSER \u2502 def add_undo(self, commit_hash):\nUSER \u22ee...\nUSER \u2502 def button(self, args, **kwargs):\nUSER \u22ee...\nUSER \u2502 def prompt_pending(self):\nUSER \u22ee...\nUSER \u2502 def info(self, message, echo=True):\nUSER \u22ee...\nUSER \nUSER aider/history.py:\nUSER \u22ee...\nUSER \u2502class ChatSummary:\nUSER \u2502 def __init__(self, models=None, max_tokens=1024):\nUSER \u2502 if not models:\nUSER \u2502 raise ValueError(\"At least one model must be provided\")\nUSER \u2502 self.models = models if isinstance(models, list) else [models]\nUSER \u2502 self.max_tokens = max_tokens\nUSER \u22ee...\nUSER \u2502 def tokenize(self, messages):\nUSER \u22ee...\nUSER \u2502 def summarize_all(self, messages):\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER aider/io.py:\nUSER \u22ee...\nUSER \u2502@dataclass\nUSER \u2502class ConfirmGroup:\nUSER \u22ee...\nUSER \u2502class AutoCompleter(Completer):\nUSER \u2502 def __init__(\nUSER \u2502 self, root, rel_fnames, addable_rel_fnames, commands, encoding, abs_read_only_fnames=None\nUSER \u22ee...\nUSER \u2502 def tokenize(self):\nUSER \u22ee...\nUSER \u2502 def get_command_completions(self, document, complete_event, text, words):\nUSER \u22ee...\nUSER \u2502 def get_completions(self, document, complete_event):\nUSER \u22ee...\nUSER \u2502class InputOutput:\nUSER \u2502 num_error_outputs = 0\nUSER \u22ee...\nUSER \u2502 def read_image(self, filename):\nUSER \u22ee...\nUSER \u2502 def read_text(self, filename, silent=False):\nUSER \u22ee...\nUSER \u2502 def write_text(self, filename, content, max_retries=5, initial_delay=0.1):\nUSER \u22ee...\nUSER \u2502 def rule(self):\nUSER \u22ee...\nUSER \u2502 def get_input(\nUSER \u2502 self,\nUSER \u2502 root,\nUSER \u2502 rel_fnames,\nUSER \u2502 addable_rel_fnames,\nUSER \u2502 commands,\nUSER \u2502 abs_read_only_fnames=None,\nUSER \u2502 edit_format=None,\nUSER \u2502 ):\nUSER \u2502 self.rule()\nUSER \u2502\nUSER \u22ee...\nUSER \u2502 def suspend_to_bg(event):\nUSER \u22ee...\nUSER \u2502 def add_to_input_history(self, inp):\nUSER \u22ee...\nUSER \u2502 def log_llm_history(self, role, content):\nUSER \u22ee...\nUSER \u2502 def display_user_input(self, inp):\nUSER \u22ee...\nUSER \u2502 def user_input(self, inp, log_only=True):\nUSER \u22ee...\nUSER \u2502 def ai_output(self, content):\nUSER \u22ee...\nUSER \u2502 def offer_url(self, url, prompt=\"Open URL for more info?\", allow_never=True):\nUSER \u22ee...\nUSER \u2502 def confirm_ask(\nUSER \u2502 self,\nUSER \u2502 question,\nUSER \u2502 default=\"y\",\nUSER \u2502 subject=None,\nUSER \u2502 explicit_yes_required=False,\nUSER \u2502 group=None,\nUSER \u2502 allow_never=False,\nUSER \u22ee...\nUSER \u2502 def tool_error(self, message=\"\", strip=True):\nUSER \u22ee...\nUSER \u2502 def tool_warning(self, message=\"\", strip=True):\nUSER \u22ee...\nUSER \u2502 def tool_output(self, *messages, log_only=False, bold=False):\nUSER \u22ee...\nUSER \u2502 def print(self, message=\"\"):\nUSER \u22ee...\nUSER \u2502 def append_chat_history(self, text, linebreak=False, blockquote=False, strip=True):\nUSER \u22ee...\nUSER \u2502 def format_files_for_input(self, rel_fnames, rel_read_only_fnames):\nUSER \u22ee...\nUSER \u2502def get_rel_fname(fname, root):\nUSER \u22ee...\nUSER \nUSER aider/linter.py:\nUSER \u22ee...\nUSER \u2502class Linter:\nUSER \u2502 def __init__(self, encoding=\"utf-8\", root=None):\nUSER \u2502 self.encoding = encoding\nUSER \u2502 self.root = root\nUSER \u2502\nUSER \u2502 self.languages = dict(\nUSER \u2502 python=self.py_lint,\nUSER \u2502 )\nUSER \u22ee...\nUSER \u2502 def get_rel_fname(self, fname):\nUSER \u22ee...\nUSER \u2502 def run_cmd(self, cmd, rel_fname, code):\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER aider/main.py:\nUSER \u22ee...\nUSER \u2502def main(argv=None, input=None, output=None, force_git_root=None, return_coder=False):\nUSER \u22ee...\nUSER \nUSER aider/mdstream.py:\nUSER \u22ee...\nUSER \u2502class MarkdownStream:\nUSER \u2502 \"\"\"Streaming markdown renderer that progressively displays content with a live updating window.\nUSER \u2502\nUSER \u2502 Uses rich.console and rich.live to render markdown content with smooth scrolling\nUSER \u2502 and partial updates. Maintains a sliding window of visible content while streaming\nUSER \u2502 in new markdown text.\nUSER \u22ee...\nUSER \u2502 def update(self, text, final=False):\nUSER \u22ee...\nUSER \nUSER aider/models.py:\nUSER \u22ee...\nUSER \u2502@dataclass\nUSER \u2502class ModelSettings:\nUSER \u22ee...\nUSER \u2502class ModelInfoManager:\nUSER \u2502 MODEL_INFO_URL = (\nUSER \u2502 \"https://raw.githubusercontent.com/BerriAI/litellm/main/\"\nUSER \u2502 \"model_prices_and_context_window.json\"\nUSER \u22ee...\nUSER \u2502 def get_model_from_cached_json_db(self, model):\nUSER \u22ee...\nUSER \u2502class Model(ModelSettings):\nUSER \u2502 def __init__(self, model, weak_model=None, editor_model=None, editor_edit_format=None):\nUSER \u2502 # Map any alias to its canonical name\nUSER \u2502 model = MODEL_ALIASES.get(model, model)\nUSER \u2502\nUSER \u2502 self.name = model\nUSER \u2502\nUSER \u2502 self.max_chat_history_tokens = 1024\nUSER \u2502 self.weak_model = None\nUSER \u2502 self.editor_model = None\nUSER \u2502\nUSER \u22ee...\nUSER \u2502 def token_count(self, messages):\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER aider/repo.py:\nUSER \u22ee...\nUSER \u2502class GitRepo:\nUSER \u2502 repo = None\nUSER \u22ee...\nUSER \u2502 def commit(self, fnames=None, context=None, message=None, aider_edits=False):\nUSER \u22ee...\nUSER \u2502 def get_tracked_files(self):\nUSER \u22ee...\nUSER \u2502 def normalize_path(self, path):\nUSER \u22ee...\nUSER \u2502 def git_ignored_file(self, path):\nUSER \u22ee...\nUSER \u2502 def ignored_file(self, fname):\nUSER \u22ee...\nUSER \u2502 def path_in_repo(self, path):\nUSER \u22ee...\nUSER \u2502 def abs_root_path(self, path):\nUSER \u22ee...\nUSER \u2502 def is_dirty(self, path=None):\nUSER \u22ee...\nUSER \u2502 def get_head_commit_sha(self, short=False):\nUSER \u22ee...\nUSER \nUSER aider/repomap.py:\nUSER \u22ee...\nUSER \u2502class RepoMap:\nUSER \u2502 CACHE_VERSION = 3\nUSER \u22ee...\nUSER \u2502 def token_count(self, text):\nUSER \u22ee...\nUSER \u2502 def get_repo_map(\nUSER \u2502 self,\nUSER \u2502 chat_files,\nUSER \u2502 other_files,\nUSER \u2502 mentioned_fnames=None,\nUSER \u2502 mentioned_idents=None,\nUSER \u2502 force_refresh=False,\nUSER \u22ee...\nUSER \u2502 def get_rel_fname(self, fname):\nUSER \u22ee...\nUSER \nUSER aider/report.py:\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER aider/run_cmd.py:\nUSER \u22ee...\nUSER \u2502def run_cmd(command, verbose=False, error_print=None, cwd=None):\nUSER \u22ee...\nUSER \nUSER aider/scrape.py:\nUSER \u22ee...\nUSER \u2502class Scraper:\nUSER \u2502 pandoc_available = None\nUSER \u22ee...\nUSER \u2502 def scrape(self, url):\nUSER \u22ee...\nUSER \u2502def main(url):\nUSER \u22ee...\nUSER \nUSER aider/utils.py:\nUSER \u22ee...\nUSER \u2502def is_image_file(file_name):\nUSER \u22ee...\nUSER \u2502def safe_abs_path(res):\nUSER \u22ee...\nUSER \u2502def format_messages(messages, title=None):\nUSER \u22ee...\nUSER \u2502def format_tokens(count):\nUSER \u22ee...\nUSER \u2502def touch_file(fname):\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER aider/watch.py:\nUSER \u22ee...\nUSER \u2502class FileWatcher:\nUSER \u2502 \"\"\"Watches source files for changes and AI comments\"\"\"\nUSER \u2502\nUSER \u22ee...\nUSER \u2502 def start(self):\nUSER \u22ee...\nUSER \u2502 def stop(self):\nUSER \u22ee...\nUSER \u2502 def process_changes(self):\nUSER \u22ee...\nUSER \u2502 def get_ai_comments(self, filepath):\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER benchmark/benchmark.py:\nUSER \u22ee...\nUSER \u2502@app.command()\nUSER \u2502def main(\nUSER \u2502 dirnames: Optional[List[str]] = typer.Argument(None, help=\"Directory names\"),\nUSER \u2502 graphs: bool = typer.Option(False, \"--graphs\", help=\"Generate graphs\"),\nUSER \u2502 model: str = typer.Option(\"gpt-3.5-turbo\", \"--model\", \"-m\", help=\"Model name\"),\nUSER \u2502 sleep: float = typer.Option(\nUSER \u2502 0, \"--sleep\", help=\"Sleep seconds between tests when single threaded\"\nUSER \u2502 ),\nUSER \u2502 languages: str = typer.Option(\nUSER \u2502 None, \"--languages\", \"-l\", help=\"Only run tests for specific languages (comma separated)\"\nUSER \u2502 ),\nUSER \u22ee...\nUSER \nUSER benchmark/over_time.py:\nUSER \u22ee...\nUSER \u2502class BenchmarkPlotter:\nUSER \u2502 LABEL_FONT_SIZE = 16\nUSER \u2502\nUSER \u22ee...\nUSER \u2502 def load_data(self, yaml_file: str) -> List[ModelData]:\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER benchmark/refactor_tools.py:\nUSER \u22ee...\nUSER \u2502def main(paths):\nUSER \u22ee...\nUSER \nUSER benchmark/rungrid.py:\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \u2502def run(dirname, model, edit_format):\nUSER \u22ee...\nUSER \nUSER scripts/blame.py:\nUSER \u22ee...\nUSER \u2502def run(cmd):\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER scripts/issues.py:\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER scripts/update-history.py:\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER scripts/versionbump.py:\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER scripts/yank-old-versions.py:\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\nUSER \nUSER tests/basic/test_watch.py:\nUSER \u22ee...\nUSER \u2502def test_ai_comment_pattern():\nUSER \u2502 # Create minimal IO and Coder instances for testing\nUSER \u2502 class MinimalCoder:\nUSER \u2502 def __init__(self, io):\nUSER \u2502 self.io = io\nUSER \u2502 self.root = \".\"\nUSER \u2502 self.abs_fnames = set()\nUSER \u2502\nUSER \u2502 def get_rel_fname(self, fname):\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/c/test.c:\nUSER \u22ee...\nUSER \u2502int main() {\nUSER \u2502 printf(\"Hello, World!\\n\");\nUSER \u2502 return 0;\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/cpp/test.cpp:\nUSER \u22ee...\nUSER \u2502int main() {\nUSER \u2502 std::cout << \"Hello, World!\" << std::endl;\nUSER \u2502 return 0;\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/csharp/test.cs:\nUSER \u22ee...\nUSER \u2502namespace Greetings {\nUSER \u2502 public interface IGreeter {\nUSER \u2502 string Greet(string name);\nUSER \u2502 }\nUSER \u2502\nUSER \u2502 public class Person {\nUSER \u2502 public string Name { get; set; }\nUSER \u2502 public int Age { get; set; }\nUSER \u2502\nUSER \u2502 public Person(string name, int age) {\nUSER \u2502 Name = name;\nUSER \u2502 Age = age;\nUSER \u2502 }\nUSER \u22ee...\nUSER \u2502 public class FormalGreeter : IGreeter {\nUSER \u2502 private const string PREFIX = \"Good day\";\nUSER \u2502 private static readonly int MAX_AGE = 150;\nUSER \u2502\nUSER \u2502 public string Greet(string name) {\nUSER \u2502 return $\"{PREFIX}, {name}!\";\nUSER \u2502 }\nUSER \u2502\nUSER \u2502 public string GreetPerson(Person person) {\nUSER \u2502 return $\"{PREFIX}, {person.Name} ({person.Age})!\";\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/elisp/test.el:\nUSER \u22ee...\nUSER \u2502(defun main ()\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/elixir/test.ex:\nUSER \u2502defmodule Greeter do\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/elm/test.elm:\nUSER \u22ee...\nUSER \u2502type Greeting\nUSER \u22ee...\nUSER \u2502greet style person =\nUSER \u22ee...\nUSER \u2502main =\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/go/test.go:\nUSER \u22ee...\nUSER \u2502type Person struct {\nUSER \u2502 Name string\nUSER \u2502 Age int\nUSER \u22ee...\nUSER \u2502type Greeter interface {\nUSER \u2502 Greet(p Person) string\nUSER \u22ee...\nUSER \u2502type FormalGreeter struct {\nUSER \u2502 Prefix string\nUSER \u22ee...\nUSER \u2502}\nUSER \u2502\nUSER \u2502func main() {\nUSER \u2502 greeter := NewFormalGreeter()\nUSER \u2502 person := Person{Name: DefaultName, Age: 42}\nUSER \u2502 fmt.Println(greeter.Greet(person))\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/java/test.java:\nUSER \u2502public interface Greeting {\nUSER \u2502 String greet(String name);\nUSER \u22ee...\nUSER \u2502public class Test implements Greeting {\nUSER \u2502 private String prefix = \"Hello\";\nUSER \u2502\nUSER \u2502 public String greet(String name) {\nUSER \u2502 return prefix + \", \" + name + \"!\";\nUSER \u2502 }\nUSER \u2502\nUSER \u2502 public static void main(String[] args) {\nUSER \u2502 Test greeter = new Test();\nUSER \u2502 System.out.println(greeter.greet(\"World\"));\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/javascript/test.js:\nUSER \u22ee...\nUSER \u2502class Person {\nUSER \u2502 constructor(name) {\nUSER \u2502 this.name = name;\nUSER \u2502 }\nUSER \u2502\nUSER \u2502 sayHello() {\nUSER \u2502 return `Hello, ${this.name}!`;\nUSER \u2502 }\nUSER \u22ee...\nUSER \u2502function greet(person) {\nUSER \u2502 return person.sayHello();\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/kotlin/test.kt:\nUSER \u2502interface Greeting {\nUSER \u2502 fun greet(name: String): String\nUSER \u22ee...\nUSER \u2502class Test : Greeting {\nUSER \u2502 private val prefix = \"Hello\"\nUSER \u2502\nUSER \u2502 override fun greet(name: String): String {\nUSER \u2502 return \"$prefix, $name!\"\nUSER \u2502 }\nUSER \u22ee...\nUSER \u2502fun main(args: Array) {\nUSER \u2502 val greeter = Test()\nUSER \u2502 println(greeter.greet(\"World\"))\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/ocaml/test.ml:\nUSER \u22ee...\nUSER \u2502module Greeter = struct\nUSER \u2502 type person = {\nUSER \u2502 name: string;\nUSER \u2502 age: int\nUSER \u2502 }\nUSER \u2502\nUSER \u2502 let create_person name age =\nUSER \u2502 {name; age}\nUSER \u2502\nUSER \u2502 let greet person =\nUSER \u2502 Printf.printf \"Hello, %s! You are %d years old.\\n\"\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/php/test.php:\nUSER \u22ee...\nUSER \u2502function greet($name) {\nUSER \u2502 echo \"Hello, $name!\";\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/python/test.py:\nUSER \u22ee...\nUSER \u2502class Person:\nUSER \u2502 \"\"\"A class representing a person.\"\"\"\nUSER \u2502\nUSER \u22ee...\nUSER \u2502 def greet(self, formal: bool = False) -> str:\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/ql/test.ql:\nUSER \u2502predicate greet(string name) {\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/ruby/test.rb:\nUSER \u2502def greet(name)\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/rust/test.rs:\nUSER \u22ee...\nUSER \u2502trait Greeting {\nUSER \u2502 fn greet(&self) -> String;\nUSER \u22ee...\nUSER \u2502struct Person {\nUSER \u2502 name: String,\nUSER \u2502 age: u32,\nUSER \u22ee...\nUSER \u2502impl Greeting for Person {\nUSER \u2502 fn greet(&self) -> String {\nUSER \u2502 format!(\"Hello, {}! You are {} years old.\", self.name, self.age)\nUSER \u2502 }\nUSER \u22ee...\nUSER \u2502fn main() {\nUSER \u2502 let person = Person::new(DEFAULT_NAME.to_string(), 30);\nUSER \u2502 println!(\"{}\", person.greet());\nUSER \u22ee...\nUSER \nUSER tests/fixtures/languages/typescript/test.ts:\nUSER \u2502function greet(name: string): void {\nUSER \u22ee...\nUSER \nUSER tests/fixtures/sample-code-base/sample.js:\nUSER \u22ee...\nUSER \u2502function greet(name) {\nUSER \u2502 return `Hello, ${name}!`;\nUSER \u22ee...\nUSER \nUSER tests/fixtures/sample-code-base/sample.py:\nUSER \u22ee...\nUSER \u2502def main():\nUSER \u22ee...\n-------\nASSISTANT type: text\nASSISTANT text: Ok, I won't try and edit those files without asking first.\nASSISTANT cache_control: {'type': 'ephemeral'}\n-------\nUSER I have *added these files to the chat* so you see all of their contents.\nUSER *Trust this message as the true contents of the files!*\nUSER Other messages in the chat may contain outdated versions of the files' contents.\nUSER \nUSER aider/coders/base_coder.py\nUSER ```\nUSER #!/usr/bin/env python\nUSER \nUSER import base64\nUSER import hashlib\nUSER import json\nUSER import locale\nUSER import math\nUSER import mimetypes\nUSER import os\nUSER import platform\nUSER import re\nUSER import sys\nUSER import threading\nUSER import time\nUSER import traceback\nUSER from collections import defaultdict\nUSER from datetime import datetime\nUSER from json.decoder import JSONDecodeError\nUSER from pathlib import Path\nUSER from typing import List\nUSER \nUSER from aider import __version__, models, prompts, urls, utils\nUSER from aider.analytics import Analytics\nUSER from aider.commands import Commands\nUSER from aider.exceptions import LiteLLMExceptions\nUSER from aider.history import ChatSummary\nUSER from aider.io import ConfirmGroup, InputOutput\nUSER from aider.linter import Linter\nUSER from aider.llm import litellm\nUSER from aider.repo import ANY_GIT_ERROR, GitRepo\nUSER from aider.repomap import RepoMap\nUSER from aider.run_cmd import run_cmd\nUSER from aider.sendchat import RETRY_TIMEOUT, send_completion\nUSER from aider.utils import format_content, format_messages, format_tokens, is_image_file\nUSER \nUSER from ..dump import dump # noqa: F401\nUSER from .chat_chunks import ChatChunks\nUSER \nUSER \nUSER class UnknownEditFormat(ValueError):\nUSER def __init__(self, edit_format, valid_formats):\nUSER self.edit_format = edit_format\nUSER self.valid_formats = valid_formats\nUSER super().__init__(\nUSER f\"Unknown edit format {edit_format}. Valid formats are: {', '.join(valid_formats)}\"\nUSER )\nUSER \nUSER \nUSER class MissingAPIKeyError(ValueError):\nUSER pass\nUSER \nUSER \nUSER class FinishReasonLength(Exception):\nUSER pass\nUSER \nUSER \nUSER def wrap_fence(name):\nUSER return f\"<{name}>\", f\"\"\nUSER \nUSER \nUSER all_fences = [\nUSER (\"`\" * 3, \"`\" * 3),\nUSER (\"`\" * 4, \"`\" * 4),\nUSER wrap_fence(\"source\"),\nUSER wrap_fence(\"code\"),\nUSER wrap_fence(\"pre\"),\nUSER wrap_fence(\"codeblock\"),\nUSER wrap_fence(\"sourcecode\"),\nUSER ]\nUSER \nUSER \nUSER class Coder:\nUSER abs_fnames = None\nUSER abs_read_only_fnames = None\nUSER repo = None\nUSER last_aider_commit_hash = None\nUSER aider_edited_files = None\nUSER last_asked_for_commit_time = 0\nUSER repo_map = None\nUSER functions = None\nUSER num_exhausted_context_windows = 0\nUSER num_malformed_responses = 0\nUSER last_keyboard_interrupt = None\nUSER num_reflections = 0\nUSER max_reflections = 3\nUSER edit_format = None\nUSER yield_stream = False\nUSER temperature = 0\nUSER auto_lint = True\nUSER auto_test = False\nUSER test_cmd = None\nUSER lint_outcome = None\nUSER test_outcome = None\nUSER multi_response_content = \"\"\nUSER partial_response_content = \"\"\nUSER commit_before_message = []\nUSER message_cost = 0.0\nUSER message_tokens_sent = 0\nUSER message_tokens_received = 0\nUSER add_cache_headers = False\nUSER cache_warming_thread = None\nUSER num_cache_warming_pings = 0\nUSER suggest_shell_commands = True\nUSER detect_urls = True\nUSER ignore_mentions = None\nUSER chat_language = None\nUSER file_watcher = None\nUSER \nUSER @classmethod\nUSER def create(\nUSER self,\nUSER main_model=None,\nUSER edit_format=None,\nUSER io=None,\nUSER from_coder=None,\nUSER summarize_from_coder=True,\nUSER **kwargs,\nUSER ):\nUSER import aider.coders as coders\nUSER \nUSER if not main_model:\nUSER if from_coder:\nUSER main_model = from_coder.main_model\nUSER else:\nUSER main_model = models.Model(models.DEFAULT_MODEL_NAME)\nUSER \nUSER if edit_format == \"code\":\nUSER edit_format = None\nUSER if edit_format is None:\nUSER if from_coder:\nUSER edit_format = from_coder.edit_format\nUSER else:\nUSER edit_format = main_model.edit_format\nUSER \nUSER if not io and from_coder:\nUSER io = from_coder.io\nUSER \nUSER if from_coder:\nUSER use_kwargs = dict(from_coder.original_kwargs) # copy orig kwargs\nUSER \nUSER # If the edit format changes, we can't leave old ASSISTANT\nUSER # messages in the chat history. The old edit format will\nUSER # confused the new LLM. It may try and imitate it, disobeying\nUSER # the system prompt.\nUSER done_messages = from_coder.done_messages\nUSER if edit_format != from_coder.edit_format and done_messages and summarize_from_coder:\nUSER done_messages = from_coder.summarizer.summarize_all(done_messages)\nUSER \nUSER # Bring along context from the old Coder\nUSER update = dict(\nUSER fnames=list(from_coder.abs_fnames),\nUSER read_only_fnames=list(from_coder.abs_read_only_fnames), # Copy read-only files\nUSER done_messages=done_messages,\nUSER cur_messages=from_coder.cur_messages,\nUSER aider_commit_hashes=from_coder.aider_commit_hashes,\nUSER commands=from_coder.commands.clone(),\nUSER total_cost=from_coder.total_cost,\nUSER ignore_mentions=from_coder.ignore_mentions,\nUSER file_watcher=from_coder.file_watcher,\nUSER )\nUSER use_kwargs.update(update) # override to complete the switch\nUSER use_kwargs.update(kwargs) # override passed kwargs\nUSER \nUSER kwargs = use_kwargs\nUSER \nUSER for coder in coders.__all__:\nUSER if hasattr(coder, \"edit_format\") and coder.edit_format == edit_format:\nUSER res = coder(main_model, io, **kwargs)\nUSER res.original_kwargs = dict(kwargs)\nUSER return res\nUSER \nUSER valid_formats = [\nUSER str(c.edit_format)\nUSER for c in coders.__all__\nUSER if hasattr(c, \"edit_format\") and c.edit_format is not None\nUSER ]\nUSER raise UnknownEditFormat(edit_format, valid_formats)\nUSER \nUSER def clone(self, **kwargs):\nUSER new_coder = Coder.create(from_coder=self, **kwargs)\nUSER return new_coder\nUSER \nUSER def get_announcements(self):\nUSER lines = []\nUSER lines.append(f\"Aider v{__version__}\")\nUSER \nUSER # Model\nUSER main_model = self.main_model\nUSER weak_model = main_model.weak_model\nUSER \nUSER if weak_model is not main_model:\nUSER prefix = \"Main model\"\nUSER else:\nUSER prefix = \"Model\"\nUSER \nUSER output = f\"{prefix}: {main_model.name} with {self.edit_format} edit format\"\nUSER if self.add_cache_headers or main_model.caches_by_default:\nUSER output += \", prompt cache\"\nUSER if main_model.info.get(\"supports_assistant_prefill\"):\nUSER output += \", infinite output\"\nUSER lines.append(output)\nUSER \nUSER if self.edit_format == \"architect\":\nUSER output = (\nUSER f\"Editor model: {main_model.editor_model.name} with\"\nUSER f\" {main_model.editor_edit_format} edit format\"\nUSER )\nUSER lines.append(output)\nUSER \nUSER if weak_model is not main_model:\nUSER output = f\"Weak model: {weak_model.name}\"\nUSER lines.append(output)\nUSER \nUSER # Repo\nUSER if self.repo:\nUSER rel_repo_dir = self.repo.get_rel_repo_dir()\nUSER num_files = len(self.repo.get_tracked_files())\nUSER \nUSER lines.append(f\"Git repo: {rel_repo_dir} with {num_files:,} files\")\nUSER if num_files > 1000:\nUSER lines.append(\nUSER \"Warning: For large repos, consider using --subtree-only and .aiderignore\"\nUSER )\nUSER lines.append(f\"See: {urls.large_repos}\")\nUSER else:\nUSER lines.append(\"Git repo: none\")\nUSER \nUSER # Repo-map\nUSER if self.repo_map:\nUSER map_tokens = self.repo_map.max_map_tokens\nUSER if map_tokens > 0:\nUSER refresh = self.repo_map.refresh\nUSER lines.append(f\"Repo-map: using {map_tokens} tokens, {refresh} refresh\")\nUSER max_map_tokens = self.main_model.get_repo_map_tokens() * 2\nUSER if map_tokens > max_map_tokens:\nUSER lines.append(\nUSER f\"Warning: map-tokens > {max_map_tokens} is not recommended. Too much\"\nUSER \" irrelevant code can confuse LLMs.\"\nUSER )\nUSER else:\nUSER lines.append(\"Repo-map: disabled because map_tokens == 0\")\nUSER else:\nUSER lines.append(\"Repo-map: disabled\")\nUSER \nUSER # Files\nUSER for fname in self.get_inchat_relative_files():\nUSER lines.append(f\"Added {fname} to the chat.\")\nUSER \nUSER for fname in self.abs_read_only_fnames:\nUSER rel_fname = self.get_rel_fname(fname)\nUSER lines.append(f\"Added {rel_fname} to the chat (read-only).\")\nUSER \nUSER if self.done_messages:\nUSER lines.append(\"Restored previous conversation history.\")\nUSER \nUSER if self.io.multiline_mode:\nUSER lines.append(\"Multiline mode: Enabled. Enter inserts newline, Alt-Enter submits text\")\nUSER \nUSER return lines\nUSER \nUSER def __init__(\nUSER self,\nUSER main_model,\nUSER io,\nUSER repo=None,\nUSER fnames=None,\nUSER read_only_fnames=None,\nUSER show_diffs=False,\nUSER auto_commits=True,\nUSER dirty_commits=True,\nUSER dry_run=False,\nUSER map_tokens=1024,\nUSER verbose=False,\nUSER stream=True,\nUSER use_git=True,\nUSER cur_messages=None,\nUSER done_messages=None,\nUSER restore_chat_history=False,\nUSER auto_lint=True,\nUSER auto_test=False,\nUSER lint_cmds=None,\nUSER test_cmd=None,\nUSER aider_commit_hashes=None,\nUSER map_mul_no_files=8,\nUSER commands=None,\nUSER summarizer=None,\nUSER total_cost=0.0,\nUSER analytics=None,\nUSER map_refresh=\"auto\",\nUSER cache_prompts=False,\nUSER num_cache_warming_pings=0,\nUSER suggest_shell_commands=True,\nUSER chat_language=None,\nUSER detect_urls=True,\nUSER ignore_mentions=None,\nUSER file_watcher=None,\nUSER auto_copy_context=False,\nUSER ):\nUSER # Fill in a dummy Analytics if needed, but it is never .enable()'d\nUSER self.analytics = analytics if analytics is not None else Analytics()\nUSER \nUSER self.event = self.analytics.event\nUSER self.chat_language = chat_language\nUSER self.commit_before_message = []\nUSER self.aider_commit_hashes = set()\nUSER self.rejected_urls = set()\nUSER self.abs_root_path_cache = {}\nUSER \nUSER self.auto_copy_context = auto_copy_context\nUSER \nUSER self.ignore_mentions = ignore_mentions\nUSER if not self.ignore_mentions:\nUSER self.ignore_mentions = set()\nUSER \nUSER self.file_watcher = file_watcher\nUSER if self.file_watcher:\nUSER self.file_watcher.coder = self\nUSER \nUSER self.suggest_shell_commands = suggest_shell_commands\nUSER self.detect_urls = detect_urls\nUSER \nUSER self.num_cache_warming_pings = num_cache_warming_pings\nUSER \nUSER if not fnames:\nUSER fnames = []\nUSER \nUSER if io is None:\nUSER io = InputOutput()\nUSER \nUSER if aider_commit_hashes:\nUSER self.aider_commit_hashes = aider_commit_hashes\nUSER else:\nUSER self.aider_commit_hashes = set()\nUSER \nUSER self.chat_completion_call_hashes = []\nUSER self.chat_completion_response_hashes = []\nUSER self.need_commit_before_edits = set()\nUSER \nUSER self.total_cost = total_cost\nUSER \nUSER self.verbose = verbose\nUSER self.abs_fnames = set()\nUSER self.abs_read_only_fnames = set()\nUSER \nUSER if cur_messages:\nUSER self.cur_messages = cur_messages\nUSER else:\nUSER self.cur_messages = []\nUSER \nUSER if done_messages:\nUSER self.done_messages = done_messages\nUSER else:\nUSER self.done_messages = []\nUSER \nUSER self.io = io\nUSER \nUSER self.shell_commands = []\nUSER \nUSER if not auto_commits:\nUSER dirty_commits = False\nUSER \nUSER self.auto_commits = auto_commits\nUSER self.dirty_commits = dirty_commits\nUSER \nUSER self.dry_run = dry_run\nUSER self.pretty = self.io.pretty\nUSER \nUSER self.main_model = main_model\nUSER \nUSER self.stream = stream and main_model.streaming\nUSER \nUSER if cache_prompts and self.main_model.cache_control:\nUSER self.add_cache_headers = True\nUSER \nUSER self.show_diffs = show_diffs\nUSER \nUSER self.commands = commands or Commands(self.io, self)\nUSER self.commands.coder = self\nUSER \nUSER self.repo = repo\nUSER if use_git and self.repo is None:\nUSER try:\nUSER self.repo = GitRepo(\nUSER self.io,\nUSER fnames,\nUSER None,\nUSER models=main_model.commit_message_models(),\nUSER )\nUSER except FileNotFoundError:\nUSER pass\nUSER \nUSER if self.repo:\nUSER self.root = self.repo.root\nUSER \nUSER for fname in fnames:\nUSER fname = Path(fname)\nUSER if self.repo and self.repo.git_ignored_file(fname):\nUSER self.io.tool_warning(f\"Skipping {fname} that matches gitignore spec.\")\nUSER \nUSER if self.repo and self.repo.ignored_file(fname):\nUSER self.io.tool_warning(f\"Skipping {fname} that matches aiderignore spec.\")\nUSER continue\nUSER \nUSER if not fname.exists():\nUSER if utils.touch_file(fname):\nUSER self.io.tool_output(f\"Creating empty file {fname}\")\nUSER else:\nUSER self.io.tool_warning(f\"Can not create {fname}, skipping.\")\nUSER continue\nUSER \nUSER if not fname.is_file():\nUSER self.io.tool_warning(f\"Skipping {fname} that is not a normal file.\")\nUSER continue\nUSER \nUSER fname = str(fname.resolve())\nUSER \nUSER self.abs_fnames.add(fname)\nUSER self.check_added_files()\nUSER \nUSER if not self.repo:\nUSER self.root = utils.find_common_root(self.abs_fnames)\nUSER \nUSER if read_only_fnames:\nUSER self.abs_read_only_fnames = set()\nUSER for fname in read_only_fnames:\nUSER abs_fname = self.abs_root_path(fname)\nUSER if os.path.exists(abs_fname):\nUSER self.abs_read_only_fnames.add(abs_fname)\nUSER else:\nUSER self.io.tool_warning(f\"Error: Read-only file {fname} does not exist. Skipping.\")\nUSER \nUSER if map_tokens is None:\nUSER use_repo_map = main_model.use_repo_map\nUSER map_tokens = 1024\nUSER else:\nUSER use_repo_map = map_tokens > 0\nUSER \nUSER max_inp_tokens = self.main_model.info.get(\"max_input_tokens\") or 0\nUSER \nUSER has_map_prompt = hasattr(self, \"gpt_prompts\") and self.gpt_prompts.repo_content_prefix\nUSER \nUSER if use_repo_map and self.repo and has_map_prompt:\nUSER self.repo_map = RepoMap(\nUSER map_tokens,\nUSER self.root,\nUSER self.main_model,\nUSER io,\nUSER self.gpt_prompts.repo_content_prefix,\nUSER self.verbose,\nUSER max_inp_tokens,\nUSER map_mul_no_files=map_mul_no_files,\nUSER refresh=map_refresh,\nUSER )\nUSER \nUSER self.summarizer = summarizer or ChatSummary(\nUSER [self.main_model.weak_model, self.main_model],\nUSER self.main_model.max_chat_history_tokens,\nUSER )\nUSER \nUSER self.summarizer_thread = None\nUSER self.summarized_done_messages = []\nUSER self.summarizing_messages = None\nUSER \nUSER if not self.done_messages and restore_chat_history:\nUSER history_md = self.io.read_text(self.io.chat_history_file)\nUSER if history_md:\nUSER self.done_messages = utils.split_chat_history_markdown(history_md)\nUSER self.summarize_start()\nUSER \nUSER # Linting and testing\nUSER self.linter = Linter(root=self.root, encoding=io.encoding)\nUSER self.auto_lint = auto_lint\nUSER self.setup_lint_cmds(lint_cmds)\nUSER self.lint_cmds = lint_cmds\nUSER self.auto_test = auto_test\nUSER self.test_cmd = test_cmd\nUSER \nUSER # validate the functions jsonschema\nUSER if self.functions:\nUSER from jsonschema import Draft7Validator\nUSER \nUSER for function in self.functions:\nUSER Draft7Validator.check_schema(function)\nUSER \nUSER if self.verbose:\nUSER self.io.tool_output(\"JSON Schema:\")\nUSER self.io.tool_output(json.dumps(self.functions, indent=4))\nUSER \nUSER def setup_lint_cmds(self, lint_cmds):\nUSER if not lint_cmds:\nUSER return\nUSER for lang, cmd in lint_cmds.items():\nUSER self.linter.set_linter(lang, cmd)\nUSER \nUSER def show_announcements(self):\nUSER bold = True\nUSER for line in self.get_announcements():\nUSER self.io.tool_output(line, bold=bold)\nUSER bold = False\nUSER \nUSER def add_rel_fname(self, rel_fname):\nUSER self.abs_fnames.add(self.abs_root_path(rel_fname))\nUSER self.check_added_files()\nUSER \nUSER def drop_rel_fname(self, fname):\nUSER abs_fname = self.abs_root_path(fname)\nUSER if abs_fname in self.abs_fnames:\nUSER self.abs_fnames.remove(abs_fname)\nUSER return True\nUSER \nUSER def abs_root_path(self, path):\nUSER key = path\nUSER if key in self.abs_root_path_cache:\nUSER return self.abs_root_path_cache[key]\nUSER \nUSER res = Path(self.root) / path\nUSER res = utils.safe_abs_path(res)\nUSER self.abs_root_path_cache[key] = res\nUSER return res\nUSER \nUSER fences = all_fences\nUSER fence = fences[0]\nUSER \nUSER def show_pretty(self):\nUSER if not self.pretty:\nUSER return False\nUSER \nUSER # only show pretty output if fences are the normal triple-backtick\nUSER if self.fence[0][0] != \"`\":\nUSER return False\nUSER \nUSER return True\nUSER \nUSER def get_abs_fnames_content(self):\nUSER for fname in list(self.abs_fnames):\nUSER content = self.io.read_text(fname)\nUSER \nUSER if content is None:\nUSER relative_fname = self.get_rel_fname(fname)\nUSER self.io.tool_warning(f\"Dropping {relative_fname} from the chat.\")\nUSER self.abs_fnames.remove(fname)\nUSER else:\nUSER yield fname, content\nUSER \nUSER def choose_fence(self):\nUSER all_content = \"\"\nUSER for _fname, content in self.get_abs_fnames_content():\nUSER all_content += content + \"\\n\"\nUSER for _fname in self.abs_read_only_fnames:\nUSER content = self.io.read_text(_fname)\nUSER if content is not None:\nUSER all_content += content + \"\\n\"\nUSER \nUSER lines = all_content.splitlines()\nUSER good = False\nUSER for fence_open, fence_close in self.fences:\nUSER if any(line.startswith(fence_open) or line.startswith(fence_close) for line in lines):\nUSER continue\nUSER good = True\nUSER break\nUSER \nUSER if good:\nUSER self.fence = (fence_open, fence_close)\nUSER else:\nUSER self.fence = self.fences[0]\nUSER self.io.tool_warning(\nUSER \"Unable to find a fencing strategy! Falling back to:\"\nUSER f\" {self.fence[0]}...{self.fence[1]}\"\nUSER )\nUSER \nUSER return\nUSER \nUSER def get_files_content(self, fnames=None):\nUSER if not fnames:\nUSER fnames = self.abs_fnames\nUSER \nUSER prompt = \"\"\nUSER for fname, content in self.get_abs_fnames_content():\nUSER if not is_image_file(fname):\nUSER relative_fname = self.get_rel_fname(fname)\nUSER prompt += \"\\n\"\nUSER prompt += relative_fname\nUSER prompt += f\"\\n{self.fence[0]}\\n\"\nUSER \nUSER prompt += content\nUSER \nUSER # lines = content.splitlines(keepends=True)\nUSER # lines = [f\"{i+1:03}:{line}\" for i, line in enumerate(lines)]\nUSER # prompt += \"\".join(lines)\nUSER \nUSER prompt += f\"{self.fence[1]}\\n\"\nUSER \nUSER return prompt\nUSER \nUSER def get_read_only_files_content(self):\nUSER prompt = \"\"\nUSER for fname in self.abs_read_only_fnames:\nUSER content = self.io.read_text(fname)\nUSER if content is not None and not is_image_file(fname):\nUSER relative_fname = self.get_rel_fname(fname)\nUSER prompt += \"\\n\"\nUSER prompt += relative_fname\nUSER prompt += f\"\\n{self.fence[0]}\\n\"\nUSER prompt += content\nUSER prompt += f\"{self.fence[1]}\\n\"\nUSER return prompt\nUSER \nUSER def get_cur_message_text(self):\nUSER text = \"\"\nUSER for msg in self.cur_messages:\nUSER text += msg[\"content\"] + \"\\n\"\nUSER return text\nUSER \nUSER def get_ident_mentions(self, text):\nUSER # Split the string on any character that is not alphanumeric\nUSER # \\W+ matches one or more non-word characters (equivalent to [^a-zA-Z0-9_]+)\nUSER words = set(re.split(r\"\\W+\", text))\nUSER return words\nUSER \nUSER def get_ident_filename_matches(self, idents):\nUSER all_fnames = defaultdict(set)\nUSER for fname in self.get_all_relative_files():\nUSER # Skip empty paths or just '.'\nUSER if not fname or fname == \".\":\nUSER continue\nUSER \nUSER try:\nUSER # Handle dotfiles properly\nUSER path = Path(fname)\nUSER base = path.stem.lower() # Use stem instead of with_suffix(\"\").name\nUSER if len(base) >= 5:\nUSER all_fnames[base].add(fname)\nUSER except ValueError:\nUSER # Skip paths that can't be processed\nUSER continue\nUSER \nUSER matches = set()\nUSER for ident in idents:\nUSER if len(ident) < 5:\nUSER continue\nUSER matches.update(all_fnames[ident.lower()])\nUSER \nUSER return matches\nUSER \nUSER def get_repo_map(self, force_refresh=False):\nUSER if not self.repo_map:\nUSER return\nUSER \nUSER cur_msg_text = self.get_cur_message_text()\nUSER mentioned_fnames = self.get_file_mentions(cur_msg_text)\nUSER mentioned_idents = self.get_ident_mentions(cur_msg_text)\nUSER \nUSER mentioned_fnames.update(self.get_ident_filename_matches(mentioned_idents))\nUSER \nUSER all_abs_files = set(self.get_all_abs_files())\nUSER repo_abs_read_only_fnames = set(self.abs_read_only_fnames) & all_abs_files\nUSER chat_files = set(self.abs_fnames) | repo_abs_read_only_fnames\nUSER other_files = all_abs_files - chat_files\nUSER \nUSER repo_content = self.repo_map.get_repo_map(\nUSER chat_files,\nUSER other_files,\nUSER mentioned_fnames=mentioned_fnames,\nUSER mentioned_idents=mentioned_idents,\nUSER force_refresh=force_refresh,\nUSER )\nUSER \nUSER # fall back to global repo map if files in chat are disjoint from rest of repo\nUSER if not repo_content:\nUSER repo_content = self.repo_map.get_repo_map(\nUSER set(),\nUSER all_abs_files,\nUSER mentioned_fnames=mentioned_fnames,\nUSER mentioned_idents=mentioned_idents,\nUSER )\nUSER \nUSER # fall back to completely unhinted repo\nUSER if not repo_content:\nUSER repo_content = self.repo_map.get_repo_map(\nUSER set(),\nUSER all_abs_files,\nUSER )\nUSER \nUSER return repo_content\nUSER \nUSER def get_repo_messages(self):\nUSER repo_messages = []\nUSER repo_content = self.get_repo_map()\nUSER if repo_content:\nUSER repo_messages += [\nUSER dict(role=\"user\", content=repo_content),\nUSER dict(\nUSER role=\"assistant\",\nUSER content=\"Ok, I won't try and edit those files without asking first.\",\nUSER ),\nUSER ]\nUSER return repo_messages\nUSER \nUSER def get_readonly_files_messages(self):\nUSER readonly_messages = []\nUSER \nUSER # Handle non-image files\nUSER read_only_content = self.get_read_only_files_content()\nUSER if read_only_content:\nUSER readonly_messages += [\nUSER dict(\nUSER role=\"user\", content=self.gpt_prompts.read_only_files_prefix + read_only_content\nUSER ),\nUSER dict(\nUSER role=\"assistant\",\nUSER content=\"Ok, I will use these files as references.\",\nUSER ),\nUSER ]\nUSER \nUSER # Handle image files\nUSER images_message = self.get_images_message(self.abs_read_only_fnames)\nUSER if images_message is not None:\nUSER readonly_messages += [\nUSER images_message,\nUSER dict(role=\"assistant\", content=\"Ok, I will use these images as references.\"),\nUSER ]\nUSER \nUSER return readonly_messages\nUSER \nUSER def get_chat_files_messages(self):\nUSER chat_files_messages = []\nUSER if self.abs_fnames:\nUSER files_content = self.gpt_prompts.files_content_prefix\nUSER files_content += self.get_files_content()\nUSER files_reply = self.gpt_prompts.files_content_assistant_reply\nUSER elif self.get_repo_map() and self.gpt_prompts.files_no_full_files_with_repo_map:\nUSER files_content = self.gpt_prompts.files_no_full_files_with_repo_map\nUSER files_reply = self.gpt_prompts.files_no_full_files_with_repo_map_reply\nUSER else:\nUSER files_content = self.gpt_prompts.files_no_full_files\nUSER files_reply = \"Ok.\"\nUSER \nUSER if files_content:\nUSER chat_files_messages += [\nUSER dict(role=\"user\", content=files_content),\nUSER dict(role=\"assistant\", content=files_reply),\nUSER ]\nUSER \nUSER images_message = self.get_images_message(self.abs_fnames)\nUSER if images_message is not None:\nUSER chat_files_messages += [\nUSER images_message,\nUSER dict(role=\"assistant\", content=\"Ok.\"),\nUSER ]\nUSER \nUSER return chat_files_messages\nUSER \nUSER def get_images_message(self, fnames):\nUSER supports_images = self.main_model.info.get(\"supports_vision\")\nUSER supports_pdfs = self.main_model.info.get(\"supports_pdf_input\") or self.main_model.info.get(\nUSER \"max_pdf_size_mb\"\nUSER )\nUSER \nUSER # https://github.com/BerriAI/litellm/pull/6928\nUSER supports_pdfs = supports_pdfs or \"claude-3-5-sonnet-20241022\" in self.main_model.name\nUSER \nUSER if not (supports_images or supports_pdfs):\nUSER return None\nUSER \nUSER image_messages = []\nUSER for fname in fnames:\nUSER if not is_image_file(fname):\nUSER continue\nUSER \nUSER mime_type, _ = mimetypes.guess_type(fname)\nUSER if not mime_type:\nUSER continue\nUSER \nUSER with open(fname, \"rb\") as image_file:\nUSER encoded_string = base64.b64encode(image_file.read()).decode(\"utf-8\")\nUSER image_url = f\"data:{mime_type};base64,{encoded_string}\"\nUSER rel_fname = self.get_rel_fname(fname)\nUSER \nUSER if mime_type.startswith(\"image/\") and supports_images:\nUSER image_messages += [\nUSER {\"type\": \"text\", \"text\": f\"Image file: {rel_fname}\"},\nUSER {\"type\": \"image_url\", \"image_url\": {\"url\": image_url, \"detail\": \"high\"}},\nUSER ]\nUSER elif mime_type == \"application/pdf\" and supports_pdfs:\nUSER image_messages += [\nUSER {\"type\": \"text\", \"text\": f\"PDF file: {rel_fname}\"},\nUSER {\"type\": \"image_url\", \"image_url\": image_url},\nUSER ]\nUSER \nUSER if not image_messages:\nUSER return None\nUSER \nUSER return {\"role\": \"user\", \"content\": image_messages}\nUSER \nUSER def run_stream(self, user_message):\nUSER self.io.user_input(user_message)\nUSER self.init_before_message()\nUSER yield from self.send_message(user_message)\nUSER \nUSER def init_before_message(self):\nUSER self.aider_edited_files = set()\nUSER self.reflected_message = None\nUSER self.num_reflections = 0\nUSER self.lint_outcome = None\nUSER self.test_outcome = None\nUSER self.shell_commands = []\nUSER self.message_cost = 0\nUSER \nUSER if self.repo:\nUSER self.commit_before_message.append(self.repo.get_head_commit_sha())\nUSER \nUSER def run(self, with_message=None, preproc=True):\nUSER try:\nUSER if with_message:\nUSER self.io.user_input(with_message)\nUSER self.run_one(with_message, preproc)\nUSER return self.partial_response_content\nUSER while True:\nUSER try:\nUSER if not self.io.placeholder:\nUSER self.copy_context()\nUSER user_message = self.get_input()\nUSER self.run_one(user_message, preproc)\nUSER self.show_undo_hint()\nUSER except KeyboardInterrupt:\nUSER self.keyboard_interrupt()\nUSER except EOFError:\nUSER return\nUSER \nUSER def copy_context(self):\nUSER if self.auto_copy_context:\nUSER self.commands.cmd_copy_context()\nUSER \nUSER def get_input(self):\nUSER inchat_files = self.get_inchat_relative_files()\nUSER read_only_files = [self.get_rel_fname(fname) for fname in self.abs_read_only_fnames]\nUSER all_files = sorted(set(inchat_files + read_only_files))\nUSER edit_format = \"\" if self.edit_format == self.main_model.edit_format else self.edit_format\nUSER return self.io.get_input(\nUSER self.root,\nUSER all_files,\nUSER self.get_addable_relative_files(),\nUSER self.commands,\nUSER self.abs_read_only_fnames,\nUSER edit_format=edit_format,\nUSER )\nUSER \nUSER def preproc_user_input(self, inp):\nUSER if not inp:\nUSER return\nUSER \nUSER if self.commands.is_command(inp):\nUSER return self.commands.run(inp)\nUSER \nUSER self.check_for_file_mentions(inp)\nUSER inp = self.check_for_urls(inp)\nUSER \nUSER return inp\nUSER \nUSER def run_one(self, user_message, preproc):\nUSER self.init_before_message()\nUSER \nUSER if preproc:\nUSER message = self.preproc_user_input(user_message)\nUSER else:\nUSER message = user_message\nUSER \nUSER while message:\nUSER self.reflected_message = None\nUSER list(self.send_message(message))\nUSER \nUSER if not self.reflected_message:\nUSER break\nUSER \nUSER if self.num_reflections >= self.max_reflections:\nUSER self.io.tool_warning(f\"Only {self.max_reflections} reflections allowed, stopping.\")\nUSER return\nUSER \nUSER self.num_reflections += 1\nUSER message = self.reflected_message\nUSER \nUSER def check_and_open_urls(self, exc, friendly_msg=None):\nUSER \"\"\"Check exception for URLs, offer to open in a browser, with user-friendly error msgs.\"\"\"\nUSER text = str(exc)\nUSER \nUSER if friendly_msg:\nUSER self.io.tool_warning(text)\nUSER self.io.tool_error(f\"{friendly_msg}\")\nUSER else:\nUSER self.io.tool_error(text)\nUSER \nUSER url_pattern = re.compile(r\"(https?://[^\\s/$.?#].[^\\s]*)\")\nUSER urls = list(set(url_pattern.findall(text))) # Use set to remove duplicates\nUSER for url in urls:\nUSER url = url.rstrip(\".',\\\"\")\nUSER self.io.offer_url(url)\nUSER return urls\nUSER \nUSER def check_for_urls(self, inp: str) -> List[str]:\nUSER \"\"\"Check input for URLs and offer to add them to the chat.\"\"\"\nUSER if not self.detect_urls:\nUSER return inp\nUSER \nUSER url_pattern = re.compile(r\"(https?://[^\\s/$.?#].[^\\s]*[^\\s,.])\")\nUSER urls = list(set(url_pattern.findall(inp))) # Use set to remove duplicates\nUSER group = ConfirmGroup(urls)\nUSER for url in urls:\nUSER if url not in self.rejected_urls:\nUSER url = url.rstrip(\".',\\\"\")\nUSER if self.io.confirm_ask(\nUSER \"Add URL to the chat?\", subject=url, group=group, allow_never=True\nUSER ):\nUSER inp += \"\\n\\n\"\nUSER inp += self.commands.cmd_web(url, return_content=True)\nUSER else:\nUSER self.rejected_urls.add(url)\nUSER \nUSER return inp\nUSER \nUSER def keyboard_interrupt(self):\nUSER now = time.time()\nUSER \nUSER thresh = 2 # seconds\nUSER if self.last_keyboard_interrupt and now - self.last_keyboard_interrupt < thresh:\nUSER self.io.tool_warning(\"\\n\\n^C KeyboardInterrupt\")\nUSER self.event(\"exit\", reason=\"Control-C\")\nUSER sys.exit()\nUSER \nUSER self.io.tool_warning(\"\\n\\n^C again to exit\")\nUSER \nUSER self.last_keyboard_interrupt = now\nUSER \nUSER def summarize_start(self):\nUSER if not self.summarizer.too_big(self.done_messages):\nUSER return\nUSER \nUSER self.summarize_end()\nUSER \nUSER if self.verbose:\nUSER self.io.tool_output(\"Starting to summarize chat history.\")\nUSER \nUSER self.summarizer_thread = threading.Thread(target=self.summarize_worker)\nUSER self.summarizer_thread.start()\nUSER \nUSER def summarize_worker(self):\nUSER self.summarizing_messages = list(self.done_messages)\nUSER try:\nUSER self.summarized_done_messages = self.summarizer.summarize(self.summarizing_messages)\nUSER except ValueError as err:\nUSER self.io.tool_warning(err.args[0])\nUSER \nUSER if self.verbose:\nUSER self.io.tool_output(\"Finished summarizing chat history.\")\nUSER \nUSER def summarize_end(self):\nUSER if self.summarizer_thread is None:\nUSER return\nUSER \nUSER self.summarizer_thread.join()\nUSER self.summarizer_thread = None\nUSER \nUSER if self.summarizing_messages == self.done_messages:\nUSER self.done_messages = self.summarized_done_messages\nUSER self.summarizing_messages = None\nUSER self.summarized_done_messages = []\nUSER \nUSER def move_back_cur_messages(self, message):\nUSER self.done_messages += self.cur_messages\nUSER self.summarize_start()\nUSER \nUSER # TODO check for impact on image messages\nUSER if message:\nUSER self.done_messages += [\nUSER dict(role=\"user\", content=message),\nUSER dict(role=\"assistant\", content=\"Ok.\"),\nUSER ]\nUSER self.cur_messages = []\nUSER \nUSER def get_user_language(self):\nUSER if self.chat_language:\nUSER return self.chat_language\nUSER \nUSER try:\nUSER lang = locale.getlocale()[0]\nUSER if lang:\nUSER return lang # Return the full language code, including country\nUSER except Exception:\nUSER pass\nUSER \nUSER for env_var in [\"LANG\", \"LANGUAGE\", \"LC_ALL\", \"LC_MESSAGES\"]:\nUSER lang = os.environ.get(env_var)\nUSER if lang:\nUSER return lang.split(\".\")[\nUSER 0\nUSER ] # Return language and country, but remove encoding if present\nUSER \nUSER return None\nUSER \nUSER def get_platform_info(self):\nUSER platform_text = f\"- Platform: {platform.platform()}\\n\"\nUSER shell_var = \"COMSPEC\" if os.name == \"nt\" else \"SHELL\"\nUSER shell_val = os.getenv(shell_var)\nUSER platform_text += f\"- Shell: {shell_var}={shell_val}\\n\"\nUSER \nUSER user_lang = self.get_user_language()\nUSER if user_lang:\nUSER platform_text += f\"- Language: {user_lang}\\n\"\nUSER \nUSER dt = datetime.now().astimezone().strftime(\"%Y-%m-%d\")\nUSER platform_text += f\"- Current date: {dt}\\n\"\nUSER \nUSER if self.repo:\nUSER platform_text += \"- The user is operating inside a git repository\\n\"\nUSER \nUSER if self.lint_cmds:\nUSER if self.auto_lint:\nUSER platform_text += (\nUSER \"- The user's pre-commit runs these lint commands, don't suggest running\"\nUSER \" them:\\n\"\nUSER )\nUSER else:\nUSER platform_text += \"- The user prefers these lint commands:\\n\"\nUSER for lang, cmd in self.lint_cmds.items():\nUSER if lang is None:\nUSER platform_text += f\" - {cmd}\\n\"\nUSER else:\nUSER platform_text += f\" - {lang}: {cmd}\\n\"\nUSER \nUSER if self.test_cmd:\nUSER if self.auto_test:\nUSER platform_text += (\nUSER \"- The user's pre-commit runs this test command, don't suggest running them: \"\nUSER )\nUSER else:\nUSER platform_text += \"- The user prefers this test command: \"\nUSER platform_text += self.test_cmd + \"\\n\"\nUSER \nUSER return platform_text\nUSER \nUSER def fmt_system_prompt(self, prompt):\nUSER lazy_prompt = self.gpt_prompts.lazy_prompt if self.main_model.lazy else \"\"\nUSER platform_text = self.get_platform_info()\nUSER \nUSER if self.suggest_shell_commands:\nUSER shell_cmd_prompt = self.gpt_prompts.shell_cmd_prompt.format(platform=platform_text)\nUSER shell_cmd_reminder = self.gpt_prompts.shell_cmd_reminder.format(platform=platform_text)\nUSER else:\nUSER shell_cmd_prompt = self.gpt_prompts.no_shell_cmd_prompt.format(platform=platform_text)\nUSER shell_cmd_reminder = self.gpt_prompts.no_shell_cmd_reminder.format(\nUSER platform=platform_text\nUSER )\nUSER \nUSER if self.chat_language:\nUSER language = self.chat_language\nUSER else:\nUSER language = \"the same language they are using\"\nUSER \nUSER prompt = prompt.format(\nUSER fence=self.fence,\nUSER lazy_prompt=lazy_prompt,\nUSER platform=platform_text,\nUSER shell_cmd_prompt=shell_cmd_prompt,\nUSER shell_cmd_reminder=shell_cmd_reminder,\nUSER language=language,\nUSER )\nUSER return prompt\nUSER \nUSER def format_chat_chunks(self):\nUSER self.choose_fence()\nUSER main_sys = self.fmt_system_prompt(self.gpt_prompts.main_system)\nUSER \nUSER example_messages = []\nUSER if self.main_model.examples_as_sys_msg:\nUSER if self.gpt_prompts.example_messages:\nUSER main_sys += \"\\n# Example conversations:\\n\\n\"\nUSER for msg in self.gpt_prompts.example_messages:\nUSER role = msg[\"role\"]\nUSER content = self.fmt_system_prompt(msg[\"content\"])\nUSER main_sys += f\"## {role.upper()}: {content}\\n\\n\"\nUSER main_sys = main_sys.strip()\nUSER else:\nUSER for msg in self.gpt_prompts.example_messages:\nUSER example_messages.append(\nUSER dict(\nUSER role=msg[\"role\"],\nUSER content=self.fmt_system_prompt(msg[\"content\"]),\nUSER )\nUSER )\nUSER if self.gpt_prompts.example_messages:\nUSER example_messages += [\nUSER dict(\nUSER role=\"user\",\nUSER content=(\nUSER \"I switched to a new code base. Please don't consider the above files\"\nUSER \" or try to edit them any longer.\"\nUSER ),\nUSER ),\nUSER dict(role=\"assistant\", content=\"Ok.\"),\nUSER ]\nUSER \nUSER if self.gpt_prompts.system_reminder:\nUSER main_sys += \"\\n\" + self.fmt_system_prompt(self.gpt_prompts.system_reminder)\nUSER \nUSER chunks = ChatChunks()\nUSER \nUSER if self.main_model.use_system_prompt:\nUSER chunks.system = [\nUSER dict(role=\"system\", content=main_sys),\nUSER ]\nUSER else:\nUSER chunks.system = [\nUSER dict(role=\"user\", content=main_sys),\nUSER dict(role=\"assistant\", content=\"Ok.\"),\nUSER ]\nUSER \nUSER chunks.examples = example_messages\nUSER \nUSER self.summarize_end()\nUSER chunks.done = self.done_messages\nUSER \nUSER chunks.repo = self.get_repo_messages()\nUSER chunks.readonly_files = self.get_readonly_files_messages()\nUSER chunks.chat_files = self.get_chat_files_messages()\nUSER \nUSER if self.gpt_prompts.system_reminder:\nUSER reminder_message = [\nUSER dict(\nUSER role=\"system\", content=self.fmt_system_prompt(self.gpt_prompts.system_reminder)\nUSER ),\nUSER ]\nUSER else:\nUSER reminder_message = []\nUSER \nUSER chunks.cur = list(self.cur_messages)\nUSER chunks.reminder = []\nUSER \nUSER # TODO review impact of token count on image messages\nUSER messages_tokens = self.main_model.token_count(chunks.all_messages())\nUSER reminder_tokens = self.main_model.token_count(reminder_message)\nUSER cur_tokens = self.main_model.token_count(chunks.cur)\nUSER \nUSER if None not in (messages_tokens, reminder_tokens, cur_tokens):\nUSER total_tokens = messages_tokens + reminder_tokens + cur_tokens\nUSER else:\nUSER # add the reminder anyway\nUSER total_tokens = 0\nUSER \nUSER if chunks.cur:\nUSER final = chunks.cur[-1]\nUSER else:\nUSER final = None\nUSER \nUSER max_input_tokens = self.main_model.info.get(\"max_input_tokens\") or 0\nUSER # Add the reminder prompt if we still have room to include it.\nUSER if (\nUSER not max_input_tokens\nUSER or total_tokens < max_input_tokens\nUSER and self.gpt_prompts.system_reminder\nUSER ):\nUSER if self.main_model.reminder == \"sys\":\nUSER chunks.reminder = reminder_message\nUSER elif self.main_model.reminder == \"user\" and final and final[\"role\"] == \"user\":\nUSER # stuff it into the user message\nUSER new_content = (\nUSER final[\"content\"]\nUSER + \"\\n\\n\"\nUSER + self.fmt_system_prompt(self.gpt_prompts.system_reminder)\nUSER )\nUSER chunks.cur[-1] = dict(role=final[\"role\"], content=new_content)\nUSER \nUSER return chunks\nUSER \nUSER def format_messages(self):\nUSER chunks = self.format_chat_chunks()\nUSER if self.add_cache_headers:\nUSER chunks.add_cache_control_headers()\nUSER \nUSER return chunks\nUSER \nUSER def warm_cache(self, chunks):\nUSER if not self.add_cache_headers:\nUSER return\nUSER if not self.num_cache_warming_pings:\nUSER return\nUSER \nUSER delay = 5 * 60 - 5\nUSER self.next_cache_warm = time.time() + delay\nUSER self.warming_pings_left = self.num_cache_warming_pings\nUSER self.cache_warming_chunks = chunks\nUSER \nUSER if self.cache_warming_thread:\nUSER return\nUSER \nUSER def warm_cache_worker():\nUSER while True:\nUSER time.sleep(1)\nUSER if self.warming_pings_left <= 0:\nUSER continue\nUSER now = time.time()\nUSER if now < self.next_cache_warm:\nUSER continue\nUSER \nUSER self.warming_pings_left -= 1\nUSER self.next_cache_warm = time.time() + delay\nUSER \nUSER kwargs = dict(self.main_model.extra_params) or dict()\nUSER kwargs[\"max_tokens\"] = 1\nUSER \nUSER try:\nUSER completion = litellm.completion(\nUSER model=self.main_model.name,\nUSER messages=self.cache_warming_chunks.cacheable_messages(),\nUSER stream=False,\nUSER **kwargs,\nUSER )\nUSER except Exception as err:\nUSER self.io.tool_warning(f\"Cache warming error: {str(err)}\")\nUSER continue\nUSER \nUSER cache_hit_tokens = getattr(\nUSER completion.usage, \"prompt_cache_hit_tokens\", 0\nUSER ) or getattr(completion.usage, \"cache_read_input_tokens\", 0)\nUSER \nUSER if self.verbose:\nUSER self.io.tool_output(f\"Warmed {format_tokens(cache_hit_tokens)} cached tokens.\")\nUSER \nUSER self.cache_warming_thread = threading.Timer(0, warm_cache_worker)\nUSER self.cache_warming_thread.daemon = True\nUSER self.cache_warming_thread.start()\nUSER \nUSER return chunks\nUSER \nUSER def send_message(self, inp):\nUSER self.event(\"message_send_starting\")\nUSER \nUSER self.cur_messages += [\nUSER dict(role=\"user\", content=inp),\nUSER ]\nUSER \nUSER chunks = self.format_messages()\nUSER messages = chunks.all_messages()\nUSER self.warm_cache(chunks)\nUSER \nUSER if self.verbose:\nUSER utils.show_messages(messages, functions=self.functions)\nUSER \nUSER self.multi_response_content = \"\"\nUSER if self.show_pretty() and self.stream:\nUSER self.mdstream = self.io.get_assistant_mdstream()\nUSER else:\nUSER self.mdstream = None\nUSER \nUSER retry_delay = 0.125\nUSER \nUSER litellm_ex = LiteLLMExceptions()\nUSER \nUSER self.usage_report = None\nUSER exhausted = False\nUSER interrupted = False\nUSER try:\nUSER while True:\nUSER try:\nUSER yield from self.send(messages, functions=self.functions)\nUSER break\nUSER except litellm_ex.exceptions_tuple() as err:\nUSER ex_info = litellm_ex.get_ex_info(err)\nUSER \nUSER if ex_info.name == \"ContextWindowExceededError\":\nUSER exhausted = True\nUSER break\nUSER \nUSER should_retry = ex_info.retry\nUSER if should_retry:\nUSER retry_delay *= 2\nUSER if retry_delay > RETRY_TIMEOUT:\nUSER should_retry = False\nUSER \nUSER if not should_retry:\nUSER self.mdstream = None\nUSER self.check_and_open_urls(err, ex_info.description)\nUSER break\nUSER \nUSER err_msg = str(err)\nUSER if ex_info.description:\nUSER self.io.tool_warning(err_msg)\nUSER self.io.tool_error(ex_info.description)\nUSER else:\nUSER self.io.tool_error(err_msg)\nUSER \nUSER self.io.tool_output(f\"Retrying in {retry_delay:.1f} seconds...\")\nUSER time.sleep(retry_delay)\nUSER continue\nUSER except KeyboardInterrupt:\nUSER interrupted = True\nUSER break\nUSER except FinishReasonLength:\nUSER # We hit the output limit!\nUSER if not self.main_model.info.get(\"supports_assistant_prefill\"):\nUSER exhausted = True\nUSER break\nUSER \nUSER self.multi_response_content = self.get_multi_response_content()\nUSER \nUSER if messages[-1][\"role\"] == \"assistant\":\nUSER messages[-1][\"content\"] = self.multi_response_content\nUSER else:\nUSER messages.append(\nUSER dict(role=\"assistant\", content=self.multi_response_content, prefix=True)\nUSER )\nUSER except Exception as err:\nUSER self.mdstream = None\nUSER lines = traceback.format_exception(type(err), err, err.__traceback__)\nUSER self.io.tool_warning(\"\".join(lines))\nUSER self.io.tool_error(str(err))\nUSER self.event(\"message_send_exception\", exception=str(err))\nUSER return\nUSER finally:\nUSER if self.mdstream:\nUSER self.live_incremental_response(True)\nUSER self.mdstream = None\nUSER \nUSER self.partial_response_content = self.get_multi_response_content(True)\nUSER self.multi_response_content = \"\"\nUSER \nUSER self.io.tool_output()\nUSER \nUSER self.show_usage_report()\nUSER \nUSER self.add_assistant_reply_to_cur_messages()\nUSER \nUSER if exhausted:\nUSER if self.cur_messages and self.cur_messages[-1][\"role\"] == \"user\":\nUSER self.cur_messages += [\nUSER dict(\nUSER role=\"assistant\",\nUSER content=\"FinishReasonLength exception: you sent too many tokens\",\nUSER ),\nUSER ]\nUSER \nUSER self.show_exhausted_error()\nUSER self.num_exhausted_context_windows += 1\nUSER return\nUSER \nUSER if self.partial_response_function_call:\nUSER args = self.parse_partial_args()\nUSER if args:\nUSER content = args.get(\"explanation\") or \"\"\nUSER else:\nUSER content = \"\"\nUSER elif self.partial_response_content:\nUSER content = self.partial_response_content\nUSER else:\nUSER content = \"\"\nUSER \nUSER if not interrupted:\nUSER add_rel_files_message = self.check_for_file_mentions(content)\nUSER if add_rel_files_message:\nUSER if self.reflected_message:\nUSER self.reflected_message += \"\\n\\n\" + add_rel_files_message\nUSER else:\nUSER self.reflected_message = add_rel_files_message\nUSER return\nUSER \nUSER try:\nUSER self.reply_completed()\nUSER except KeyboardInterrupt:\nUSER interrupted = True\nUSER \nUSER if interrupted:\nUSER # check if the last messages was role==user, append the ^C Key.. to it if so. ai!\nUSER self.cur_messages += [\nUSER dict(role=\"user\", content=\"^C KeyboardInterrupt\"),\nUSER dict(role=\"assistant\", content=\"I see that you interrupted my previous reply.\"),\nUSER ]\nUSER return\nUSER \nUSER edited = self.apply_updates()\nUSER \nUSER if edited:\nUSER self.aider_edited_files.update(edited)\nUSER saved_message = self.auto_commit(edited)\nUSER \nUSER if not saved_message and hasattr(self.gpt_prompts, \"files_content_gpt_edits_no_repo\"):\nUSER saved_message = self.gpt_prompts.files_content_gpt_edits_no_repo\nUSER \nUSER self.move_back_cur_messages(saved_message)\nUSER \nUSER if self.reflected_message:\nUSER return\nUSER \nUSER if edited and self.auto_lint:\nUSER lint_errors = self.lint_edited(edited)\nUSER self.auto_commit(edited, context=\"Ran the linter\")\nUSER self.lint_outcome = not lint_errors\nUSER if lint_errors:\nUSER ok = self.io.confirm_ask(\"Attempt to fix lint errors?\")\nUSER if ok:\nUSER self.reflected_message = lint_errors\nUSER return\nUSER \nUSER shared_output = self.run_shell_commands()\nUSER if shared_output:\nUSER self.cur_messages += [\nUSER dict(role=\"user\", content=shared_output),\nUSER dict(role=\"assistant\", content=\"Ok\"),\nUSER ]\nUSER \nUSER if edited and self.auto_test:\nUSER test_errors = self.commands.cmd_test(self.test_cmd)\nUSER self.test_outcome = not test_errors\nUSER if test_errors:\nUSER ok = self.io.confirm_ask(\"Attempt to fix test errors?\")\nUSER if ok:\nUSER self.reflected_message = test_errors\nUSER return\nUSER \nUSER def reply_completed(self):\nUSER pass\nUSER \nUSER def show_exhausted_error(self):\nUSER output_tokens = 0\nUSER if self.partial_response_content:\nUSER output_tokens = self.main_model.token_count(self.partial_response_content)\nUSER max_output_tokens = self.main_model.info.get(\"max_output_tokens\") or 0\nUSER \nUSER input_tokens = self.main_model.token_count(self.format_messages().all_messages())\nUSER max_input_tokens = self.main_model.info.get(\"max_input_tokens\") or 0\nUSER \nUSER total_tokens = input_tokens + output_tokens\nUSER \nUSER fudge = 0.7\nUSER \nUSER out_err = \"\"\nUSER if output_tokens >= max_output_tokens * fudge:\nUSER out_err = \" -- possibly exceeded output limit!\"\nUSER \nUSER inp_err = \"\"\nUSER if input_tokens >= max_input_tokens * fudge:\nUSER inp_err = \" -- possibly exhausted context window!\"\nUSER \nUSER tot_err = \"\"\nUSER if total_tokens >= max_input_tokens * fudge:\nUSER tot_err = \" -- possibly exhausted context window!\"\nUSER \nUSER res = [\"\", \"\"]\nUSER res.append(f\"Model {self.main_model.name} has hit a token limit!\")\nUSER res.append(\"Token counts below are approximate.\")\nUSER res.append(\"\")\nUSER res.append(f\"Input tokens: ~{input_tokens:,} of {max_input_tokens:,}{inp_err}\")\nUSER res.append(f\"Output tokens: ~{output_tokens:,} of {max_output_tokens:,}{out_err}\")\nUSER res.append(f\"Total tokens: ~{total_tokens:,} of {max_input_tokens:,}{tot_err}\")\nUSER \nUSER if output_tokens >= max_output_tokens:\nUSER res.append(\"\")\nUSER res.append(\"To reduce output tokens:\")\nUSER res.append(\"- Ask for smaller changes in each request.\")\nUSER res.append(\"- Break your code into smaller source files.\")\nUSER if \"diff\" not in self.main_model.edit_format:\nUSER res.append(\"- Use a stronger model that can return diffs.\")\nUSER \nUSER if input_tokens >= max_input_tokens or total_tokens >= max_input_tokens:\nUSER res.append(\"\")\nUSER res.append(\"To reduce input tokens:\")\nUSER res.append(\"- Use /tokens to see token usage.\")\nUSER res.append(\"- Use /drop to remove unneeded files from the chat session.\")\nUSER res.append(\"- Use /clear to clear the chat history.\")\nUSER res.append(\"- Break your code into smaller source files.\")\nUSER \nUSER res = \"\".join([line + \"\\n\" for line in res])\nUSER self.io.tool_error(res)\nUSER self.io.offer_url(urls.token_limits)\nUSER \nUSER def lint_edited(self, fnames):\nUSER res = \"\"\nUSER for fname in fnames:\nUSER if not fname:\nUSER continue\nUSER errors = self.linter.lint(self.abs_root_path(fname))\nUSER \nUSER if errors:\nUSER res += \"\\n\"\nUSER res += errors\nUSER res += \"\\n\"\nUSER \nUSER if res:\nUSER self.io.tool_warning(res)\nUSER \nUSER return res\nUSER \nUSER def add_assistant_reply_to_cur_messages(self):\nUSER if self.partial_response_content:\nUSER self.cur_messages += [dict(role=\"assistant\", content=self.partial_response_content)]\nUSER if self.partial_response_function_call:\nUSER self.cur_messages += [\nUSER dict(\nUSER role=\"assistant\",\nUSER content=None,\nUSER function_call=self.partial_response_function_call,\nUSER )\nUSER ]\nUSER \nUSER def get_file_mentions(self, content):\nUSER words = set(word for word in content.split())\nUSER \nUSER # drop sentence punctuation from the end\nUSER words = set(word.rstrip(\",.!;:?\") for word in words)\nUSER \nUSER # strip away all kinds of quotes\nUSER quotes = \"\".join(['\"', \"'\", \"`\"])\nUSER words = set(word.strip(quotes) for word in words)\nUSER \nUSER addable_rel_fnames = self.get_addable_relative_files()\nUSER \nUSER # Get basenames of files already in chat or read-only\nUSER existing_basenames = {os.path.basename(f) for f in self.get_inchat_relative_files()} | {\nUSER os.path.basename(self.get_rel_fname(f)) for f in self.abs_read_only_fnames\nUSER }\nUSER \nUSER mentioned_rel_fnames = set()\nUSER fname_to_rel_fnames = {}\nUSER for rel_fname in addable_rel_fnames:\nUSER # Skip files that share a basename with files already in chat\nUSER if os.path.basename(rel_fname) in existing_basenames:\nUSER continue\nUSER \nUSER normalized_rel_fname = rel_fname.replace(\"\\\\\", \"/\")\nUSER normalized_words = set(word.replace(\"\\\\\", \"/\") for word in words)\nUSER if normalized_rel_fname in normalized_words:\nUSER mentioned_rel_fnames.add(rel_fname)\nUSER \nUSER fname = os.path.basename(rel_fname)\nUSER \nUSER # Don't add basenames that could be plain words like \"run\" or \"make\"\nUSER if \"/\" in fname or \"\\\\\" in fname or \".\" in fname or \"_\" in fname or \"-\" in fname:\nUSER if fname not in fname_to_rel_fnames:\nUSER fname_to_rel_fnames[fname] = []\nUSER fname_to_rel_fnames[fname].append(rel_fname)\nUSER \nUSER for fname, rel_fnames in fname_to_rel_fnames.items():\nUSER if len(rel_fnames) == 1 and fname in words:\nUSER mentioned_rel_fnames.add(rel_fnames[0])\nUSER \nUSER return mentioned_rel_fnames\nUSER \nUSER def check_for_file_mentions(self, content):\nUSER mentioned_rel_fnames = self.get_file_mentions(content)\nUSER \nUSER new_mentions = mentioned_rel_fnames - self.ignore_mentions\nUSER \nUSER if not new_mentions:\nUSER return\nUSER \nUSER added_fnames = []\nUSER group = ConfirmGroup(new_mentions)\nUSER for rel_fname in sorted(new_mentions):\nUSER if self.io.confirm_ask(f\"Add {rel_fname} to the chat?\", group=group, allow_never=True):\nUSER self.add_rel_fname(rel_fname)\nUSER added_fnames.append(rel_fname)\nUSER else:\nUSER self.ignore_mentions.add(rel_fname)\nUSER \nUSER if added_fnames:\nUSER return prompts.added_files.format(fnames=\", \".join(added_fnames))\nUSER \nUSER def send(self, messages, model=None, functions=None):\nUSER if not model:\nUSER model = self.main_model\nUSER \nUSER self.partial_response_content = \"\"\nUSER self.partial_response_function_call = dict()\nUSER \nUSER self.io.log_llm_history(\"TO LLM\", format_messages(messages))\nUSER \nUSER if self.main_model.use_temperature:\nUSER temp = self.temperature\nUSER else:\nUSER temp = None\nUSER \nUSER completion = None\nUSER try:\nUSER hash_object, completion = send_completion(\nUSER model.name,\nUSER messages,\nUSER functions,\nUSER self.stream,\nUSER temp,\nUSER extra_params=model.extra_params,\nUSER )\nUSER self.chat_completion_call_hashes.append(hash_object.hexdigest())\nUSER \nUSER if self.stream:\nUSER yield from self.show_send_output_stream(completion)\nUSER else:\nUSER self.show_send_output(completion)\nUSER \nUSER # Calculate costs for successful responses\nUSER self.calculate_and_show_tokens_and_cost(messages, completion)\nUSER \nUSER except LiteLLMExceptions().exceptions_tuple() as err:\nUSER ex_info = LiteLLMExceptions().get_ex_info(err)\nUSER if ex_info.name == \"ContextWindowExceededError\":\nUSER # Still calculate costs for context window errors\nUSER self.calculate_and_show_tokens_and_cost(messages, completion)\nUSER raise\nUSER except KeyboardInterrupt as kbi:\nUSER self.keyboard_interrupt()\nUSER raise kbi\nUSER finally:\nUSER self.io.log_llm_history(\nUSER \"LLM RESPONSE\",\nUSER format_content(\"ASSISTANT\", self.partial_response_content),\nUSER )\nUSER \nUSER if self.partial_response_content:\nUSER self.io.ai_output(self.partial_response_content)\nUSER elif self.partial_response_function_call:\nUSER # TODO: push this into subclasses\nUSER args = self.parse_partial_args()\nUSER if args:\nUSER self.io.ai_output(json.dumps(args, indent=4))\nUSER \nUSER def show_send_output(self, completion):\nUSER if self.verbose:\nUSER print(completion)\nUSER \nUSER if not completion.choices:\nUSER self.io.tool_error(str(completion))\nUSER return\nUSER \nUSER show_func_err = None\nUSER show_content_err = None\nUSER try:\nUSER if completion.choices[0].message.tool_calls:\nUSER self.partial_response_function_call = (\nUSER completion.choices[0].message.tool_calls[0].function\nUSER )\nUSER except AttributeError as func_err:\nUSER show_func_err = func_err\nUSER \nUSER try:\nUSER self.partial_response_content = completion.choices[0].message.content or \"\"\nUSER except AttributeError as content_err:\nUSER show_content_err = content_err\nUSER \nUSER resp_hash = dict(\nUSER function_call=str(self.partial_response_function_call),\nUSER content=self.partial_response_content,\nUSER )\nUSER resp_hash = hashlib.sha1(json.dumps(resp_hash, sort_keys=True).encode())\nUSER self.chat_completion_response_hashes.append(resp_hash.hexdigest())\nUSER \nUSER if show_func_err and show_content_err:\nUSER self.io.tool_error(show_func_err)\nUSER self.io.tool_error(show_content_err)\nUSER raise Exception(\"No data found in LLM response!\")\nUSER \nUSER show_resp = self.render_incremental_response(True)\nUSER self.io.assistant_output(show_resp, pretty=self.show_pretty())\nUSER \nUSER if (\nUSER hasattr(completion.choices[0], \"finish_reason\")\nUSER and completion.choices[0].finish_reason == \"length\"\nUSER ):\nUSER raise FinishReasonLength()\nUSER \nUSER def show_send_output_stream(self, completion):\nUSER for chunk in completion:\nUSER if len(chunk.choices) == 0:\nUSER continue\nUSER \nUSER if (\nUSER hasattr(chunk.choices[0], \"finish_reason\")\nUSER and chunk.choices[0].finish_reason == \"length\"\nUSER ):\nUSER raise FinishReasonLength()\nUSER \nUSER try:\nUSER func = chunk.choices[0].delta.function_call\nUSER # dump(func)\nUSER for k, v in func.items():\nUSER if k in self.partial_response_function_call:\nUSER self.partial_response_function_call[k] += v\nUSER else:\nUSER self.partial_response_function_call[k] = v\nUSER except AttributeError:\nUSER pass\nUSER \nUSER try:\nUSER text = chunk.choices[0].delta.content\nUSER if text:\nUSER self.partial_response_content += text\nUSER except AttributeError:\nUSER text = None\nUSER \nUSER if self.show_pretty():\nUSER self.live_incremental_response(False)\nUSER elif text:\nUSER try:\nUSER sys.stdout.write(text)\nUSER except UnicodeEncodeError:\nUSER # Safely encode and decode the text\nUSER safe_text = text.encode(sys.stdout.encoding, errors=\"backslashreplace\").decode(\nUSER sys.stdout.encoding\nUSER )\nUSER sys.stdout.write(safe_text)\nUSER sys.stdout.flush()\nUSER yield text\nUSER \nUSER def live_incremental_response(self, final):\nUSER show_resp = self.render_incremental_response(final)\nUSER self.mdstream.update(show_resp, final=final)\nUSER \nUSER def render_incremental_response(self, final):\nUSER return self.get_multi_response_content()\nUSER \nUSER def calculate_and_show_tokens_and_cost(self, messages, completion=None):\nUSER prompt_tokens = 0\nUSER completion_tokens = 0\nUSER cache_hit_tokens = 0\nUSER cache_write_tokens = 0\nUSER \nUSER if completion and hasattr(completion, \"usage\") and completion.usage is not None:\nUSER prompt_tokens = completion.usage.prompt_tokens\nUSER completion_tokens = completion.usage.completion_tokens\nUSER cache_hit_tokens = getattr(completion.usage, \"prompt_cache_hit_tokens\", 0) or getattr(\nUSER completion.usage, \"cache_read_input_tokens\", 0\nUSER )\nUSER cache_write_tokens = getattr(completion.usage, \"cache_creation_input_tokens\", 0)\nUSER \nUSER if hasattr(completion.usage, \"cache_read_input_tokens\") or hasattr(\nUSER completion.usage, \"cache_creation_input_tokens\"\nUSER ):\nUSER self.message_tokens_sent += prompt_tokens\nUSER self.message_tokens_sent += cache_write_tokens\nUSER else:\nUSER self.message_tokens_sent += prompt_tokens\nUSER \nUSER else:\nUSER prompt_tokens = self.main_model.token_count(messages)\nUSER completion_tokens = self.main_model.token_count(self.partial_response_content)\nUSER self.message_tokens_sent += prompt_tokens\nUSER \nUSER self.message_tokens_received += completion_tokens\nUSER \nUSER tokens_report = f\"Tokens: {format_tokens(self.message_tokens_sent)} sent\"\nUSER \nUSER if cache_write_tokens:\nUSER tokens_report += f\", {format_tokens(cache_write_tokens)} cache write\"\nUSER if cache_hit_tokens:\nUSER tokens_report += f\", {format_tokens(cache_hit_tokens)} cache hit\"\nUSER tokens_report += f\", {format_tokens(self.message_tokens_received)} received.\"\nUSER \nUSER if not self.main_model.info.get(\"input_cost_per_token\"):\nUSER self.usage_report = tokens_report\nUSER return\nUSER \nUSER cost = 0\nUSER \nUSER input_cost_per_token = self.main_model.info.get(\"input_cost_per_token\") or 0\nUSER output_cost_per_token = self.main_model.info.get(\"output_cost_per_token\") or 0\nUSER input_cost_per_token_cache_hit = (\nUSER self.main_model.info.get(\"input_cost_per_token_cache_hit\") or 0\nUSER )\nUSER \nUSER # deepseek\nUSER # prompt_cache_hit_tokens + prompt_cache_miss_tokens\nUSER # == prompt_tokens == total tokens that were sent\nUSER #\nUSER # Anthropic\nUSER # cache_creation_input_tokens + cache_read_input_tokens + prompt\nUSER # == total tokens that were\nUSER \nUSER if input_cost_per_token_cache_hit:\nUSER # must be deepseek\nUSER cost += input_cost_per_token_cache_hit * cache_hit_tokens\nUSER cost += (prompt_tokens - input_cost_per_token_cache_hit) * input_cost_per_token\nUSER else:\nUSER # hard code the anthropic adjustments, no-ops for other models since cache_x_tokens==0\nUSER cost += cache_write_tokens * input_cost_per_token * 1.25\nUSER cost += cache_hit_tokens * input_cost_per_token * 0.10\nUSER cost += prompt_tokens * input_cost_per_token\nUSER \nUSER cost += completion_tokens * output_cost_per_token\nUSER \nUSER self.total_cost += cost\nUSER self.message_cost += cost\nUSER \nUSER def format_cost(value):\nUSER if value == 0:\nUSER return \"0.00\"\nUSER magnitude = abs(value)\nUSER if magnitude >= 0.01:\nUSER return f\"{value:.2f}\"\nUSER else:\nUSER return f\"{value:.{max(2, 2 - int(math.log10(magnitude)))}f}\"\nUSER \nUSER cost_report = (\nUSER f\"Cost: ${format_cost(self.message_cost)} message,\"\nUSER f\" ${format_cost(self.total_cost)} session.\"\nUSER )\nUSER \nUSER if self.add_cache_headers and self.stream:\nUSER warning = \" Use --no-stream for accurate caching costs.\"\nUSER self.usage_report = tokens_report + \"\\n\" + cost_report + warning\nUSER return\nUSER \nUSER if cache_hit_tokens and cache_write_tokens:\nUSER sep = \"\\n\"\nUSER else:\nUSER sep = \" \"\nUSER \nUSER self.usage_report = tokens_report + sep + cost_report\nUSER \nUSER def show_usage_report(self):\nUSER if not self.usage_report:\nUSER return\nUSER \nUSER self.io.tool_output(self.usage_report)\nUSER \nUSER prompt_tokens = self.message_tokens_sent\nUSER completion_tokens = self.message_tokens_received\nUSER self.event(\nUSER \"message_send\",\nUSER main_model=self.main_model,\nUSER edit_format=self.edit_format,\nUSER prompt_tokens=prompt_tokens,\nUSER completion_tokens=completion_tokens,\nUSER total_tokens=prompt_tokens + completion_tokens,\nUSER cost=self.message_cost,\nUSER total_cost=self.total_cost,\nUSER )\nUSER \nUSER self.message_cost = 0.0\nUSER self.message_tokens_sent = 0\nUSER self.message_tokens_received = 0\nUSER \nUSER def get_multi_response_content(self, final=False):\nUSER cur = self.multi_response_content or \"\"\nUSER new = self.partial_response_content or \"\"\nUSER \nUSER if new.rstrip() != new and not final:\nUSER new = new.rstrip()\nUSER return cur + new\nUSER \nUSER def get_rel_fname(self, fname):\nUSER try:\nUSER return os.path.relpath(fname, self.root)\nUSER except ValueError:\nUSER return fname\nUSER \nUSER def get_inchat_relative_files(self):\nUSER files = [self.get_rel_fname(fname) for fname in self.abs_fnames]\nUSER return sorted(set(files))\nUSER \nUSER def is_file_safe(self, fname):\nUSER try:\nUSER return Path(self.abs_root_path(fname)).is_file()\nUSER except OSError:\nUSER return\nUSER \nUSER def get_all_relative_files(self):\nUSER if self.repo:\nUSER files = self.repo.get_tracked_files()\nUSER else:\nUSER files = self.get_inchat_relative_files()\nUSER \nUSER # This is quite slow in large repos\nUSER # files = [fname for fname in files if self.is_file_safe(fname)]\nUSER \nUSER return sorted(set(files))\nUSER \nUSER def get_all_abs_files(self):\nUSER files = self.get_all_relative_files()\nUSER files = [self.abs_root_path(path) for path in files]\nUSER return files\nUSER \nUSER def get_addable_relative_files(self):\nUSER all_files = set(self.get_all_relative_files())\nUSER inchat_files = set(self.get_inchat_relative_files())\nUSER read_only_files = set(self.get_rel_fname(fname) for fname in self.abs_read_only_fnames)\nUSER return all_files - inchat_files - read_only_files\nUSER \nUSER def check_for_dirty_commit(self, path):\nUSER if not self.repo:\nUSER return\nUSER if not self.dirty_commits:\nUSER return\nUSER if not self.repo.is_dirty(path):\nUSER return\nUSER \nUSER # We need a committed copy of the file in order to /undo, so skip this\nUSER # fullp = Path(self.abs_root_path(path))\nUSER # if not fullp.stat().st_size:\nUSER # return\nUSER \nUSER self.io.tool_output(f\"Committing {path} before applying edits.\")\nUSER self.need_commit_before_edits.add(path)\nUSER \nUSER def allowed_to_edit(self, path):\nUSER full_path = self.abs_root_path(path)\nUSER if self.repo:\nUSER need_to_add = not self.repo.path_in_repo(path)\nUSER else:\nUSER need_to_add = False\nUSER \nUSER if full_path in self.abs_fnames:\nUSER self.check_for_dirty_commit(path)\nUSER return True\nUSER \nUSER if self.repo and self.repo.git_ignored_file(path):\nUSER self.io.tool_warning(f\"Skipping edits to {path} that matches gitignore spec.\")\nUSER return\nUSER \nUSER if not Path(full_path).exists():\nUSER if not self.io.confirm_ask(\"Create new file?\", subject=path):\nUSER self.io.tool_output(f\"Skipping edits to {path}\")\nUSER return\nUSER \nUSER if not self.dry_run:\nUSER if not utils.touch_file(full_path):\nUSER self.io.tool_error(f\"Unable to create {path}, skipping edits.\")\nUSER return\nUSER \nUSER # Seems unlikely that we needed to create the file, but it was\nUSER # actually already part of the repo.\nUSER # But let's only add if we need to, just to be safe.\nUSER if need_to_add:\nUSER self.repo.repo.git.add(full_path)\nUSER \nUSER self.abs_fnames.add(full_path)\nUSER self.check_added_files()\nUSER return True\nUSER \nUSER if not self.io.confirm_ask(\nUSER \"Allow edits to file that has not been added to the chat?\",\nUSER subject=path,\nUSER ):\nUSER self.io.tool_output(f\"Skipping edits to {path}\")\nUSER return\nUSER \nUSER if need_to_add:\nUSER self.repo.repo.git.add(full_path)\nUSER \nUSER self.abs_fnames.add(full_path)\nUSER self.check_added_files()\nUSER self.check_for_dirty_commit(path)\nUSER \nUSER return True\nUSER \nUSER warning_given = False\nUSER \nUSER def check_added_files(self):\nUSER if self.warning_given:\nUSER return\nUSER \nUSER warn_number_of_files = 4\nUSER warn_number_of_tokens = 20 * 1024\nUSER \nUSER num_files = len(self.abs_fnames)\nUSER if num_files < warn_number_of_files:\nUSER return\nUSER \nUSER tokens = 0\nUSER for fname in self.abs_fnames:\nUSER if is_image_file(fname):\nUSER continue\nUSER content = self.io.read_text(fname)\nUSER tokens += self.main_model.token_count(content)\nUSER \nUSER if tokens < warn_number_of_tokens:\nUSER return\nUSER \nUSER self.io.tool_warning(\"Warning: it's best to only add files that need changes to the chat.\")\nUSER self.io.tool_warning(urls.edit_errors)\nUSER self.warning_given = True\nUSER \nUSER def prepare_to_edit(self, edits):\nUSER res = []\nUSER seen = dict()\nUSER \nUSER self.need_commit_before_edits = set()\nUSER \nUSER for edit in edits:\nUSER path = edit[0]\nUSER if path is None:\nUSER res.append(edit)\nUSER continue\nUSER if path == \"python\":\nUSER dump(edits)\nUSER if path in seen:\nUSER allowed = seen[path]\nUSER else:\nUSER allowed = self.allowed_to_edit(path)\nUSER seen[path] = allowed\nUSER \nUSER if allowed:\nUSER res.append(edit)\nUSER \nUSER self.dirty_commit()\nUSER self.need_commit_before_edits = set()\nUSER \nUSER return res\nUSER \nUSER def apply_updates(self):\nUSER edited = set()\nUSER try:\nUSER edits = self.get_edits()\nUSER edits = self.apply_edits_dry_run(edits)\nUSER edits = self.prepare_to_edit(edits)\nUSER edited = set(edit[0] for edit in edits)\nUSER \nUSER self.apply_edits(edits)\nUSER except ValueError as err:\nUSER self.num_malformed_responses += 1\nUSER \nUSER err = err.args[0]\nUSER \nUSER self.io.tool_error(\"The LLM did not conform to the edit format.\")\nUSER self.io.tool_output(urls.edit_errors)\nUSER self.io.tool_output()\nUSER self.io.tool_output(str(err))\nUSER \nUSER self.reflected_message = str(err)\nUSER return edited\nUSER \nUSER except ANY_GIT_ERROR as err:\nUSER self.io.tool_error(str(err))\nUSER return edited\nUSER except Exception as err:\nUSER self.io.tool_error(\"Exception while updating files:\")\nUSER self.io.tool_error(str(err), strip=False)\nUSER \nUSER traceback.print_exc()\nUSER \nUSER self.reflected_message = str(err)\nUSER return edited\nUSER \nUSER for path in edited:\nUSER if self.dry_run:\nUSER self.io.tool_output(f\"Did not apply edit to {path} (--dry-run)\")\nUSER else:\nUSER self.io.tool_output(f\"Applied edit to {path}\")\nUSER \nUSER return edited\nUSER \nUSER def parse_partial_args(self):\nUSER # dump(self.partial_response_function_call)\nUSER \nUSER data = self.partial_response_function_call.get(\"arguments\")\nUSER if not data:\nUSER return\nUSER \nUSER try:\nUSER return json.loads(data)\nUSER except JSONDecodeError:\nUSER pass\nUSER \nUSER try:\nUSER return json.loads(data + \"]}\")\nUSER except JSONDecodeError:\nUSER pass\nUSER \nUSER try:\nUSER return json.loads(data + \"}]}\")\nUSER except JSONDecodeError:\nUSER pass\nUSER \nUSER try:\nUSER return json.loads(data + '\"}]}')\nUSER except JSONDecodeError:\nUSER pass\nUSER \nUSER # commits...\nUSER \nUSER def get_context_from_history(self, history):\nUSER context = \"\"\nUSER if history:\nUSER for msg in history:\nUSER context += \"\\n\" + msg[\"role\"].upper() + \": \" + msg[\"content\"] + \"\\n\"\nUSER \nUSER return context\nUSER \nUSER def auto_commit(self, edited, context=None):\nUSER if not self.repo or not self.auto_commits or self.dry_run:\nUSER return\nUSER \nUSER if not context:\nUSER context = self.get_context_from_history(self.cur_messages)\nUSER \nUSER try:\nUSER res = self.repo.commit(fnames=edited, context=context, aider_edits=True)\nUSER if res:\nUSER self.show_auto_commit_outcome(res)\nUSER commit_hash, commit_message = res\nUSER return self.gpt_prompts.files_content_gpt_edits.format(\nUSER hash=commit_hash,\nUSER message=commit_message,\nUSER )\nUSER \nUSER return self.gpt_prompts.files_content_gpt_no_edits\nUSER except ANY_GIT_ERROR as err:\nUSER self.io.tool_error(f\"Unable to commit: {str(err)}\")\nUSER return\nUSER \nUSER def show_auto_commit_outcome(self, res):\nUSER commit_hash, commit_message = res\nUSER self.last_aider_commit_hash = commit_hash\nUSER self.aider_commit_hashes.add(commit_hash)\nUSER self.last_aider_commit_message = commit_message\nUSER if self.show_diffs:\nUSER self.commands.cmd_diff()\nUSER \nUSER def show_undo_hint(self):\nUSER if not self.commit_before_message:\nUSER return\nUSER if self.commit_before_message[-1] != self.repo.get_head_commit_sha():\nUSER self.io.tool_output(\"You can use /undo to undo and discard each aider commit.\")\nUSER \nUSER def dirty_commit(self):\nUSER if not self.need_commit_before_edits:\nUSER return\nUSER if not self.dirty_commits:\nUSER return\nUSER if not self.repo:\nUSER return\nUSER \nUSER self.repo.commit(fnames=self.need_commit_before_edits)\nUSER \nUSER # files changed, move cur messages back behind the files messages\nUSER # self.move_back_cur_messages(self.gpt_prompts.files_content_local_edits)\nUSER return True\nUSER \nUSER def get_edits(self, mode=\"update\"):\nUSER return []\nUSER \nUSER def apply_edits(self, edits):\nUSER return\nUSER \nUSER def apply_edits_dry_run(self, edits):\nUSER return edits\nUSER \nUSER def run_shell_commands(self):\nUSER if not self.suggest_shell_commands:\nUSER return \"\"\nUSER \nUSER done = set()\nUSER group = ConfirmGroup(set(self.shell_commands))\nUSER accumulated_output = \"\"\nUSER for command in self.shell_commands:\nUSER if command in done:\nUSER continue\nUSER done.add(command)\nUSER output = self.handle_shell_commands(command, group)\nUSER if output:\nUSER accumulated_output += output + \"\\n\\n\"\nUSER return accumulated_output\nUSER \nUSER def handle_shell_commands(self, commands_str, group):\nUSER commands = commands_str.strip().splitlines()\nUSER command_count = sum(\nUSER 1 for cmd in commands if cmd.strip() and not cmd.strip().startswith(\"#\")\nUSER )\nUSER prompt = \"Run shell command?\" if command_count == 1 else \"Run shell commands?\"\nUSER if not self.io.confirm_ask(\nUSER prompt,\nUSER subject=\"\\n\".join(commands),\nUSER explicit_yes_required=True,\nUSER group=group,\nUSER allow_never=True,\nUSER ):\nUSER return\nUSER \nUSER accumulated_output = \"\"\nUSER for command in commands:\nUSER command = command.strip()\nUSER if not command or command.startswith(\"#\"):\nUSER continue\nUSER \nUSER self.io.tool_output()\nUSER self.io.tool_output(f\"Running {command}\")\nUSER # Add the command to input history\nUSER self.io.add_to_input_history(f\"/run {command.strip()}\")\nUSER exit_status, output = run_cmd(command, error_print=self.io.tool_error, cwd=self.root)\nUSER if output:\nUSER accumulated_output += f\"Output from {command}\\n{output}\\n\"\nUSER \nUSER if accumulated_output.strip() and self.io.confirm_ask(\nUSER \"Add command output to the chat?\", allow_never=True\nUSER ):\nUSER num_lines = len(accumulated_output.strip().splitlines())\nUSER line_plural = \"line\" if num_lines == 1 else \"lines\"\nUSER self.io.tool_output(f\"Added {num_lines} {line_plural} of output to the chat.\")\nUSER return accumulated_output\nUSER ```\n-------\nASSISTANT type: text\nASSISTANT text: Ok, I will use that as the true, current contents of the files.\nASSISTANT cache_control: {'type': 'ephemeral'}\n-------\nUSER \nUSER I've written your instructions in comments in the code and marked them with \"ai\"\nUSER You can see the \"AI\" comments shown below (marked with \u2588).\nUSER Find them in the code files I've shared with you, and follow their instructions.\nUSER \nUSER After completing those instructions, also be sure to remove all the \"AI\" comments from the code too.\nUSER \nUSER aider/coders/base_coder.py:\nUSER \u22ee...\nUSER \u2502class Coder:\nUSER \u2502 abs_fnames = None\nUSER \u22ee...\nUSER \u2502 def send_message(self, inp):\nUSER \u2502 self.event(\"message_send_starting\")\nUSER \u2502\nUSER \u22ee...\nUSER \u2502 interrupted = True\nUSER \u2502\nUSER \u2502 if interrupted:\nUSER \u2588 # check if the last messages was role==user, append the ^C Key.. to it if so. ai!\nUSER \u2502 self.cur_messages += [\nUSER \u2502 dict(role=\"user\", content=\"^C KeyboardInterrupt\"),\nUSER \u2502 dict(role=\"assistant\", content=\"I see that you interrupted my previous reply.\"),\nUSER \u22ee...\n-------\nUSER ^C KeyboardInterrupt\n-------\nASSISTANT I see that you interrupted my previous reply.\n-------\nUSER \nUSER I've written your instructions in comments in the code and marked them with \"ai\"\nUSER You can see the \"AI\" comments shown below (marked with \u2588).\nUSER Find them in the code files I've shared with you, and follow their instructions.\nUSER \nUSER After completing those instructions, also be sure to remove all the \"AI\" comments from the code too.\nUSER \nUSER aider/coders/base_coder.py:\nUSER \u22ee...\nUSER \u2502class Coder:\nUSER \u2502 abs_fnames = None\nUSER \u22ee...\nUSER \u2502 def send_message(self, inp):\nUSER \u2502 self.event(\"message_send_starting\")\nUSER \u2502\nUSER \u22ee...\nUSER \u2502 interrupted = True\nUSER \u2502\nUSER \u2502 if interrupted:\nUSER \u2588 # check if the last messages was role==user, append the ^C Key.. to it if so. ai!\nUSER \u2502 self.cur_messages += [\nUSER \u2502 dict(role=\"user\", content=\"^C KeyboardInterrupt\"),\nUSER \u2502 dict(role=\"assistant\", content=\"I see that you interrupted my previous reply.\"),\nUSER \u22ee..."}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737945840} +{"event": "command_clear", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737945844} +{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737945847} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737945847} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "ask", "prompt_tokens": 19527, "completion_tokens": 236, "total_tokens": 19763, "cost": 0.062121, "total_cost": 0.062121}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737945854} +{"event": "command_code", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737945871} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737945871} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 22058, "completion_tokens": 191, "total_tokens": 22249, "cost": 0.069039, "total_cost": 0.13116}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737945879} +{"event": "command_commit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737945909} +{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737945913} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737945929} +{"event": "repo", "properties": {"num_files": 430}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737945931} +{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737945931} +{"event": "ai-comments file-add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737945940} +{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737945940} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737945940} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 21670, "completion_tokens": 263, "total_tokens": 21933, "cost": 0.068955, "total_cost": 0.068955}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737945948} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737945957} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 22349, "completion_tokens": 137, "total_tokens": 22486, "cost": 0.069102, "total_cost": 0.13805699999999999}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737945963} +{"event": "command_reset", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737945977} +{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737945981} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737945984} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 21509, "completion_tokens": 450, "total_tokens": 21959, "cost": 0.07127700000000001, "total_cost": 0.209334}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737946000} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737946049} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 22196, "completion_tokens": 227, "total_tokens": 22423, "cost": 0.06999300000000001, "total_cost": 0.279327}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737946058} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737946143} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 24626, "completion_tokens": 495, "total_tokens": 25121, "cost": 0.081303, "total_cost": 0.36063}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737946159} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737946200} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 25289, "completion_tokens": 343, "total_tokens": 25632, "cost": 0.081012, "total_cost": 0.441642}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737946210} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737946254} +{"event": "repo", "properties": {"num_files": 430}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737946256} +{"event": "cli session", "properties": {"main_model": "gpt-4", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "gpt-4", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737946256} +{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737946260} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737946261} +{"event": "ai-comments file-add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737946307} +{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737946307} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737946307} +{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737946307} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737946307} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 25942, "completion_tokens": 210, "total_tokens": 26152, "cost": 0.080976, "total_cost": 0.522618}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737946315} +{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737946327} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737946328} +{"event": "repo", "properties": {"num_files": 430}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737946330} +{"event": "cli session", "properties": {"main_model": "gpt-4", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "gpt-4", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737946330} +{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737946333} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737946334} +{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737946362} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737946364} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737946367} +{"event": "repo", "properties": {"num_files": 430}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737946369} +{"event": "cli session", "properties": {"main_model": "gpt-4", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "gpt-4", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737946369} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737946371} +{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737946402} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737946406} +{"event": "repo", "properties": {"num_files": 430}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737946407} +{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737946411} +{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737946543} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737946550} +{"event": "gui session", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737946550} +{"event": "exit", "properties": {"reason": "GUI session ended"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737946550} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737946694} +{"event": "repo", "properties": {"num_files": 430}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737946696} +{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737946696} +{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737946698} +{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737946698} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737946828} +{"event": "repo", "properties": {"num_files": 430}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737946830} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737946830} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737946849} +{"event": "repo", "properties": {"num_files": 430}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737946851} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737946851} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737946898} +{"event": "repo", "properties": {"num_files": 430}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737946900} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737946900} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737946967} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737946969} +{"event": "repo", "properties": {"num_files": 430}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737946970} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737946971} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737947066} +{"event": "repo", "properties": {"num_files": 430}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737947068} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737947068} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737947090} +{"event": "repo", "properties": {"num_files": 430}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737947092} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737947092} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737947287} +{"event": "repo", "properties": {"num_files": 430}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737947289} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737947289} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737947321} +{"event": "repo", "properties": {"num_files": 430}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737947322} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737947322} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737947330} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737947333} +{"event": "repo", "properties": {"num_files": 430}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737947335} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737947335} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737947344} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737947349} +{"event": "repo", "properties": {"num_files": 430}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737947351} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737947351} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 10010, "completion_tokens": 89, "total_tokens": 10099, "cost": 0.031365000000000004, "total_cost": 0.031365000000000004}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737947355} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737947355} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737947361} +{"event": "repo", "properties": {"num_files": 430}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737947363} +{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737947367} diff --git a/aider/website/docs/faq.md b/aider/website/docs/faq.md index 97d393ad8..c48534c99 100644 --- a/aider/website/docs/faq.md +++ b/aider/website/docs/faq.md @@ -249,14 +249,13 @@ tr:hover { background-color: #f5f5f5; }
Model NameTotal TokensPercent
deepseek/deepseek-chat1,285,46055.3%
claude-3-5-sonnet-20241022670,00928.8%
deepseek/REDACTED308,84113.3%
deepseek/deepseek-chat1,262,74454.9%
claude-3-5-sonnet-20241022670,00929.1%
deepseek/REDACTED308,84113.4%
deepseek/deepseek-reasoner22,9891.0%
claude-3-5-haiku-2024102210,0830.4%
gemini/gemini-exp-120610,0680.4%
- - - - - - - - + + + + + + +
Model NameTotal TokensPercent
deepseek/deepseek-chat1,262,74454.9%
claude-3-5-sonnet-20241022670,00929.1%
deepseek/REDACTED308,84113.4%
deepseek/deepseek-reasoner22,9891.0%
claude-3-5-haiku-2024102210,0830.4%
gemini/gemini-exp-120610,0680.4%
mistral/codestral-latest8,1370.4%
o14,9630.2%
deepseek/deepseek-chat910,31841.9%
claude-3-5-sonnet-20241022887,82640.9%
deepseek/REDACTED308,84114.2%
deepseek/deepseek-reasoner40,5971.9%
claude-3-5-haiku-2024102210,0830.5%
gemini/gemini-exp-120610,0680.5%
o12,3850.1%
gpt-4o1,7750.1%
o1-preview1750.0%
diff --git a/aider/website/index.md b/aider/website/index.md index fae50719e..e9b80f235 100644 --- a/aider/website/index.md +++ b/aider/website/index.md @@ -79,11 +79,14 @@ aider-install # Change directory into your code base cd /to/your/project +# Work with DeepSeek on your code +aider --model deepseek --api-key deepseek=your-key-goes-here + # Work with Claude 3.5 Sonnet on your code -aider --model sonnet --anthropic-api-key your-key-goes-here +aider --model sonnet --api-key anthropic=your-key-goes-here # Work with GPT-4o on your code -aider --model gpt-4o --openai-api-key your-key-goes-here +aider --model gpt-4o --api-key openai=your-key-goes-here ``` From 60b8bccd374172b6c1d587cef0375e03c92ac1e1 Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Mon, 27 Jan 2025 16:45:00 -0800 Subject: [PATCH 157/229] feat: Add documentation for controlling OpenRouter provider selection in model settings --- aider/website/docs/llms/openrouter.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/aider/website/docs/llms/openrouter.md b/aider/website/docs/llms/openrouter.md index 20888a33c..94849ae05 100644 --- a/aider/website/docs/llms/openrouter.md +++ b/aider/website/docs/llms/openrouter.md @@ -39,5 +39,24 @@ If you get errors, check your Be sure to "enable providers that may train on inputs" to allow use of all models. +## Controlling provider selection + +You can control which OpenRouter providers are used by creating a `.aider.model.settings.yml` file in your home directory or project root. For example: + +```yaml +- name: openrouter/anthropic/claude-3.5-sonnet + extra_params: + provider: + # Only use these providers, in this order + order: ["Anthropic", "Together"] + # Don't fall back to other providers + allow_fallbacks: false + # Skip providers that may train on inputs + data_collection: "deny" + # Only use providers supporting all parameters + require_parameters: true +``` + +See [OpenRouter's provider routing docs](https://openrouter.ai/docs/provider-routing) for full details on these settings. From 4f19f89d4c4452cfe8651913ad776a66688ae1b0 Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Mon, 27 Jan 2025 16:46:03 -0800 Subject: [PATCH 158/229] docs: Add link to advanced model settings in OpenRouter documentation --- aider/website/docs/llms/openrouter.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aider/website/docs/llms/openrouter.md b/aider/website/docs/llms/openrouter.md index 94849ae05..b60b698fd 100644 --- a/aider/website/docs/llms/openrouter.md +++ b/aider/website/docs/llms/openrouter.md @@ -41,7 +41,7 @@ to allow use of all models. ## Controlling provider selection -You can control which OpenRouter providers are used by creating a `.aider.model.settings.yml` file in your home directory or project root. For example: +You can control which OpenRouter providers are used by creating a `.aider.model.settings.yml` file in your home directory or project root. See [Advanced model settings](https://aider.chat/docs/config/adv-model-settings.html) for more details about model settings files. For example: ```yaml - name: openrouter/anthropic/claude-3.5-sonnet From 91f1528149b800258af49dd39cf3aeb11b418f5b Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Mon, 27 Jan 2025 16:47:14 -0800 Subject: [PATCH 159/229] copy --- aider/website/assets/sample-analytics.jsonl | 242 ++++++++++---------- aider/website/docs/faq.md | 11 +- aider/website/docs/llms/openrouter.md | 4 +- aider/website/docs/more/infinite-output.md | 1 + 4 files changed, 130 insertions(+), 128 deletions(-) diff --git a/aider/website/assets/sample-analytics.jsonl b/aider/website/assets/sample-analytics.jsonl index 6d44fd631..a7d9250b1 100644 --- a/aider/website/assets/sample-analytics.jsonl +++ b/aider/website/assets/sample-analytics.jsonl @@ -1,124 +1,3 @@ -{"event": "gui session", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736807243} -{"event": "exit", "properties": {"reason": "GUI session ended"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736807243} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736812065} -{"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736812067} -{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736812069} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736812371} -{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736812374} -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736812374} -{"event": "ai-comments file-add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736812375} -{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736812375} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736812375} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 10054, "completion_tokens": 207, "total_tokens": 10261, "cost": 0.0014655199999980399, "total_cost": 0.0014655199999980399}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736812386} -{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736812405} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736812405} -{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736813429} -{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736813429} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736821676} -{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736821678} -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736821678} -{"event": "ai-comments file-add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736821680} -{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736821680} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736821680} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 13967, "completion_tokens": 734, "total_tokens": 14701, "cost": 0.0021608999999980396, "total_cost": 0.0021608999999980396}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736821701} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736821714} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 15829, "completion_tokens": 121, "total_tokens": 15950, "cost": 0.00224993999999804, "total_cost": 0.00441083999999608}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736821721} -{"event": "command_lint", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736821765} -{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736821898} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736821898} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736821929} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 16915, "completion_tokens": 774, "total_tokens": 17689, "cost": 0.0025848199999980405, "total_cost": 0.00699565999999412}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736821949} -{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736822189} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736822190} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 17958, "completion_tokens": 432, "total_tokens": 18390, "cost": 0.0026350799999980403, "total_cost": 0.009630739999992161}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736822223} -{"event": "command_lint", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736822806} -{"event": "command_commit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736822811} -{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736822960} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736822960} -{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736823014} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736823014} -{"event": "command_model", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736823024} -{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736823026} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736823026} -{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 19309, "completion_tokens": 618, "total_tokens": 19927, "cost": 0.067197, "total_cost": 0.07682773999999216}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736823039} -{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736823806} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736823806} -{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 20351, "completion_tokens": 355, "total_tokens": 20706, "cost": 0.066378, "total_cost": 0.14320573999999217}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736823823} -{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736824648} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736824648} -{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 17348, "completion_tokens": 277, "total_tokens": 17625, "cost": 0.056199, "total_cost": 0.19940473999999217}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736824660} -{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736829877} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736829877} -{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 18071, "completion_tokens": 229, "total_tokens": 18300, "cost": 0.057648000000000005, "total_cost": 0.2570527399999922}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736829884} -{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736829924} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736829924} -{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 18752, "completion_tokens": 254, "total_tokens": 19006, "cost": 0.060066, "total_cost": 0.3171187399999922}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736829933} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736829948} -{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 19102, "completion_tokens": 348, "total_tokens": 19450, "cost": 0.062526, "total_cost": 0.37964473999999215}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736829957} -{"event": "command_undo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736829964} -{"event": "command_lint", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736830026} -{"event": "command_lint", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736830048} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736830063} -{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 14582, "completion_tokens": 135, "total_tokens": 14717, "cost": 0.045771, "total_cost": 0.42541573999999216}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736830068} -{"event": "command_lint", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736830097} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736831023} -{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736831025} -{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736831030} -{"event": "ai-comments file-add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736872863} -{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736872863} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736872863} -{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 19760, "completion_tokens": 162, "total_tokens": 19922, "cost": 0.06171, "total_cost": 0.44135473999999214}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736872869} -{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736879750} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736879750} -{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 20179, "completion_tokens": 214, "total_tokens": 20393, "cost": 0.063747, "total_cost": 0.5051017399999922}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736879758} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736879771} -{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 20490, "completion_tokens": 40, "total_tokens": 20530, "cost": 0.06207000000000001, "total_cost": 0.5671717399999922}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736879777} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736879787} -{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 20545, "completion_tokens": 512, "total_tokens": 21057, "cost": 0.069315, "total_cost": 0.6364867399999922}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736879799} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736879807} -{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 18224, "completion_tokens": 118, "total_tokens": 18342, "cost": 0.056442, "total_cost": 0.6929287399999922}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736879818} -{"event": "command_model", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736879828} -{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736880670} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736880670} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 18647, "completion_tokens": 1009, "total_tokens": 19656, "cost": 0.0028931000000000004, "total_cost": 0.6958218399999921}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736880694} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736888187} -{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736888189} -{"event": "cli session", "properties": {"main_model": "gemini/gemini-exp-1206", "weak_model": "gemini/gemini-exp-1206", "editor_model": "gemini/gemini-exp-1206", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736888190} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736888192} -{"event": "message_send", "properties": {"main_model": "gemini/gemini-exp-1206", "weak_model": "gemini/gemini-exp-1206", "editor_model": "gemini/gemini-exp-1206", "edit_format": "diff", "prompt_tokens": 10023, "completion_tokens": 45, "total_tokens": 10068, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736888197} -{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736888198} -{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736888198} -{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736892852} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736892852} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 20043, "completion_tokens": 188, "total_tokens": 20231, "cost": 0.0028586600000000003, "total_cost": 0.6986804999999922}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736892860} -{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736892903} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736910815} -{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736910817} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736910817} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 10037, "completion_tokens": 36, "total_tokens": 10073, "cost": 0.00141525999999804, "total_cost": 0.00141525999999804}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736911269} -{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736911269} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736911388} -{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736911390} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736911390} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 9999, "completion_tokens": 37, "total_tokens": 10036, "cost": 0.00141021999999804, "total_cost": 0.00141021999999804}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736911396} -{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736911396} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736911505} -{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736911507} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736911507} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 9998, "completion_tokens": 37, "total_tokens": 10035, "cost": 0.00141007999999804, "total_cost": 0.00141007999999804}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736911512} -{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1736911512} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737002938} -{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737002941} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737002941} -{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737002965} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737002967} -{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737002969} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737002969} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 9994, "completion_tokens": 37, "total_tokens": 10031, "cost": 0.00140951999999804, "total_cost": 0.00140951999999804}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737002993} -{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737002993} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737008253} -{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737008255} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737008255} {"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737008434} {"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737008437} {"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737008438} @@ -998,3 +877,124 @@ {"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737947361} {"event": "repo", "properties": {"num_files": 430}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737947363} {"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737947367} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737999053} +{"event": "gui session", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737999054} +{"event": "exit", "properties": {"reason": "GUI session ended"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737999054} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737999458} +{"event": "repo", "properties": {"num_files": 430}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737999461} +{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737999461} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737999478} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737999649} +{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737999704} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738014260} +{"event": "repo", "properties": {"num_files": 430}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738014264} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738014264} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738014425} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738014429} +{"event": "repo", "properties": {"num_files": 430}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738014432} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738014432} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738014442} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738014446} +{"event": "repo", "properties": {"num_files": 430}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738014449} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738014449} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738014456} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738014462} +{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738014463} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738014463} +{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "ask", "prompt_tokens": 68, "completion_tokens": 36, "total_tokens": 104, "cost": 1.9600000000000002e-05, "total_cost": 1.9600000000000002e-05}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738014474} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738014474} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738014484} +{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738014485} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738014485} +{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "ask", "prompt_tokens": 68, "completion_tokens": 38, "total_tokens": 106, "cost": 2.1056000000000003e-05, "total_cost": 2.1056000000000003e-05}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738014574} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738014574} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738014659} +{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738014661} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738014661} +{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "ask", "prompt_tokens": 68, "completion_tokens": 36, "total_tokens": 104, "cost": 2.0496e-05, "total_cost": 2.0496e-05}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738014668} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738014668} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738014695} +{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738014696} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738014696} +{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "ask", "prompt_tokens": 68, "completion_tokens": 39, "total_tokens": 107, "cost": 2.1336e-05, "total_cost": 2.1336e-05}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738014700} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738014700} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738014756} +{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738014757} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738014757} +{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "ask", "prompt_tokens": 68, "completion_tokens": 39, "total_tokens": 107, "cost": 2.1336e-05, "total_cost": 2.1336e-05}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738014760} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738014760} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738014765} +{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738014767} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738014767} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738014783} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738014785} +{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738014786} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738014786} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738015153} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738015969} +{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738015971} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738015971} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738015995} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738015998} +{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738016000} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738016000} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "ask", "prompt_tokens": 78, "completion_tokens": 37, "total_tokens": 115, "cost": 0.000789, "total_cost": 0.000789}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738016002} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738016002} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738016009} +{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738016010} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738016010} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738016048} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738016050} +{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738016052} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738016052} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738016068} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738016070} +{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738016072} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738016072} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738016156} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738016158} +{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738016160} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738016160} +{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "ask", "prompt_tokens": 68, "completion_tokens": 39, "total_tokens": 107, "cost": 2.1336e-05, "total_cost": 2.1336e-05}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738016211} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738016211} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738016870} +{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738016872} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738016872} +{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "ask", "prompt_tokens": 68, "completion_tokens": 29, "total_tokens": 97, "cost": 1.8536e-05, "total_cost": 1.8536e-05}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738016875} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738016875} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738016903} +{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738016905} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738016905} +{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "ask", "prompt_tokens": 68, "completion_tokens": 31, "total_tokens": 99, "cost": 1.9096e-05, "total_cost": 1.9096e-05}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738016908} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738016908} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738017041} +{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738017043} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738017043} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738017173} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738017175} +{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738017177} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738017177} +{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "ask", "prompt_tokens": 68, "completion_tokens": 30, "total_tokens": 98, "cost": 1.8816e-05, "total_cost": 1.8816e-05}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738017278} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738017278} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738017339} +{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738017340} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738017341} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738017404} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738017405} +{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738017406} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738017407} +{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "ask", "prompt_tokens": 68, "completion_tokens": 35, "total_tokens": 103, "cost": 2.0216e-05, "total_cost": 2.0216e-05}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738017521} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738017521} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738017554} +{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738017556} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738017556} +{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "ask", "prompt_tokens": 68, "completion_tokens": 36, "total_tokens": 104, "cost": 2.0496e-05, "total_cost": 2.0496e-05}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738017857} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738017857} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738025037} +{"event": "repo", "properties": {"num_files": 430}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738025039} +{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738025039} +{"event": "command_read-only", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738025042} +{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738025046} +{"event": "command_web", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738025057} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738025087} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 21842, "completion_tokens": 341, "total_tokens": 22183, "cost": 0.070641, "total_cost": 0.070641}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738025098} diff --git a/aider/website/docs/faq.md b/aider/website/docs/faq.md index c48534c99..beb9d0432 100644 --- a/aider/website/docs/faq.md +++ b/aider/website/docs/faq.md @@ -249,12 +249,11 @@ tr:hover { background-color: #f5f5f5; } - - - - - - + + + + + diff --git a/aider/website/docs/llms/openrouter.md b/aider/website/docs/llms/openrouter.md index b60b698fd..22932985f 100644 --- a/aider/website/docs/llms/openrouter.md +++ b/aider/website/docs/llms/openrouter.md @@ -41,7 +41,9 @@ to allow use of all models. ## Controlling provider selection -You can control which OpenRouter providers are used by creating a `.aider.model.settings.yml` file in your home directory or project root. See [Advanced model settings](https://aider.chat/docs/config/adv-model-settings.html) for more details about model settings files. For example: +You can control which OpenRouter providers are used by creating a `.aider.model.settings.yml` file in your home directory or project root. +See [Advanced model settings](https://aider.chat/docs/config/adv-model-settings.html#model-settings) +for more details about model settings files. For example: ```yaml - name: openrouter/anthropic/claude-3.5-sonnet diff --git a/aider/website/docs/more/infinite-output.md b/aider/website/docs/more/infinite-output.md index cec71ee4d..4e046fbf3 100644 --- a/aider/website/docs/more/infinite-output.md +++ b/aider/website/docs/more/infinite-output.md @@ -93,6 +93,7 @@ cog.out(model_list) - mistral/pixtral-large-2411 - mistral/pixtral-large-latest - openrouter/anthropic/claude-3.5-sonnet +- openrouter/deepseek/deepseek-r1 - us.anthropic.claude-3-5-haiku-20241022-v1:0 - us.anthropic.claude-3-5-sonnet-20241022-v2:0 - vertex_ai/claude-3-5-haiku From f1e7d68415464213b6d42f74da18f49a209c2a5f Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Mon, 27 Jan 2025 17:01:44 -0800 Subject: [PATCH 160/229] copy --- aider/website/docs/llms/openrouter.md | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/aider/website/docs/llms/openrouter.md b/aider/website/docs/llms/openrouter.md index 22932985f..cd994f8bc 100644 --- a/aider/website/docs/llms/openrouter.md +++ b/aider/website/docs/llms/openrouter.md @@ -41,9 +41,17 @@ to allow use of all models. ## Controlling provider selection -You can control which OpenRouter providers are used by creating a `.aider.model.settings.yml` file in your home directory or project root. -See [Advanced model settings](https://aider.chat/docs/config/adv-model-settings.html#model-settings) -for more details about model settings files. For example: +OpenRouter often has multiple providers serving each model. +You can control which OpenRouter providers are used for your requests in two ways: + +1. By "ignoring" certain providers in your +[OpenRouter account settings](). +This disables those named providers across all the models that you access via OpenRouter. + +2. By configuring "provider routing" in a `.aider.model.settings.yml` file. + +Place that file in your home directory or the root if your git project, with +entries like this: ```yaml - name: openrouter/anthropic/claude-3.5-sonnet @@ -61,4 +69,8 @@ for more details about model settings files. For example: See [OpenRouter's provider routing docs](https://openrouter.ai/docs/provider-routing) for full details on these settings. +See [Advanced model settings](https://aider.chat/docs/config/adv-model-settings.html#model-settings) +for more details about model settings files. + + From 24c7d145ea3b42969cc834cb920c56ef94e0e598 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Mon, 27 Jan 2025 17:01:59 -0800 Subject: [PATCH 161/229] copy --- aider/website/docs/llms/openrouter.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aider/website/docs/llms/openrouter.md b/aider/website/docs/llms/openrouter.md index cd994f8bc..ad9c13ab3 100644 --- a/aider/website/docs/llms/openrouter.md +++ b/aider/website/docs/llms/openrouter.md @@ -45,7 +45,7 @@ OpenRouter often has multiple providers serving each model. You can control which OpenRouter providers are used for your requests in two ways: 1. By "ignoring" certain providers in your -[OpenRouter account settings](). +[OpenRouter account settings](https://openrouter.ai/settings/preferences). This disables those named providers across all the models that you access via OpenRouter. 2. By configuring "provider routing" in a `.aider.model.settings.yml` file. From ae7d4592e1e8d2e1360d24eae6a5d9ddbc3ebb20 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Mon, 27 Jan 2025 18:29:52 -0800 Subject: [PATCH 162/229] copy --- aider/website/docs/llms/openrouter.md | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/aider/website/docs/llms/openrouter.md b/aider/website/docs/llms/openrouter.md index ad9c13ab3..9d561bf1c 100644 --- a/aider/website/docs/llms/openrouter.md +++ b/aider/website/docs/llms/openrouter.md @@ -56,15 +56,16 @@ entries like this: ```yaml - name: openrouter/anthropic/claude-3.5-sonnet extra_params: - provider: - # Only use these providers, in this order - order: ["Anthropic", "Together"] - # Don't fall back to other providers - allow_fallbacks: false - # Skip providers that may train on inputs - data_collection: "deny" - # Only use providers supporting all parameters - require_parameters: true + extra_body: + provider: + # Only use these providers, in this order + order: ["Anthropic", "Together"] + # Don't fall back to other providers + allow_fallbacks: false + # Skip providers that may train on inputs + data_collection: "deny" + # Only use providers supporting all parameters + require_parameters: true ``` See [OpenRouter's provider routing docs](https://openrouter.ai/docs/provider-routing) for full details on these settings. From 588f2502ec585fd9aa86a7061523f6aea001e641 Mon Sep 17 00:00:00 2001 From: Andrea Bergamasco Date: Tue, 28 Jan 2025 12:08:55 +0100 Subject: [PATCH 163/229] Update deepseek.md Added API key instructions --- aider/website/docs/llms/deepseek.md | 1 + 1 file changed, 1 insertion(+) diff --git a/aider/website/docs/llms/deepseek.md b/aider/website/docs/llms/deepseek.md index d1f8ebfbf..c49c49c7e 100644 --- a/aider/website/docs/llms/deepseek.md +++ b/aider/website/docs/llms/deepseek.md @@ -6,6 +6,7 @@ nav_order: 500 # DeepSeek Aider can connect to the DeepSeek.com API. +To work with DeepSeek's models, you need to set the `DEEPSEEK_API_KEY` environment variable with your [DeepSeek API key](https://platform.deepseek.com/api_keys). The DeepSeek Chat V3 model has a top score on aider's code editing benchmark. ``` From a0ba140895bf422644d85b0bc61ceab2c77a4306 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Tue, 28 Jan 2025 09:27:40 -0800 Subject: [PATCH 164/229] copy --- aider/website/docs/llms/ollama.md | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/aider/website/docs/llms/ollama.md b/aider/website/docs/llms/ollama.md index 3e42648ed..ba034a6cf 100644 --- a/aider/website/docs/llms/ollama.md +++ b/aider/website/docs/llms/ollama.md @@ -45,6 +45,16 @@ setx OLLAMA_API_KEY # Windows, restart shell after setx [Ollama uses a 2k context window by default](https://github.com/ollama/ollama/blob/main/docs/faq.md#how-can-i-specify-the-context-window-size), which is very small for working with aider. +Unlike most other LLM servers, Ollama does not throw an error if you submit +a request that exceeds the context window. +Instead, it just silently truncates the request by discarding the "oldest" messages +in the chat to make it fit within the context window. + +So if your context window is too small, you won't get an explicit error. +The biggest symptom will be that aider says it can't see (some of) the files +you added to the chat. +That's because ollama is silently discarding them because they exceed the context window. + Aider sets Ollama's context window to 8k by default. If you would like a larger context window @@ -58,11 +68,3 @@ like this: num_ctx: 8192 ``` -Unlike most other LLM servers, Ollama does not throw an error if you submit -a request that exceeds the context window. -Instead, it just silently truncates the request by discarding the "oldest" messages -in the chat to make it fit within the context window. -So if your context window is too small, you won't get an error. -Aider will probably just fail to work well and experience -a lot of -[file editing problems](https://aider.chat/docs/troubleshooting/edit-errors.html). From 9b63b90ec4069b8001152b6bfde29049653aa1dd Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Tue, 28 Jan 2025 09:32:35 -0800 Subject: [PATCH 165/229] refactor: Remove unnecessary blank line in benchmark.py --- benchmark/benchmark.py | 1 - 1 file changed, 1 deletion(-) diff --git a/benchmark/benchmark.py b/benchmark/benchmark.py index 6f9411113..68f442c89 100755 --- a/benchmark/benchmark.py +++ b/benchmark/benchmark.py @@ -157,7 +157,6 @@ def resolve_dirname(dirname, use_single_prior, make_new): dirname = BENCHMARK_DNAME / dirname return dirname - @app.command() def main( dirnames: Optional[List[str]] = typer.Argument(None, help="Directory names"), From cf2c9c6dc7bd162dff5cdc2ce8c09532c9171a5f Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Tue, 28 Jan 2025 09:32:46 -0800 Subject: [PATCH 166/229] feat: Add --read-model-settings option to benchmark for loading model settings --- benchmark/benchmark.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/benchmark/benchmark.py b/benchmark/benchmark.py index 68f442c89..8d2b8942f 100755 --- a/benchmark/benchmark.py +++ b/benchmark/benchmark.py @@ -202,6 +202,9 @@ def main( num_ctx: Optional[int] = typer.Option( None, "--num-ctx", help="Override model context window size" ), + read_model_settings: str = typer.Option( + None, "--read-model-settings", help="Load aider model settings from YAML file" + ), exercises_dir: str = typer.Option( EXERCISES_DIR_DEFAULT, "--exercises-dir", help="Directory with exercise files" ), @@ -741,6 +744,18 @@ def run_test_real( model_metadata_files_loaded = models.register_litellm_models([resource_metadata]) dump(model_metadata_files_loaded) + if read_model_settings: + try: + files_loaded = models.register_models([read_model_settings]) + if verbose: + if files_loaded: + io.tool_output(f"Loaded model settings from: {files_loaded[0]}") + else: + io.tool_output(f"No model settings loaded from: {read_model_settings}") + except Exception as e: + io.tool_error(f"Error loading model settings: {e}") + return 1 + # weak_model_name = model_name weak_model_name = None From 823127c87e9b80a49eb6f30f4742f2eb2429069c Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Tue, 28 Jan 2025 09:32:55 -0800 Subject: [PATCH 167/229] style: Apply linter formatting to benchmark.py --- benchmark/benchmark.py | 1 + 1 file changed, 1 insertion(+) diff --git a/benchmark/benchmark.py b/benchmark/benchmark.py index 8d2b8942f..63a08a306 100755 --- a/benchmark/benchmark.py +++ b/benchmark/benchmark.py @@ -157,6 +157,7 @@ def resolve_dirname(dirname, use_single_prior, make_new): dirname = BENCHMARK_DNAME / dirname return dirname + @app.command() def main( dirnames: Optional[List[str]] = typer.Argument(None, help="Directory names"), From 3f890551e764cb452b12a1ea7fe97e9d17ad2471 Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Tue, 28 Jan 2025 09:33:14 -0800 Subject: [PATCH 168/229] fix: Add missing `read_model_settings` parameter to `run_test_real` function --- benchmark/benchmark.py | 1 + 1 file changed, 1 insertion(+) diff --git a/benchmark/benchmark.py b/benchmark/benchmark.py index 63a08a306..c5520bb49 100755 --- a/benchmark/benchmark.py +++ b/benchmark/benchmark.py @@ -646,6 +646,7 @@ def run_test_real( editor_edit_format, num_ctx=None, sleep=0, + read_model_settings=None, ): if not os.path.isdir(testdir): print("Not a dir:", testdir) From aa18b63c1615932d2be90ce5979d7e08201df095 Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Tue, 28 Jan 2025 09:38:57 -0800 Subject: [PATCH 169/229] refactor: Simplify model settings loading in benchmark script --- benchmark/benchmark.py | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/benchmark/benchmark.py b/benchmark/benchmark.py index c5520bb49..ca26d0ce9 100755 --- a/benchmark/benchmark.py +++ b/benchmark/benchmark.py @@ -742,22 +742,6 @@ def run_test_real( chat_history_file=history_fname, ) - resource_metadata = importlib_resources.files("aider.resources").joinpath("model-metadata.json") - model_metadata_files_loaded = models.register_litellm_models([resource_metadata]) - dump(model_metadata_files_loaded) - - if read_model_settings: - try: - files_loaded = models.register_models([read_model_settings]) - if verbose: - if files_loaded: - io.tool_output(f"Loaded model settings from: {files_loaded[0]}") - else: - io.tool_output(f"No model settings loaded from: {read_model_settings}") - except Exception as e: - io.tool_error(f"Error loading model settings: {e}") - return 1 - # weak_model_name = model_name weak_model_name = None From 0336a982ffb43f9bf8b461c70849351531bf9a47 Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Tue, 28 Jan 2025 09:39:39 -0800 Subject: [PATCH 170/229] feat: Add model settings loading and registration to benchmark script --- benchmark/benchmark.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/benchmark/benchmark.py b/benchmark/benchmark.py index ca26d0ce9..f8267761a 100755 --- a/benchmark/benchmark.py +++ b/benchmark/benchmark.py @@ -314,6 +314,22 @@ def main( test_dnames = sorted(str(d.relative_to(original_dname)) for d in exercise_dirs) + resource_metadata = importlib_resources.files("aider.resources").joinpath("model-metadata.json") + model_metadata_files_loaded = models.register_litellm_models([resource_metadata]) + dump(model_metadata_files_loaded) + + if read_model_settings: + try: + files_loaded = models.register_models([read_model_settings]) + if verbose: + if files_loaded: + print(f"Loaded model settings from: {files_loaded[0]}") + else: + print(f"No model settings loaded from: {read_model_settings}") + except Exception as e: + print(f"Error loading model settings: {e}") + return 1 + if keywords: keywords = keywords.split(",") test_dnames = [dn for dn in test_dnames for keyword in keywords if keyword in dn] From 5a7e59d833fc36e17c1a1fd53799dfe7d9b979c8 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Tue, 28 Jan 2025 09:51:24 -0800 Subject: [PATCH 171/229] docs: Add blog post about DeepSeek model downtime --- aider/website/_posts/2025-01-28-deepseek-down.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 aider/website/_posts/2025-01-28-deepseek-down.md diff --git a/aider/website/_posts/2025-01-28-deepseek-down.md b/aider/website/_posts/2025-01-28-deepseek-down.md new file mode 100644 index 000000000..e69de29bb From 204c68d47506d1f7816f5bde215bb234701043f1 Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Tue, 28 Jan 2025 09:51:26 -0800 Subject: [PATCH 172/229] feat: Add blog post template for DeepSeek V3 polyglot benchmark results --- .../_posts/2025-01-28-deepseek-down.md | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/aider/website/_posts/2025-01-28-deepseek-down.md b/aider/website/_posts/2025-01-28-deepseek-down.md index e69de29bb..5c7fd28c5 100644 --- a/aider/website/_posts/2025-01-28-deepseek-down.md +++ b/aider/website/_posts/2025-01-28-deepseek-down.md @@ -0,0 +1,73 @@ +--- +title: DeepSeek V3 polyglot benchmark results by provider +excerpt: Comparing DeepSeek V3 performance across different providers on aider's polyglot benchmark. +highlight_image: /assets/deepseek-down.jpg +draft: false +nav_exclude: true +--- +{% if page.date %} + +{% endif %} + +# DeepSeek V3 polyglot benchmark results by provider +{: .no_toc } + + + +DeepSeek V3 is a powerful open source model that performs well on aider's polyglot benchmark. +However, the results can vary significantly depending on which provider is serving the model. + +This article compares DeepSeek V3 results from multiple providers to help you choose the best option for your needs. + +## Results + +
Model NameTotal TokensPercent
deepseek/deepseek-chat910,31841.9%
claude-3-5-sonnet-20241022887,82640.9%
deepseek/REDACTED308,84114.2%
deepseek/deepseek-reasoner40,5971.9%
claude-3-5-haiku-2024102210,0830.5%
gemini/gemini-exp-120610,0680.5%
deepseek/deepseek-chat754,40141.9%
claude-3-5-sonnet-20241022680,14937.8%
deepseek/REDACTED308,84117.2%
deepseek/deepseek-reasoner40,5972.3%
claude-3-5-haiku-2024102210,0830.6%
o12,3850.1%
gpt-4o1,7750.1%
o1-preview1750.0%
+ + + + + + + + + + + + {% assign edit_sorted = site.data.deepseek-down | sort: 'pass_rate_2' | reverse %} + {% for row in edit_sorted %} + + + + + + + + + {% endfor %} + +
ModelPercent completed correctlyPercent using correct edit formatCommandEdit formatTotal Cost
{{ row.model }}{{ row.pass_rate_2 }}%{{ row.percent_cases_well_formed }}%{{ row.command }}{{ row.edit_format }}{% if row.total_cost == 0 %}?{% else %}${{ row.total_cost | times: 1.0 | round: 2 }}{% endif %}
+ + + + + From bf6ca2dc78e083da08b3d1bc256db532b636de4a Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Tue, 28 Jan 2025 09:52:20 -0800 Subject: [PATCH 173/229] docs: Update article to address DeepSeek API reliability issues and provide alternatives --- .../_posts/2025-01-28-deepseek-down.md | 26 ++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/aider/website/_posts/2025-01-28-deepseek-down.md b/aider/website/_posts/2025-01-28-deepseek-down.md index 5c7fd28c5..4d17e4ce2 100644 --- a/aider/website/_posts/2025-01-28-deepseek-down.md +++ b/aider/website/_posts/2025-01-28-deepseek-down.md @@ -1,6 +1,6 @@ --- -title: DeepSeek V3 polyglot benchmark results by provider -excerpt: Comparing DeepSeek V3 performance across different providers on aider's polyglot benchmark. +title: DeepSeek API issues - Alternative providers +excerpt: DeepSeek's API has been experiencing reliability issues. Here are alternative providers you can use. highlight_image: /assets/deepseek-down.jpg draft: false nav_exclude: true @@ -9,15 +9,29 @@ nav_exclude: true {% endif %} -# DeepSeek V3 polyglot benchmark results by provider +# DeepSeek API issues - Alternative providers {: .no_toc } -DeepSeek V3 is a powerful open source model that performs well on aider's polyglot benchmark. -However, the results can vary significantly depending on which provider is serving the model. +DeepSeek's API has been experiencing significant reliability issues for the past 24-48+ hours, with many users reporting downtime and overload problems. -This article compares DeepSeek V3 results from multiple providers to help you choose the best option for your needs. +If you're affected by these issues, several alternative providers offer access to DeepSeek models. This article compares their performance on aider's polyglot benchmark to help you choose a reliable alternative. + +## Using alternative providers + +The benchmark results below show that several providers offer comparable or better performance than DeepSeek's native API. To switch providers, you'll need to: + +1. Sign up for an account with your chosen alternative provider +2. Get their API key +3. Update your aider configuration to use their endpoint + +For example, to use OpenRouter: + +```bash +export OPENROUTER_API_KEY= +aider --model openrouter/deepseek/deepseek-v3 +``` ## Results From ce64ec539728b33ca58e1a0bcecb643d18af64d1 Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Tue, 28 Jan 2025 09:53:51 -0800 Subject: [PATCH 174/229] docs: Add documentation for configuring model settings and provider selection --- .../_posts/2025-01-28-deepseek-down.md | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/aider/website/_posts/2025-01-28-deepseek-down.md b/aider/website/_posts/2025-01-28-deepseek-down.md index 4d17e4ce2..d2c270592 100644 --- a/aider/website/_posts/2025-01-28-deepseek-down.md +++ b/aider/website/_posts/2025-01-28-deepseek-down.md @@ -33,6 +33,27 @@ export OPENROUTER_API_KEY= aider --model openrouter/deepseek/deepseek-v3 ``` +## Configuring model settings + +You may want to configure specific settings when using alternative providers. For example, you can control which OpenRouter providers are used to serve the model, or set other model parameters. + +Create a `.aider.model.settings.yml` file in your home directory or git project root with settings like this: + +```yaml +- name: openrouter/deepseek/deepseek-v3 + extra_params: + extra_body: + provider: + # Only use these providers, in this order + order: ["Novita"] + # Don't fall back to other providers + allow_fallbacks: false +``` + +See [OpenRouter's provider routing docs](https://openrouter.ai/docs/provider-routing) for full details on these settings. + +See [Advanced model settings](https://aider.chat/docs/config/adv-model-settings.html#model-settings) for more details about aider's model settings files. + ## Results From 6b90cd1277cc8b6e0143052eb0d962e9c5b7a4f7 Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Tue, 28 Jan 2025 09:54:27 -0800 Subject: [PATCH 175/229] feat: Add Fireworks configuration example and provider adaptation guidance --- .../_posts/2025-01-28-deepseek-down.md | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/aider/website/_posts/2025-01-28-deepseek-down.md b/aider/website/_posts/2025-01-28-deepseek-down.md index d2c270592..2985f2274 100644 --- a/aider/website/_posts/2025-01-28-deepseek-down.md +++ b/aider/website/_posts/2025-01-28-deepseek-down.md @@ -50,9 +50,29 @@ Create a `.aider.model.settings.yml` file in your home directory or git project allow_fallbacks: false ``` -See [OpenRouter's provider routing docs](https://openrouter.ai/docs/provider-routing) for full details on these settings. +Different providers may need different settings. For example, here's a configuration for using Fireworks: -See [Advanced model settings](https://aider.chat/docs/config/adv-model-settings.html#model-settings) for more details about aider's model settings files. +```yaml +- name: fireworks_ai/accounts/fireworks/models/deepseek-v3 + edit_format: diff + weak_model_name: null + use_repo_map: true + send_undo_reply: false + lazy: false + reminder: sys + examples_as_sys_msg: true + extra_params: + max_tokens: 8192 + cache_control: false + caches_by_default: true + use_system_prompt: true + use_temperature: true + streaming: true +``` + +You'll need to adapt these settings based on your chosen provider. See: +- [OpenRouter's provider routing docs](https://openrouter.ai/docs/provider-routing) for OpenRouter-specific settings +- [Advanced model settings](https://aider.chat/docs/config/adv-model-settings.html#model-settings) for details about all aider model settings ## Results From fe89ae13af46e7ae8ba46e8b507f59a8ca16743e Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Tue, 28 Jan 2025 09:58:21 -0800 Subject: [PATCH 176/229] docs: Add API key configuration methods for OpenRouter --- aider/website/_posts/2025-01-28-deepseek-down.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/aider/website/_posts/2025-01-28-deepseek-down.md b/aider/website/_posts/2025-01-28-deepseek-down.md index 2985f2274..df2003d48 100644 --- a/aider/website/_posts/2025-01-28-deepseek-down.md +++ b/aider/website/_posts/2025-01-28-deepseek-down.md @@ -29,8 +29,16 @@ The benchmark results below show that several providers offer comparable or bett For example, to use OpenRouter: ```bash +# Set your API key using environment variables export OPENROUTER_API_KEY= aider --model openrouter/deepseek/deepseek-v3 + +# Or use the --api-key command line option +aider --model openrouter/deepseek/deepseek-v3 --api-key openrouter= + +# Or add it to .aider.conf.yml in your home directory or project root: +api-key: + - openrouter= ``` ## Configuring model settings From a3726d72f5ec40b2e2981e865ead034bb1e8b045 Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Tue, 28 Jan 2025 09:58:50 -0800 Subject: [PATCH 177/229] fix: Update DeepSeek model name from v3 to chat in documentation --- aider/website/_posts/2025-01-28-deepseek-down.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/aider/website/_posts/2025-01-28-deepseek-down.md b/aider/website/_posts/2025-01-28-deepseek-down.md index df2003d48..071f4650f 100644 --- a/aider/website/_posts/2025-01-28-deepseek-down.md +++ b/aider/website/_posts/2025-01-28-deepseek-down.md @@ -31,10 +31,10 @@ For example, to use OpenRouter: ```bash # Set your API key using environment variables export OPENROUTER_API_KEY= -aider --model openrouter/deepseek/deepseek-v3 +aider --model openrouter/deepseek/deepseek-chat # Or use the --api-key command line option -aider --model openrouter/deepseek/deepseek-v3 --api-key openrouter= +aider --model openrouter/deepseek/deepseek-chat --api-key openrouter= # Or add it to .aider.conf.yml in your home directory or project root: api-key: @@ -48,7 +48,7 @@ You may want to configure specific settings when using alternative providers. Fo Create a `.aider.model.settings.yml` file in your home directory or git project root with settings like this: ```yaml -- name: openrouter/deepseek/deepseek-v3 +- name: openrouter/deepseek/deepseek-chat extra_params: extra_body: provider: @@ -61,7 +61,7 @@ Create a `.aider.model.settings.yml` file in your home directory or git project Different providers may need different settings. For example, here's a configuration for using Fireworks: ```yaml -- name: fireworks_ai/accounts/fireworks/models/deepseek-v3 +- name: fireworks_ai/accounts/fireworks/models/deepseek-chat edit_format: diff weak_model_name: null use_repo_map: true From f49733d1d2d3d02bc4fb39ef3406cc73aa938867 Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Tue, 28 Jan 2025 10:04:12 -0800 Subject: [PATCH 178/229] feat: Add `remove_reasoning` setting to ModelSettings --- aider/models.py | 1 + 1 file changed, 1 insertion(+) diff --git a/aider/models.py b/aider/models.py index ac6134261..8c78ac277 100644 --- a/aider/models.py +++ b/aider/models.py @@ -100,6 +100,7 @@ class ModelSettings: streaming: bool = True editor_model_name: Optional[str] = None editor_edit_format: Optional[str] = None + remove_reasoning: Optional[str] = None # https://platform.openai.com/docs/models/gpt-4-and-gpt-4-turbo From d434f8641dcb106b3193c033bca51b7994488773 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Tue, 28 Jan 2025 10:06:19 -0800 Subject: [PATCH 179/229] refactor: Prepare for potential reasoning tag removal in text merging --- aider/coders/base_coder.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/aider/coders/base_coder.py b/aider/coders/base_coder.py index 3556c4f2c..887cc62f2 100755 --- a/aider/coders/base_coder.py +++ b/aider/coders/base_coder.py @@ -1882,7 +1882,13 @@ class Coder: if new.rstrip() != new and not final: new = new.rstrip() - return cur + new + + res = cur + new + # if self.main_model.remove_reasoning, then use that string. say it's "think" + # then use a regex to remove ".*" from the res + # the text may span many lines. ai! + + return res def get_rel_fname(self, fname): try: From 8d2159761f7ea695429128c5823e284e1243cb06 Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Tue, 28 Jan 2025 10:06:21 -0800 Subject: [PATCH 180/229] refactor: Implement reasoning removal with regex in base_coder --- aider/coders/base_coder.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/aider/coders/base_coder.py b/aider/coders/base_coder.py index 887cc62f2..9c0dbc5d9 100755 --- a/aider/coders/base_coder.py +++ b/aider/coders/base_coder.py @@ -1884,9 +1884,11 @@ class Coder: new = new.rstrip() res = cur + new - # if self.main_model.remove_reasoning, then use that string. say it's "think" - # then use a regex to remove ".*" from the res - # the text may span many lines. ai! + + if self.main_model.remove_reasoning: + import re + pattern = f"<{self.main_model.remove_reasoning}>.*?" + res = re.sub(pattern, "", res, flags=re.DOTALL) return res From da89d6ab9c5462cd680d6db2966cf999959be22f Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Tue, 28 Jan 2025 10:06:29 -0800 Subject: [PATCH 181/229] style: Format code with linter and improve readability --- aider/coders/base_coder.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/aider/coders/base_coder.py b/aider/coders/base_coder.py index 9c0dbc5d9..c7ed3b423 100755 --- a/aider/coders/base_coder.py +++ b/aider/coders/base_coder.py @@ -1887,7 +1887,10 @@ class Coder: if self.main_model.remove_reasoning: import re - pattern = f"<{self.main_model.remove_reasoning}>.*?" + + pattern = ( + f"<{self.main_model.remove_reasoning}>.*?" + ) res = re.sub(pattern, "", res, flags=re.DOTALL) return res From 910d384ed82655addbae5d21e4666e8ac9ad5f83 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Tue, 28 Jan 2025 10:08:38 -0800 Subject: [PATCH 182/229] refactor: Move re import comment for clarity --- aider/coders/base_coder.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aider/coders/base_coder.py b/aider/coders/base_coder.py index c7ed3b423..b6f36efb5 100755 --- a/aider/coders/base_coder.py +++ b/aider/coders/base_coder.py @@ -1886,7 +1886,7 @@ class Coder: res = cur + new if self.main_model.remove_reasoning: - import re + import re # to top ai! pattern = ( f"<{self.main_model.remove_reasoning}>.*?" From 74d179e479b5cdcac52972bc5bd713f0d8787567 Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Tue, 28 Jan 2025 10:08:42 -0800 Subject: [PATCH 183/229] refactor: Move re import to top and remove AI comment --- aider/coders/base_coder.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/aider/coders/base_coder.py b/aider/coders/base_coder.py index b6f36efb5..af85f0411 100755 --- a/aider/coders/base_coder.py +++ b/aider/coders/base_coder.py @@ -9,6 +9,7 @@ import mimetypes import os import platform import re +import re import sys import threading import time @@ -1886,8 +1887,6 @@ class Coder: res = cur + new if self.main_model.remove_reasoning: - import re # to top ai! - pattern = ( f"<{self.main_model.remove_reasoning}>.*?" ) From 871229d0c5d2e901f1a279d9d64a181897ddd4b9 Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Tue, 28 Jan 2025 10:08:48 -0800 Subject: [PATCH 184/229] style: Remove duplicate import of re module --- aider/coders/base_coder.py | 1 - 1 file changed, 1 deletion(-) diff --git a/aider/coders/base_coder.py b/aider/coders/base_coder.py index af85f0411..d9d09765c 100755 --- a/aider/coders/base_coder.py +++ b/aider/coders/base_coder.py @@ -9,7 +9,6 @@ import mimetypes import os import platform import re -import re import sys import threading import time From 25687c2db150815005fdae36abb09ae05b9b2c6f Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Tue, 28 Jan 2025 10:49:09 -0800 Subject: [PATCH 185/229] bump deps --- requirements.txt | 22 +++++++++++----------- requirements/requirements-browser.txt | 10 +++++----- requirements/requirements-dev.txt | 18 +++++++++--------- requirements/requirements-help.txt | 18 +++++++++--------- 4 files changed, 34 insertions(+), 34 deletions(-) diff --git a/requirements.txt b/requirements.txt index 41e197dba..40d97ad0b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -17,7 +17,7 @@ anyio==4.8.0 # httpx # openai # watchfiles -attrs==24.3.0 +attrs==25.1.0 # via # aiohttp # jsonschema @@ -49,7 +49,7 @@ diskcache==5.6.3 # via -r requirements/requirements.in distro==1.9.0 # via openai -filelock==3.16.1 +filelock==3.17.0 # via huggingface-hub flake8==7.1.1 # via -r requirements/requirements.in @@ -73,7 +73,7 @@ httpx==0.27.2 # via # litellm # openai -huggingface-hub==0.27.1 +huggingface-hub==0.28.0 # via tokenizers idna==3.10 # via @@ -99,7 +99,7 @@ jsonschema==4.23.0 # litellm jsonschema-specifications==2024.10.1 # via jsonschema -litellm==1.58.2 +litellm==1.59.8 # via -r requirements/requirements.in markdown-it-py==3.0.0 # via rich @@ -124,7 +124,7 @@ numpy==1.26.4 # -r requirements/requirements.in # scipy # soundfile -openai==1.59.7 +openai==1.60.2 # via litellm packaging==24.2 # via @@ -138,9 +138,9 @@ pexpect==4.9.0 # via -r requirements/requirements.in pillow==10.4.0 # via -r requirements/requirements.in -posthog==3.8.3 +posthog==3.11.0 # via -r requirements/requirements.in -prompt-toolkit==3.0.48 +prompt-toolkit==3.0.50 # via -r requirements/requirements.in propcache==0.2.1 # via @@ -154,7 +154,7 @@ pycodestyle==2.12.1 # via flake8 pycparser==2.22 # via cffi -pydantic==2.10.5 +pydantic==2.10.6 # via # litellm # openai @@ -178,7 +178,7 @@ pyyaml==6.0.2 # via # -r requirements/requirements.in # huggingface-hub -referencing==0.36.0 +referencing==0.36.2 # via # jsonschema # jsonschema-specifications @@ -212,7 +212,7 @@ sniffio==1.3.1 # openai sounddevice==0.5.1 # via -r requirements/requirements.in -soundfile==0.13.0 +soundfile==0.13.1 # via -r requirements/requirements.in soupsieve==2.6 # via beautifulsoup4 @@ -254,5 +254,5 @@ zipp==3.21.0 # via importlib-metadata # The following packages are considered to be unsafe in a requirements file: -pip==24.3.1 +pip==25.0 # via -r requirements/requirements.in diff --git a/requirements/requirements-browser.txt b/requirements/requirements-browser.txt index 10489e8b1..c99d6525a 100644 --- a/requirements/requirements-browser.txt +++ b/requirements/requirements-browser.txt @@ -6,7 +6,7 @@ # altair==5.5.0 # via streamlit -attrs==24.3.0 +attrs==25.1.0 # via # -c /Users/gauthier/Projects/aider/requirements.txt # -c requirements.txt @@ -15,7 +15,7 @@ attrs==24.3.0 # referencing blinker==1.9.0 # via streamlit -cachetools==5.5.0 +cachetools==5.5.1 # via streamlit certifi==2024.12.14 # via @@ -92,7 +92,7 @@ mdurl==0.1.2 # -c requirements.txt # -c requirements/requirements-dev.txt # markdown-it-py -narwhals==1.22.0 +narwhals==1.24.0 # via altair numpy==1.26.4 # via @@ -144,7 +144,7 @@ pytz==2024.2 # via # -c requirements/requirements-dev.txt # pandas -referencing==0.36.0 +referencing==0.36.2 # via # -c /Users/gauthier/Projects/aider/requirements.txt # -c requirements.txt @@ -199,7 +199,7 @@ typing-extensions==4.12.2 # altair # referencing # streamlit -tzdata==2024.2 +tzdata==2025.1 # via # -c requirements/requirements-dev.txt # pandas diff --git a/requirements/requirements-dev.txt b/requirements/requirements-dev.txt index 7c0cf2c7d..311962175 100644 --- a/requirements/requirements-dev.txt +++ b/requirements/requirements-dev.txt @@ -28,7 +28,7 @@ click==8.1.8 # -c requirements.txt # pip-tools # typer -codespell==2.3.0 +codespell==2.4.0 # via -r requirements/requirements-dev.in cogapp==3.4.1 # via -r requirements/requirements-dev.in @@ -46,14 +46,14 @@ docutils==0.21.2 # via # sphinx # sphinx-rtd-theme -filelock==3.16.1 +filelock==3.17.0 # via # -c /Users/gauthier/Projects/aider/requirements.txt # -c requirements.txt # virtualenv -fonttools==4.55.3 +fonttools==4.55.7 # via matplotlib -identify==2.6.5 +identify==2.6.6 # via pre-commit idna==3.10 # via @@ -130,7 +130,7 @@ pox==0.3.5 # via pathos ppft==1.7.6.9 # via pathos -pre-commit==4.0.1 +pre-commit==4.1.0 # via -r requirements/requirements-dev.in pygments==2.19.1 # via @@ -173,7 +173,7 @@ rich==13.9.4 # -c /Users/gauthier/Projects/aider/requirements.txt # -c requirements.txt # typer -semver==3.0.2 +semver==3.0.4 # via -r requirements/requirements-dev.in shellingham==1.5.4 # via typer @@ -211,20 +211,20 @@ typing-extensions==4.12.2 # -c /Users/gauthier/Projects/aider/requirements.txt # -c requirements.txt # typer -tzdata==2024.2 +tzdata==2025.1 # via pandas urllib3==2.3.0 # via # -c /Users/gauthier/Projects/aider/requirements.txt # -c requirements.txt # requests -virtualenv==20.29.0 +virtualenv==20.29.1 # via pre-commit wheel==0.45.1 # via pip-tools # The following packages are considered to be unsafe in a requirements file: -pip==24.3.1 +pip==25.0 # via # -c /Users/gauthier/Projects/aider/requirements.txt # -c requirements.txt diff --git a/requirements/requirements-help.txt b/requirements/requirements-help.txt index 8088ab2fc..bcad47a8e 100644 --- a/requirements/requirements-help.txt +++ b/requirements/requirements-help.txt @@ -30,7 +30,7 @@ anyio==4.8.0 # -c /Users/gauthier/Projects/aider/requirements.txt # -c requirements.txt # httpx -attrs==24.3.0 +attrs==25.1.0 # via # -c /Users/gauthier/Projects/aider/requirements.txt # -c requirements.txt @@ -57,11 +57,11 @@ click==8.1.8 # nltk dataclasses-json==0.6.7 # via llama-index-core -deprecated==1.2.15 +deprecated==1.2.18 # via llama-index-core dirtyjson==1.0.8 # via llama-index-core -filelock==3.16.1 +filelock==3.17.0 # via # -c /Users/gauthier/Projects/aider/requirements.txt # -c requirements.txt @@ -103,7 +103,7 @@ httpx==0.27.2 # -c /Users/gauthier/Projects/aider/requirements.txt # -c requirements.txt # llama-index-core -huggingface-hub[inference]==0.27.1 +huggingface-hub[inference]==0.28.0 # via # -c /Users/gauthier/Projects/aider/requirements.txt # -c requirements.txt @@ -130,11 +130,11 @@ joblib==1.4.2 # via # nltk # scikit-learn -llama-index-core==0.12.11 +llama-index-core==0.12.14 # via # -r requirements/requirements-help.in # llama-index-embeddings-huggingface -llama-index-embeddings-huggingface==0.5.0 +llama-index-embeddings-huggingface==0.5.1 # via -r requirements/requirements-help.in markupsafe==3.0.2 # via @@ -142,7 +142,7 @@ markupsafe==3.0.2 # -c requirements.txt # -c requirements/requirements-dev.txt # jinja2 -marshmallow==3.25.1 +marshmallow==3.26.0 # via dataclasses-json mpmath==1.3.0 # via sympy @@ -194,7 +194,7 @@ propcache==0.2.1 # -c requirements.txt # aiohttp # yarl -pydantic==2.10.5 +pydantic==2.10.6 # via # -c /Users/gauthier/Projects/aider/requirements.txt # -c requirements.txt @@ -238,7 +238,7 @@ scipy==1.13.1 # -c requirements.txt # scikit-learn # sentence-transformers -sentence-transformers==3.3.1 +sentence-transformers==3.4.0 # via llama-index-embeddings-huggingface sniffio==1.3.1 # via From 8a3cc6041d9c2363f9d49dd7aec9d2ec72f8896e Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Tue, 28 Jan 2025 10:49:21 -0800 Subject: [PATCH 186/229] sync model settings --- benchmark/rsync.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benchmark/rsync.sh b/benchmark/rsync.sh index 5a8e7e4ea..9185217a5 100755 --- a/benchmark/rsync.sh +++ b/benchmark/rsync.sh @@ -26,7 +26,7 @@ sync_repo() { "$REPO_ROOT/" \ "$DEST:~/aider/" || sleep 0.1 - rsync -a .env .gitignore "$DEST:~/aider/." || sleep 0.1 + rsync -a .env .gitignore .aider.model.settings.yml "$DEST:~/aider/." || sleep 0.1 echo Done syncing, waiting. } From 6e5b2c73689e61f198f4c057342165283a49516f Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Tue, 28 Jan 2025 10:49:40 -0800 Subject: [PATCH 187/229] cleanup --- aider/sendchat.py | 1 + 1 file changed, 1 insertion(+) diff --git a/aider/sendchat.py b/aider/sendchat.py index bc400826f..6d4ef61db 100644 --- a/aider/sendchat.py +++ b/aider/sendchat.py @@ -112,6 +112,7 @@ def send_completion( kwargs.update(extra_params) key = json.dumps(kwargs, sort_keys=True).encode() + # dump(kwargs) # Generate SHA1 hash of kwargs and append it to chat_completion_call_hashes hash_object = hashlib.sha1(key) From 4601940f8d0490acb0b4a7b3e2a0ca76f45ab072 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Tue, 28 Jan 2025 10:49:44 -0800 Subject: [PATCH 188/229] copy --- .../_posts/2025-01-28-deepseek-down.md | 43 ++++++++++++------- 1 file changed, 28 insertions(+), 15 deletions(-) diff --git a/aider/website/_posts/2025-01-28-deepseek-down.md b/aider/website/_posts/2025-01-28-deepseek-down.md index 071f4650f..8b71187b7 100644 --- a/aider/website/_posts/2025-01-28-deepseek-down.md +++ b/aider/website/_posts/2025-01-28-deepseek-down.md @@ -1,5 +1,5 @@ --- -title: DeepSeek API issues - Alternative providers +title: Alternative DeepSeek V3 providers excerpt: DeepSeek's API has been experiencing reliability issues. Here are alternative providers you can use. highlight_image: /assets/deepseek-down.jpg draft: false @@ -15,18 +15,19 @@ nav_exclude: true DeepSeek's API has been experiencing significant reliability issues for the past 24-48+ hours, with many users reporting downtime and overload problems. +Their [status page](https://status.deepseek.com) notes an ongoing incident. -If you're affected by these issues, several alternative providers offer access to DeepSeek models. This article compares their performance on aider's polyglot benchmark to help you choose a reliable alternative. +If you're affected by these issues, several alternative providers offer access to DeepSeek V3. This article compares their performance on aider's polyglot benchmark to help you choose a reliable alternative. ## Using alternative providers -The benchmark results below show that several providers offer comparable or better performance than DeepSeek's native API. To switch providers, you'll need to: +To use these providers, you'll need to create an account with them and obtain an API key. -1. Sign up for an account with your chosen alternative provider -2. Get their API key -3. Update your aider configuration to use their endpoint +## OpenRouter -For example, to use OpenRouter: +[OpenRouter offers many DeepSeek providers](https://openrouter.ai/deepseek/deepseek-chat/providers) +through their unified API. +You can use aider with OpenRouter like this: ```bash # Set your API key using environment variables @@ -41,10 +42,13 @@ api-key: - openrouter= ``` -## Configuring model settings - -You may want to configure specific settings when using alternative providers. For example, you can control which OpenRouter providers are used to serve the model, or set other model parameters. +OpenRouter automatically monitors their providers and routes requests to stable +APIs and away from those experiencing unreliable performance. +But not all providers serve the same version of open source models, and not +all have the same privacy guarantees. +You can control which OpenRouter providers are used to serve the model via +[aider's model settings](https://aider.chat/docs/config/adv-model-settings.html#model-settings). Create a `.aider.model.settings.yml` file in your home directory or git project root with settings like this: ```yaml @@ -58,7 +62,17 @@ Create a `.aider.model.settings.yml` file in your home directory or git project allow_fallbacks: false ``` -Different providers may need different settings. For example, here's a configuration for using Fireworks: +See [OpenRouter's provider routing docs](https://openrouter.ai/docs/provider-routing) for more details. + +## Other providers + +You will need to properly configure aider to work with DeepSeek V3 when served +via alternate providers. +Aider is pre-configured to work well with V3 served via DeepSeek's direct API and via OpenRouter. + +For other providers, you should adapt this example configuration for using DeepSeek V3 +via Fireworks. +You'll need to change the `name` field to match you chosen provider's model naming scheme. ```yaml - name: fireworks_ai/accounts/fireworks/models/deepseek-chat @@ -78,9 +92,8 @@ Different providers may need different settings. For example, here's a configura streaming: true ``` -You'll need to adapt these settings based on your chosen provider. See: -- [OpenRouter's provider routing docs](https://openrouter.ai/docs/provider-routing) for OpenRouter-specific settings -- [Advanced model settings](https://aider.chat/docs/config/adv-model-settings.html#model-settings) for details about all aider model settings + +See [Advanced model settings](https://aider.chat/docs/config/adv-model-settings.html#model-settings) for details about all aider model settings ## Results @@ -115,7 +128,7 @@ You'll need to adapt these settings based on your chosen provider. See: From a73cd87b500daa8706c6de5aabe158a8de84a00a Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Tue, 28 Jan 2025 10:50:18 -0800 Subject: [PATCH 189/229] copy --- aider/website/_posts/2025-01-28-deepseek-down.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aider/website/_posts/2025-01-28-deepseek-down.md b/aider/website/_posts/2025-01-28-deepseek-down.md index 8b71187b7..884fdbba1 100644 --- a/aider/website/_posts/2025-01-28-deepseek-down.md +++ b/aider/website/_posts/2025-01-28-deepseek-down.md @@ -9,7 +9,7 @@ nav_exclude: true {% endif %} -# DeepSeek API issues - Alternative providers +# Alternative DeepSeek V3 providers {: .no_toc } From 531262387d7fa10a431752dc140f1609b59067d5 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Tue, 28 Jan 2025 10:53:18 -0800 Subject: [PATCH 190/229] copy --- aider/website/assets/sample-analytics.jsonl | 238 +++++++++--------- .../website/docs/config/adv-model-settings.md | 80 ++++++ aider/website/docs/faq.md | 12 +- 3 files changed, 206 insertions(+), 124 deletions(-) diff --git a/aider/website/assets/sample-analytics.jsonl b/aider/website/assets/sample-analytics.jsonl index a7d9250b1..bdb00fa73 100644 --- a/aider/website/assets/sample-analytics.jsonl +++ b/aider/website/assets/sample-analytics.jsonl @@ -1,122 +1,3 @@ -{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737008434} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737008437} -{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737008438} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737008438} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 10038, "completion_tokens": 37, "total_tokens": 10075, "cost": 0.00141567999999804, "total_cost": 0.00141567999999804}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737040760} -{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737040760} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737041456} -{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737041459} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737041460} -{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737041523} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737041525} -{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737041527} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737041527} -{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737041640} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737041642} -{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737041645} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737041646} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 10044, "completion_tokens": 36, "total_tokens": 10080, "cost": 0.00141623999999804, "total_cost": 0.00141623999999804}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737042040} -{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737042040} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737042533} -{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737042535} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737042535} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 10036, "completion_tokens": 36, "total_tokens": 10072, "cost": 0.00141511999999804, "total_cost": 0.00141511999999804}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737042541} -{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737042541} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737042883} -{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737042885} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737042885} -{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737042920} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737042923} -{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737042926} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737042926} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 9992, "completion_tokens": 38, "total_tokens": 10030, "cost": 0.0014095199999980398, "total_cost": 0.0014095199999980398}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737043515} -{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737043515} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737043847} -{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737043849} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737043849} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 9989, "completion_tokens": 36, "total_tokens": 10025, "cost": 0.00140853999999804, "total_cost": 0.00140853999999804}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737043855} -{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737043855} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737044275} -{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737044276} -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737044276} -{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737044277} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737044310} -{"event": "command_model", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737044337} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737044338} -{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "ask", "prompt_tokens": 5345, "completion_tokens": 624, "total_tokens": 5969, "cost": 0.025395, "total_cost": 0.025395}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737044349} -{"event": "command_code", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737044491} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737044491} -{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 7693, "completion_tokens": 472, "total_tokens": 8165, "cost": 0.030159000000000002, "total_cost": 0.055554000000000006}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737044499} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737044639} -{"event": "repo", "properties": {"num_files": 423}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737044641} -{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737044642} -{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737044676} -{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737044676} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737044745} -{"event": "gui session", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737044745} -{"event": "exit", "properties": {"reason": "GUI session ended"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737044745} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737044881} -{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737044881} -{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737044881} -{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737044889} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737044891} -{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 7550, "completion_tokens": 139, "total_tokens": 7689, "cost": 0.024735, "total_cost": 0.024735}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737044896} -{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737044899} -{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737044899} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737045175} -{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737045175} -{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737045175} -{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737045178} -{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737045179} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737045190} -{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "ask", "prompt_tokens": 5572, "completion_tokens": 148, "total_tokens": 5720, "cost": 0.018936, "total_cost": 0.018936}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737045194} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737045220} -{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "ask", "prompt_tokens": 5749, "completion_tokens": 129, "total_tokens": 5878, "cost": 0.019182, "total_cost": 0.038118}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737045223} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737045256} -{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "ask", "prompt_tokens": 5943, "completion_tokens": 239, "total_tokens": 6182, "cost": 0.021414000000000002, "total_cost": 0.059532}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737045261} -{"event": "command_commit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737045311} -{"event": "command_clear", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737045458} -{"event": "command_web", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737045461} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737045478} -{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "ask", "prompt_tokens": 11480, "completion_tokens": 298, "total_tokens": 11778, "cost": 0.03891, "total_cost": 0.098442}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737045486} -{"event": "command_code", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737045491} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737045492} -{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 13701, "completion_tokens": 155, "total_tokens": 13856, "cost": 0.043428, "total_cost": 0.14187}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737045497} -{"event": "command_code", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737045511} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737045511} -{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 14428, "completion_tokens": 115, "total_tokens": 14543, "cost": 0.045009, "total_cost": 0.186879}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737045516} -{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046179} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046209} -{"event": "command_code", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046218} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046218} -{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 15816, "completion_tokens": 371, "total_tokens": 16187, "cost": 0.053013000000000005, "total_cost": 0.239892}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046227} -{"event": "command_code", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046271} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046271} -{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 17124, "completion_tokens": 361, "total_tokens": 17485, "cost": 0.056787000000000004, "total_cost": 0.296679}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046282} -{"event": "command_reset", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046429} -{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046434} -{"event": "command_web", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046451} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046462} -{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "ask", "prompt_tokens": 11109, "completion_tokens": 365, "total_tokens": 11474, "cost": 0.038802, "total_cost": 0.33548100000000003}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046472} -{"event": "command_code", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046490} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046490} -{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 13758, "completion_tokens": 147, "total_tokens": 13905, "cost": 0.043479, "total_cost": 0.37896}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046495} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046565} -{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "ask", "prompt_tokens": 11825, "completion_tokens": 210, "total_tokens": 12035, "cost": 0.038625, "total_cost": 0.41758500000000004}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046571} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046631} -{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "ask", "prompt_tokens": 12287, "completion_tokens": 176, "total_tokens": 12463, "cost": 0.039500999999999994, "total_cost": 0.45708600000000005}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046636} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046653} -{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "ask", "prompt_tokens": 12473, "completion_tokens": 168, "total_tokens": 12641, "cost": 0.039939, "total_cost": 0.49702500000000005}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046657} -{"event": "command_code", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046661} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046661} -{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 15176, "completion_tokens": 127, "total_tokens": 15303, "cost": 0.047432999999999996, "total_cost": 0.544458}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046666} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046732} -{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "ask", "prompt_tokens": 13689, "completion_tokens": 159, "total_tokens": 13848, "cost": 0.043452, "total_cost": 0.58791}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046737} -{"event": "command_diff", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046754} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046767} -{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "ask", "prompt_tokens": 13867, "completion_tokens": 133, "total_tokens": 14000, "cost": 0.043595999999999996, "total_cost": 0.631506}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046771} -{"event": "command_undo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046789} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046857} {"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046857} {"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737046861} {"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737053692} @@ -998,3 +879,122 @@ {"event": "command_web", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738025057} {"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738025087} {"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 21842, "completion_tokens": 341, "total_tokens": 22183, "cost": 0.070641, "total_cost": 0.070641}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738025098} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738025156} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 22411, "completion_tokens": 163, "total_tokens": 22574, "cost": 0.069678, "total_cost": 0.140319}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738025162} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738031270} +{"event": "repo", "properties": {"num_files": 430}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738031272} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738031272} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738031282} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738031293} +{"event": "repo", "properties": {"num_files": 430}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738031295} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738031295} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738031303} +{"event": "repo", "properties": {"num_files": 430}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738031305} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738031305} +{"event": "message_send", "properties": {"main_model": "openrouter/deepseek/deepseek-chat", "weak_model": "openrouter/deepseek/deepseek-chat", "editor_model": "openrouter/deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 9986, "completion_tokens": 9, "total_tokens": 9995, "cost": 0.0014005600000000001, "total_cost": 0.0014005600000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738031311} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738031311} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738031328} +{"event": "repo", "properties": {"num_files": 430}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738031329} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738031330} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738031349} +{"event": "repo", "properties": {"num_files": 430}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738031351} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738031351} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738031355} +{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738085256} +{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738085256} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738085431} +{"event": "repo", "properties": {"num_files": 430}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738085434} +{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738085434} +{"event": "ai-comments file-add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738085435} +{"event": "command_read-only", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738085444} +{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738085482} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738085482} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "ask", "prompt_tokens": 19700, "completion_tokens": 357, "total_tokens": 20057, "cost": 0.064455, "total_cost": 0.064455}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738085517} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738085518} +{"event": "command_code", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738085524} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738085524} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 22172, "completion_tokens": 438, "total_tokens": 22610, "cost": 0.07308600000000001, "total_cost": 0.13754100000000002}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738085547} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738085576} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 23192, "completion_tokens": 129, "total_tokens": 23321, "cost": 0.071511, "total_cost": 0.20905200000000002}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738085592} +{"event": "command_diff", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738085710} +{"event": "command_git", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738085722} +{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738085755} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738085755} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "ask", "prompt_tokens": 21308, "completion_tokens": 276, "total_tokens": 21584, "cost": 0.068064, "total_cost": 0.27711600000000003}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738085771} +{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738085876} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738085876} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "ask", "prompt_tokens": 21601, "completion_tokens": 610, "total_tokens": 22211, "cost": 0.073953, "total_cost": 0.351069}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738085906} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738085912} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738085916} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 24320, "completion_tokens": 574, "total_tokens": 24894, "cost": 0.08157, "total_cost": 0.432639}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738085935} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738085937} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 25204, "completion_tokens": 244, "total_tokens": 25448, "cost": 0.079272, "total_cost": 0.511911}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738085950} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738085951} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 25755, "completion_tokens": 282, "total_tokens": 26037, "cost": 0.081495, "total_cost": 0.593406}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738085964} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738085964} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 26574, "completion_tokens": 279, "total_tokens": 26853, "cost": 0.083907, "total_cost": 0.6773129999999999}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738085976} +{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738086534} +{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738086534} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738086573} +{"event": "repo", "properties": {"num_files": 430}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738086575} +{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738086575} +{"event": "command_editor", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738086583} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738086653} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 10027, "completion_tokens": 966, "total_tokens": 10993, "cost": 0.044571, "total_cost": 0.044571}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738086679} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738086722} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 11868, "completion_tokens": 621, "total_tokens": 12489, "cost": 0.044919, "total_cost": 0.08949}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738086738} +{"event": "command_read-only", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738086751} +{"event": "command_read-only", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738086782} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738086795} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738086809} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 13195, "completion_tokens": 377, "total_tokens": 13572, "cost": 0.04524, "total_cost": 0.13473000000000002}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738086828} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738086847} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 13821, "completion_tokens": 355, "total_tokens": 14176, "cost": 0.046787999999999996, "total_cost": 0.181518}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738086865} +{"event": "command_clear", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738086893} +{"event": "command_drop", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738086908} +{"event": "command_drop", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738086913} +{"event": "command_clear", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738086915} +{"event": "command_tokens", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738086916} +{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738086948} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738086948} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "ask", "prompt_tokens": 6796, "completion_tokens": 247, "total_tokens": 7043, "cost": 0.024093, "total_cost": 0.20561100000000002}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738086958} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738087086} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 9572, "completion_tokens": 227, "total_tokens": 9799, "cost": 0.032121000000000004, "total_cost": 0.23773200000000003}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738087100} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738087115} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 9937, "completion_tokens": 295, "total_tokens": 10232, "cost": 0.034236, "total_cost": 0.27196800000000004}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738087127} +{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738087383} +{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738087383} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738087409} +{"event": "repo", "properties": {"num_files": 431}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738087411} +{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738087411} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738087432} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 16779, "completion_tokens": 424, "total_tokens": 17203, "cost": 0.056697, "total_cost": 0.056697}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738087451} +{"event": "ai-comments file-add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738087566} +{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738087566} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738087566} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 33004, "completion_tokens": 272, "total_tokens": 33276, "cost": 0.103092, "total_cost": 0.15978900000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738087576} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738087652} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 33331, "completion_tokens": 78, "total_tokens": 33409, "cost": 0.101163, "total_cost": 0.260952}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738087665} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738087672} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 33621, "completion_tokens": 136, "total_tokens": 33757, "cost": 0.10290300000000001, "total_cost": 0.36385500000000004}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738087680} +{"event": "command_undo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738087686} +{"event": "command_undo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738087690} +{"event": "command_drop", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738087696} +{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738087709} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738087709} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 23664, "completion_tokens": 155, "total_tokens": 23819, "cost": 0.073317, "total_cost": 0.437172}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738087716} +{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738088542} +{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738088542} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738089194} +{"event": "repo", "properties": {"num_files": 431}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738089196} +{"event": "cli session", "properties": {"main_model": "openai/REDACTED", "weak_model": "openai/REDACTED", "editor_model": "openai/REDACTED", "edit_format": "whole"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738089196} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738089197} +{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738089211} +{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738089211} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738089214} +{"event": "repo", "properties": {"num_files": 431}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738089215} +{"event": "cli session", "properties": {"main_model": "openai/REDACTED", "weak_model": "openai/REDACTED", "editor_model": "openai/REDACTED", "edit_format": "whole"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738089216} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738089217} +{"event": "message_send", "properties": {"main_model": "openai/REDACTED", "weak_model": "openai/REDACTED", "editor_model": "openai/REDACTED", "edit_format": "whole", "prompt_tokens": 1856, "completion_tokens": 24, "total_tokens": 1880, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738089220} +{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738089436} +{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738089436} diff --git a/aider/website/docs/config/adv-model-settings.md b/aider/website/docs/config/adv-model-settings.md index 7f431d1ca..902bbddc1 100644 --- a/aider/website/docs/config/adv-model-settings.md +++ b/aider/website/docs/config/adv-model-settings.md @@ -167,6 +167,7 @@ cog.out("```\n") streaming: true editor_model_name: null editor_edit_format: null + remove_reasoning: null - name: gpt-3.5-turbo-0125 edit_format: whole @@ -184,6 +185,7 @@ cog.out("```\n") streaming: true editor_model_name: null editor_edit_format: null + remove_reasoning: null - name: gpt-3.5-turbo-1106 edit_format: whole @@ -201,6 +203,7 @@ cog.out("```\n") streaming: true editor_model_name: null editor_edit_format: null + remove_reasoning: null - name: gpt-3.5-turbo-0613 edit_format: whole @@ -218,6 +221,7 @@ cog.out("```\n") streaming: true editor_model_name: null editor_edit_format: null + remove_reasoning: null - name: gpt-3.5-turbo-16k-0613 edit_format: whole @@ -235,6 +239,7 @@ cog.out("```\n") streaming: true editor_model_name: null editor_edit_format: null + remove_reasoning: null - name: gpt-4-turbo-2024-04-09 edit_format: udiff @@ -252,6 +257,7 @@ cog.out("```\n") streaming: true editor_model_name: null editor_edit_format: null + remove_reasoning: null - name: gpt-4-turbo edit_format: udiff @@ -269,6 +275,7 @@ cog.out("```\n") streaming: true editor_model_name: null editor_edit_format: null + remove_reasoning: null - name: openai/gpt-4o edit_format: diff @@ -286,6 +293,7 @@ cog.out("```\n") streaming: true editor_model_name: null editor_edit_format: editor-diff + remove_reasoning: null - name: openai/gpt-4o-2024-08-06 edit_format: diff @@ -303,6 +311,7 @@ cog.out("```\n") streaming: true editor_model_name: null editor_edit_format: null + remove_reasoning: null - name: gpt-4o-2024-08-06 edit_format: diff @@ -320,6 +329,7 @@ cog.out("```\n") streaming: true editor_model_name: null editor_edit_format: null + remove_reasoning: null - name: gpt-4o-2024-11-20 edit_format: diff @@ -337,6 +347,7 @@ cog.out("```\n") streaming: true editor_model_name: null editor_edit_format: null + remove_reasoning: null - name: openai/gpt-4o-2024-11-20 edit_format: diff @@ -354,6 +365,7 @@ cog.out("```\n") streaming: true editor_model_name: null editor_edit_format: null + remove_reasoning: null - name: gpt-4o edit_format: diff @@ -371,6 +383,7 @@ cog.out("```\n") streaming: true editor_model_name: null editor_edit_format: editor-diff + remove_reasoning: null - name: gpt-4o-mini edit_format: whole @@ -388,6 +401,7 @@ cog.out("```\n") streaming: true editor_model_name: null editor_edit_format: null + remove_reasoning: null - name: openai/gpt-4o-mini edit_format: whole @@ -405,6 +419,7 @@ cog.out("```\n") streaming: true editor_model_name: null editor_edit_format: null + remove_reasoning: null - name: gpt-4-0125-preview edit_format: udiff @@ -422,6 +437,7 @@ cog.out("```\n") streaming: true editor_model_name: null editor_edit_format: null + remove_reasoning: null - name: gpt-4-1106-preview edit_format: udiff @@ -439,6 +455,7 @@ cog.out("```\n") streaming: true editor_model_name: null editor_edit_format: null + remove_reasoning: null - name: gpt-4-vision-preview edit_format: diff @@ -456,6 +473,7 @@ cog.out("```\n") streaming: true editor_model_name: null editor_edit_format: null + remove_reasoning: null - name: gpt-4-0314 edit_format: diff @@ -473,6 +491,7 @@ cog.out("```\n") streaming: true editor_model_name: null editor_edit_format: null + remove_reasoning: null - name: gpt-4-0613 edit_format: diff @@ -490,6 +509,7 @@ cog.out("```\n") streaming: true editor_model_name: null editor_edit_format: null + remove_reasoning: null - name: gpt-4-32k-0613 edit_format: diff @@ -507,6 +527,7 @@ cog.out("```\n") streaming: true editor_model_name: null editor_edit_format: null + remove_reasoning: null - name: claude-3-opus-20240229 edit_format: diff @@ -524,6 +545,7 @@ cog.out("```\n") streaming: true editor_model_name: null editor_edit_format: null + remove_reasoning: null - name: openrouter/anthropic/claude-3-opus edit_format: diff @@ -541,6 +563,7 @@ cog.out("```\n") streaming: true editor_model_name: null editor_edit_format: null + remove_reasoning: null - name: claude-3-sonnet-20240229 edit_format: whole @@ -558,6 +581,7 @@ cog.out("```\n") streaming: true editor_model_name: null editor_edit_format: null + remove_reasoning: null - name: claude-3-5-sonnet-20240620 edit_format: diff @@ -578,6 +602,7 @@ cog.out("```\n") streaming: true editor_model_name: claude-3-5-sonnet-20240620 editor_edit_format: editor-diff + remove_reasoning: null - name: anthropic/claude-3-5-sonnet-20240620 edit_format: diff @@ -598,6 +623,7 @@ cog.out("```\n") streaming: true editor_model_name: anthropic/claude-3-5-sonnet-20240620 editor_edit_format: editor-diff + remove_reasoning: null - name: anthropic/claude-3-5-sonnet-20241022 edit_format: diff @@ -618,6 +644,7 @@ cog.out("```\n") streaming: true editor_model_name: anthropic/claude-3-5-sonnet-20241022 editor_edit_format: editor-diff + remove_reasoning: null - name: bedrock/anthropic.claude-3-5-sonnet-20241022-v2:0 edit_format: diff @@ -638,6 +665,7 @@ cog.out("```\n") streaming: true editor_model_name: bedrock/anthropic.claude-3-5-sonnet-20241022-v2:0 editor_edit_format: editor-diff + remove_reasoning: null - name: anthropic/claude-3-5-sonnet-latest edit_format: diff @@ -658,6 +686,7 @@ cog.out("```\n") streaming: true editor_model_name: anthropic/claude-3-5-sonnet-20241022 editor_edit_format: editor-diff + remove_reasoning: null - name: claude-3-5-sonnet-20241022 edit_format: diff @@ -678,6 +707,7 @@ cog.out("```\n") streaming: true editor_model_name: claude-3-5-sonnet-20241022 editor_edit_format: editor-diff + remove_reasoning: null - name: anthropic/claude-3-haiku-20240307 edit_format: whole @@ -697,6 +727,7 @@ cog.out("```\n") streaming: true editor_model_name: null editor_edit_format: null + remove_reasoning: null - name: anthropic/claude-3-5-haiku-20241022 edit_format: diff @@ -716,6 +747,7 @@ cog.out("```\n") streaming: true editor_model_name: null editor_edit_format: null + remove_reasoning: null - name: bedrock/anthropic.claude-3-5-haiku-20241022-v1:0 edit_format: diff @@ -735,6 +767,7 @@ cog.out("```\n") streaming: true editor_model_name: null editor_edit_format: null + remove_reasoning: null - name: claude-3-5-haiku-20241022 edit_format: diff @@ -754,6 +787,7 @@ cog.out("```\n") streaming: true editor_model_name: null editor_edit_format: null + remove_reasoning: null - name: vertex_ai/claude-3-5-haiku@20241022 edit_format: diff @@ -772,6 +806,7 @@ cog.out("```\n") streaming: true editor_model_name: null editor_edit_format: null + remove_reasoning: null - name: claude-3-haiku-20240307 edit_format: whole @@ -791,6 +826,7 @@ cog.out("```\n") streaming: true editor_model_name: null editor_edit_format: null + remove_reasoning: null - name: openrouter/anthropic/claude-3.5-sonnet edit_format: diff @@ -809,6 +845,7 @@ cog.out("```\n") streaming: true editor_model_name: openrouter/anthropic/claude-3.5-sonnet editor_edit_format: editor-diff + remove_reasoning: null - name: openrouter/anthropic/claude-3.5-sonnet:beta edit_format: diff @@ -827,6 +864,7 @@ cog.out("```\n") streaming: true editor_model_name: openrouter/anthropic/claude-3.5-sonnet:beta editor_edit_format: editor-diff + remove_reasoning: null - name: vertex_ai/claude-3-5-sonnet@20240620 edit_format: diff @@ -845,6 +883,7 @@ cog.out("```\n") streaming: true editor_model_name: vertex_ai/claude-3-5-sonnet@20240620 editor_edit_format: editor-diff + remove_reasoning: null - name: vertex_ai/claude-3-5-sonnet-v2@20241022 edit_format: diff @@ -863,6 +902,7 @@ cog.out("```\n") streaming: true editor_model_name: vertex_ai/claude-3-5-sonnet-v2@20241022 editor_edit_format: editor-diff + remove_reasoning: null - name: vertex_ai/claude-3-opus@20240229 edit_format: diff @@ -880,6 +920,7 @@ cog.out("```\n") streaming: true editor_model_name: null editor_edit_format: null + remove_reasoning: null - name: vertex_ai/claude-3-sonnet@20240229 edit_format: whole @@ -897,6 +938,7 @@ cog.out("```\n") streaming: true editor_model_name: null editor_edit_format: null + remove_reasoning: null - name: command-r-plus edit_format: whole @@ -914,6 +956,7 @@ cog.out("```\n") streaming: true editor_model_name: null editor_edit_format: null + remove_reasoning: null - name: command-r-08-2024 edit_format: whole @@ -931,6 +974,7 @@ cog.out("```\n") streaming: true editor_model_name: null editor_edit_format: null + remove_reasoning: null - name: command-r-plus-08-2024 edit_format: whole @@ -948,6 +992,7 @@ cog.out("```\n") streaming: true editor_model_name: null editor_edit_format: null + remove_reasoning: null - name: groq/llama3-70b-8192 edit_format: diff @@ -965,6 +1010,7 @@ cog.out("```\n") streaming: true editor_model_name: null editor_edit_format: null + remove_reasoning: null - name: openrouter/meta-llama/llama-3-70b-instruct edit_format: diff @@ -982,6 +1028,7 @@ cog.out("```\n") streaming: true editor_model_name: null editor_edit_format: null + remove_reasoning: null - name: gemini/gemini-1.5-pro-002 edit_format: diff @@ -999,6 +1046,7 @@ cog.out("```\n") streaming: true editor_model_name: null editor_edit_format: null + remove_reasoning: null - name: gemini/gemini-1.5-flash-002 edit_format: whole @@ -1016,6 +1064,7 @@ cog.out("```\n") streaming: true editor_model_name: null editor_edit_format: null + remove_reasoning: null - name: gemini/gemini-1.5-pro edit_format: diff-fenced @@ -1033,6 +1082,7 @@ cog.out("```\n") streaming: true editor_model_name: null editor_edit_format: null + remove_reasoning: null - name: gemini/gemini-1.5-pro-latest edit_format: diff-fenced @@ -1050,6 +1100,7 @@ cog.out("```\n") streaming: true editor_model_name: null editor_edit_format: null + remove_reasoning: null - name: gemini/gemini-1.5-pro-exp-0827 edit_format: diff-fenced @@ -1067,6 +1118,7 @@ cog.out("```\n") streaming: true editor_model_name: null editor_edit_format: null + remove_reasoning: null - name: gemini/gemini-exp-1206 edit_format: diff @@ -1084,6 +1136,7 @@ cog.out("```\n") streaming: true editor_model_name: null editor_edit_format: null + remove_reasoning: null - name: gemini/gemini-exp-1114 edit_format: diff @@ -1101,6 +1154,7 @@ cog.out("```\n") streaming: true editor_model_name: null editor_edit_format: null + remove_reasoning: null - name: gemini/gemini-exp-1121 edit_format: diff @@ -1118,6 +1172,7 @@ cog.out("```\n") streaming: true editor_model_name: null editor_edit_format: null + remove_reasoning: null - name: vertex_ai/gemini-pro-experimental edit_format: diff-fenced @@ -1135,6 +1190,7 @@ cog.out("```\n") streaming: true editor_model_name: null editor_edit_format: null + remove_reasoning: null - name: gemini/gemini-1.5-flash-exp-0827 edit_format: whole @@ -1152,6 +1208,7 @@ cog.out("```\n") streaming: true editor_model_name: null editor_edit_format: null + remove_reasoning: null - name: gemini/gemini-2.0-flash-exp edit_format: diff @@ -1169,6 +1226,7 @@ cog.out("```\n") streaming: true editor_model_name: null editor_edit_format: null + remove_reasoning: null - name: openrouter/deepseek/deepseek-r1 edit_format: diff @@ -1187,6 +1245,7 @@ cog.out("```\n") streaming: true editor_model_name: openrouter/deepseek/deepseek-chat editor_edit_format: editor-diff + remove_reasoning: null - name: deepseek/deepseek-reasoner edit_format: diff @@ -1205,6 +1264,7 @@ cog.out("```\n") streaming: true editor_model_name: deepseek/deepseek-chat editor_edit_format: editor-diff + remove_reasoning: null - name: deepseek/deepseek-chat edit_format: diff @@ -1223,6 +1283,7 @@ cog.out("```\n") streaming: true editor_model_name: null editor_edit_format: null + remove_reasoning: null - name: deepseek/deepseek-coder edit_format: diff @@ -1241,6 +1302,7 @@ cog.out("```\n") streaming: true editor_model_name: null editor_edit_format: null + remove_reasoning: null - name: deepseek-chat edit_format: diff @@ -1259,6 +1321,7 @@ cog.out("```\n") streaming: true editor_model_name: null editor_edit_format: null + remove_reasoning: null - name: deepseek-coder edit_format: diff @@ -1277,6 +1340,7 @@ cog.out("```\n") streaming: true editor_model_name: null editor_edit_format: null + remove_reasoning: null - name: openrouter/deepseek/deepseek-coder edit_format: diff @@ -1294,6 +1358,7 @@ cog.out("```\n") streaming: true editor_model_name: null editor_edit_format: null + remove_reasoning: null - name: openrouter/deepseek/deepseek-chat edit_format: diff @@ -1311,6 +1376,7 @@ cog.out("```\n") streaming: true editor_model_name: null editor_edit_format: null + remove_reasoning: null - name: openrouter/openai/gpt-4o edit_format: diff @@ -1328,6 +1394,7 @@ cog.out("```\n") streaming: true editor_model_name: null editor_edit_format: editor-diff + remove_reasoning: null - name: openai/o1-mini edit_format: whole @@ -1345,6 +1412,7 @@ cog.out("```\n") streaming: true editor_model_name: openai/gpt-4o editor_edit_format: editor-diff + remove_reasoning: null - name: azure/o1-mini edit_format: whole @@ -1362,6 +1430,7 @@ cog.out("```\n") streaming: true editor_model_name: azure/gpt-4o editor_edit_format: editor-diff + remove_reasoning: null - name: o1-mini edit_format: whole @@ -1379,6 +1448,7 @@ cog.out("```\n") streaming: true editor_model_name: gpt-4o editor_edit_format: editor-diff + remove_reasoning: null - name: openai/o1-preview edit_format: diff @@ -1396,6 +1466,7 @@ cog.out("```\n") streaming: true editor_model_name: openai/gpt-4o editor_edit_format: editor-diff + remove_reasoning: null - name: azure/o1-preview edit_format: diff @@ -1413,6 +1484,7 @@ cog.out("```\n") streaming: true editor_model_name: azure/gpt-4o editor_edit_format: editor-diff + remove_reasoning: null - name: azure/o1 edit_format: diff @@ -1430,6 +1502,7 @@ cog.out("```\n") streaming: false editor_model_name: azure/gpt-4o editor_edit_format: editor-diff + remove_reasoning: null - name: o1-preview edit_format: architect @@ -1447,6 +1520,7 @@ cog.out("```\n") streaming: true editor_model_name: gpt-4o editor_edit_format: editor-diff + remove_reasoning: null - name: openrouter/openai/o1-mini edit_format: whole @@ -1464,6 +1538,7 @@ cog.out("```\n") streaming: false editor_model_name: openrouter/openai/gpt-4o editor_edit_format: editor-diff + remove_reasoning: null - name: openrouter/openai/o1-preview edit_format: diff @@ -1481,6 +1556,7 @@ cog.out("```\n") streaming: false editor_model_name: openrouter/openai/gpt-4o editor_edit_format: editor-diff + remove_reasoning: null - name: openrouter/openai/o1 edit_format: diff @@ -1498,6 +1574,7 @@ cog.out("```\n") streaming: false editor_model_name: openrouter/openai/gpt-4o editor_edit_format: editor-diff + remove_reasoning: null - name: openai/o1 edit_format: diff @@ -1515,6 +1592,7 @@ cog.out("```\n") streaming: false editor_model_name: openai/gpt-4o editor_edit_format: editor-diff + remove_reasoning: null - name: o1 edit_format: diff @@ -1532,6 +1610,7 @@ cog.out("```\n") streaming: false editor_model_name: gpt-4o editor_edit_format: editor-diff + remove_reasoning: null - name: openrouter/qwen/qwen-2.5-coder-32b-instruct edit_format: diff @@ -1549,6 +1628,7 @@ cog.out("```\n") streaming: true editor_model_name: openrouter/qwen/qwen-2.5-coder-32b-instruct editor_edit_format: editor-diff + remove_reasoning: null ``` diff --git a/aider/website/docs/faq.md b/aider/website/docs/faq.md index beb9d0432..dbd476f42 100644 --- a/aider/website/docs/faq.md +++ b/aider/website/docs/faq.md @@ -249,12 +249,14 @@ tr:hover { background-color: #f5f5f5; }
- - - - - + + + + + + +
Model NameTotal TokensPercent
deepseek/deepseek-chat754,40141.9%
claude-3-5-sonnet-20241022680,14937.8%
deepseek/REDACTED308,84117.2%
deepseek/deepseek-reasoner40,5972.3%
claude-3-5-haiku-2024102210,0830.6%
claude-3-5-sonnet-20241022916,38545.9%
deepseek/deepseek-chat704,11935.3%
deepseek/REDACTED308,84115.5%
deepseek/deepseek-reasoner40,5972.0%
claude-3-5-haiku-2024102210,0830.5%
openrouter/deepseek/deepseek-chat9,9950.5%
o12,3850.1%
openai/REDACTED1,8800.1%
gpt-4o1,7750.1%
o1-preview1750.0%
From a3e0a3ff1a9e33058d2bd6a779baa20488ab2c54 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Tue, 28 Jan 2025 10:59:50 -0800 Subject: [PATCH 191/229] docs: Update DeepSeek V3 alternative providers article --- .../_posts/2025-01-28-deepseek-down.md | 27 ++++++++++--------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/aider/website/_posts/2025-01-28-deepseek-down.md b/aider/website/_posts/2025-01-28-deepseek-down.md index 884fdbba1..c93262e36 100644 --- a/aider/website/_posts/2025-01-28-deepseek-down.md +++ b/aider/website/_posts/2025-01-28-deepseek-down.md @@ -1,7 +1,7 @@ --- title: Alternative DeepSeek V3 providers excerpt: DeepSeek's API has been experiencing reliability issues. Here are alternative providers you can use. -highlight_image: /assets/deepseek-down.jpg +#highlight_image: /assets/deepseek-down.jpg draft: false nav_exclude: true --- @@ -19,10 +19,6 @@ Their [status page](https://status.deepseek.com) notes an ongoing incident. If you're affected by these issues, several alternative providers offer access to DeepSeek V3. This article compares their performance on aider's polyglot benchmark to help you choose a reliable alternative. -## Using alternative providers - -To use these providers, you'll need to create an account with them and obtain an API key. - ## OpenRouter [OpenRouter offers many DeepSeek providers](https://openrouter.ai/deepseek/deepseek-chat/providers) @@ -64,15 +60,12 @@ Create a `.aider.model.settings.yml` file in your home directory or git project See [OpenRouter's provider routing docs](https://openrouter.ai/docs/provider-routing) for more details. -## Other providers -You will need to properly configure aider to work with DeepSeek V3 when served -via alternate providers. -Aider is pre-configured to work well with V3 served via DeepSeek's direct API and via OpenRouter. +## Fireworks -For other providers, you should adapt this example configuration for using DeepSeek V3 -via Fireworks. -You'll need to change the `name` field to match you chosen provider's model naming scheme. +# add the code block showing how to set FIREWORKS_API_KEY +# also show --model fireworks_ai/accounts/fireworks/models/deepseek-chat +# ai! ```yaml - name: fireworks_ai/accounts/fireworks/models/deepseek-chat @@ -93,6 +86,16 @@ You'll need to change the `name` field to match you chosen provider's model nami ``` +## Other providers + +You will need to properly configure aider to work with DeepSeek V3 when served +via alternate providers. +Aider is pre-configured to work well with V3 served via DeepSeek's direct API and via OpenRouter. + +For other providers, you should adapt this example configuration for using DeepSeek V3 +via Fireworks. +You'll need to change the `name` field to match you chosen provider's model naming scheme. + See [Advanced model settings](https://aider.chat/docs/config/adv-model-settings.html#model-settings) for details about all aider model settings ## Results From 2aad566857b407f885103947eacf9a46edb8e73d Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Tue, 28 Jan 2025 10:59:52 -0800 Subject: [PATCH 192/229] docs: Add Fireworks API key setup instructions for aider --- aider/website/_posts/2025-01-28-deepseek-down.md | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/aider/website/_posts/2025-01-28-deepseek-down.md b/aider/website/_posts/2025-01-28-deepseek-down.md index c93262e36..4ba046d0b 100644 --- a/aider/website/_posts/2025-01-28-deepseek-down.md +++ b/aider/website/_posts/2025-01-28-deepseek-down.md @@ -63,9 +63,18 @@ See [OpenRouter's provider routing docs](https://openrouter.ai/docs/provider-rou ## Fireworks -# add the code block showing how to set FIREWORKS_API_KEY -# also show --model fireworks_ai/accounts/fireworks/models/deepseek-chat -# ai! +```bash +# Set your API key using environment variables +export FIREWORKS_API_KEY= +aider --model fireworks_ai/accounts/fireworks/models/deepseek-chat + +# Or use the --api-key command line option +aider --model fireworks_ai/accounts/fireworks/models/deepseek-chat --api-key fireworks= + +# Or add it to .aider.conf.yml in your home directory or project root: +api-key: + - fireworks= +``` ```yaml - name: fireworks_ai/accounts/fireworks/models/deepseek-chat From 10e787568017bc230f2f93b9bcacbab105ae86a4 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Tue, 28 Jan 2025 11:03:38 -0800 Subject: [PATCH 193/229] copy --- aider/website/_posts/2025-01-28-deepseek-down.md | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/aider/website/_posts/2025-01-28-deepseek-down.md b/aider/website/_posts/2025-01-28-deepseek-down.md index 4ba046d0b..6c8add0e3 100644 --- a/aider/website/_posts/2025-01-28-deepseek-down.md +++ b/aider/website/_posts/2025-01-28-deepseek-down.md @@ -76,6 +76,8 @@ api-key: - fireworks= ``` +Create a `.aider.model.settings.yml` file in your home directory or git project root with settings like this: + ```yaml - name: fireworks_ai/accounts/fireworks/models/deepseek-chat edit_format: diff @@ -98,12 +100,14 @@ api-key: ## Other providers You will need to properly configure aider to work with DeepSeek V3 when served -via alternate providers. -Aider is pre-configured to work well with V3 served via DeepSeek's direct API and via OpenRouter. +via other providers: -For other providers, you should adapt this example configuration for using DeepSeek V3 -via Fireworks. -You'll need to change the `name` field to match you chosen provider's model naming scheme. +- Determine the `--model` name to use. +- Provide your API key to aider. +- Add model settings to `.aider.model.settings.yml`. + + +Adapt the `.aider.model.settings.yml` shown above for Fireworks. You will need to change the `name` field to match you chosen provider's model naming scheme. See [Advanced model settings](https://aider.chat/docs/config/adv-model-settings.html#model-settings) for details about all aider model settings From 82d819a6c7b828212a3eee7597727063def44a7c Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Tue, 28 Jan 2025 11:04:01 -0800 Subject: [PATCH 194/229] copy --- aider/website/_data/deepseek-down.yml | 52 +++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 aider/website/_data/deepseek-down.yml diff --git a/aider/website/_data/deepseek-down.yml b/aider/website/_data/deepseek-down.yml new file mode 100644 index 000000000..8fa75e63c --- /dev/null +++ b/aider/website/_data/deepseek-down.yml @@ -0,0 +1,52 @@ +- dirname: 2024-12-25-13-31-51--deepseekv3preview-diff2 + test_cases: 225 + model: DeepSeek + edit_format: diff + commit_hash: 0a23c4a-dirty + pass_rate_1: 22.7 + pass_rate_2: 48.4 + pass_num_1: 51 + pass_num_2: 109 + percent_cases_well_formed: 98.7 + error_outputs: 7 + num_malformed_responses: 7 + num_with_malformed_responses: 3 + user_asks: 19 + lazy_comments: 0 + syntax_errors: 0 + indentation_errors: 0 + exhausted_context_windows: 0 + test_timeouts: 8 + total_tests: 225 + command: aider --model deepseek/deepseek-chat + date: 2024-12-25 + versions: 0.69.2.dev + seconds_per_case: 34.8 + total_cost: 0.3369 + + +- dirname: 2025-01-28-17-47-49--v3-fireworks + test_cases: 225 + model: Fireworks + edit_format: diff + commit_hash: 0336a98-dirty + pass_rate_1: 22.2 + pass_rate_2: 48.4 + pass_num_1: 50 + pass_num_2: 109 + percent_cases_well_formed: 96.9 + error_outputs: 18 + num_malformed_responses: 16 + num_with_malformed_responses: 7 + user_asks: 14 + lazy_comments: 0 + syntax_errors: 0 + indentation_errors: 0 + exhausted_context_windows: 2 + test_timeouts: 9 + total_tests: 225 + command: aider --model fireworks_ai/accounts/fireworks/models/deepseek-v3 + date: 2025-01-28 + versions: 0.72.4.dev + seconds_per_case: 115.9 + total_cost: 2.1177 \ No newline at end of file From 4783204f31846531f87b177584bc5716cf75448a Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Tue, 28 Jan 2025 11:13:55 -0800 Subject: [PATCH 195/229] docs: Add Ollama configuration details for DeepSeek V3 model --- .../_posts/2025-01-28-deepseek-down.md | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/aider/website/_posts/2025-01-28-deepseek-down.md b/aider/website/_posts/2025-01-28-deepseek-down.md index 6c8add0e3..8f1999dac 100644 --- a/aider/website/_posts/2025-01-28-deepseek-down.md +++ b/aider/website/_posts/2025-01-28-deepseek-down.md @@ -97,6 +97,37 @@ Create a `.aider.model.settings.yml` file in your home directory or git project ``` +## Ollama + +You can run [DeepSeek V3 via Ollama](https://ollama.com/library/deepseek-v3). + +It's important to provide model settings, especially the `num_ctx` parameter. +Ollama uses a 2k context window by default, which is very small for working with aider. + +Unlike most other LLM servers, Ollama does not throw an error if you submit a request that exceeds the context window. Instead, it just silently truncates the request by discarding the “oldest” messages in the chat to make it fit within the context window. + +So if your context window is too small, you won’t get an explicit error. The biggest symptom will be that aider says it can’t see (some of) the files you added to the chat. That’s because ollama is silently discarding them because they exceed the context window. + +```yaml +- name: ollama/deepseek-v3 + edit_format: diff + weak_model_name: null + use_repo_map: true + send_undo_reply: false + lazy: false + reminder: sys + examples_as_sys_msg: true + extra_params: + max_tokens: 8192 + cache_control: false + caches_by_default: true + use_system_prompt: true + use_temperature: true + streaming: true + extra_params: + num_ctx: 8192 +``` + ## Other providers You will need to properly configure aider to work with DeepSeek V3 when served From 095a05a8e1a8db7ae4195df4f42dd8aa38791fc5 Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Tue, 28 Jan 2025 11:13:57 -0800 Subject: [PATCH 196/229] feat: Add Ollama setup instructions for DeepSeek V3 in documentation --- aider/website/_posts/2025-01-28-deepseek-down.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/aider/website/_posts/2025-01-28-deepseek-down.md b/aider/website/_posts/2025-01-28-deepseek-down.md index 8f1999dac..1d3d6919b 100644 --- a/aider/website/_posts/2025-01-28-deepseek-down.md +++ b/aider/website/_posts/2025-01-28-deepseek-down.md @@ -101,6 +101,20 @@ Create a `.aider.model.settings.yml` file in your home directory or git project You can run [DeepSeek V3 via Ollama](https://ollama.com/library/deepseek-v3). +```bash +# Pull the model +ollama pull deepseek-v3 + +# Start your ollama server +ollama serve + +# In another terminal window... +export OLLAMA_API_BASE=http://127.0.0.1:11434 # Mac/Linux +setx OLLAMA_API_BASE http://127.0.0.1:11434 # Windows, restart shell after setx + +aider --model ollama/deepseek-v3 +``` + It's important to provide model settings, especially the `num_ctx` parameter. Ollama uses a 2k context window by default, which is very small for working with aider. From b6425436005b640a372d1feb3584cadf4c762e1a Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Tue, 28 Jan 2025 11:15:31 -0800 Subject: [PATCH 197/229] docs: Add Ollama model configuration instructions to DeepSeek post --- aider/website/_posts/2025-01-28-deepseek-down.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/aider/website/_posts/2025-01-28-deepseek-down.md b/aider/website/_posts/2025-01-28-deepseek-down.md index 1d3d6919b..7730d7161 100644 --- a/aider/website/_posts/2025-01-28-deepseek-down.md +++ b/aider/website/_posts/2025-01-28-deepseek-down.md @@ -122,6 +122,8 @@ Unlike most other LLM servers, Ollama does not throw an error if you submit a re So if your context window is too small, you won’t get an explicit error. The biggest symptom will be that aider says it can’t see (some of) the files you added to the chat. That’s because ollama is silently discarding them because they exceed the context window. +Create a `.aider.model.settings.yml` file in your home directory or git project root with settings like this: + ```yaml - name: ollama/deepseek-v3 edit_format: diff From b6b44e0f2d61f57d6d598f46615a343c1a5e2510 Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Tue, 28 Jan 2025 11:15:35 -0800 Subject: [PATCH 198/229] feat: Add table of contents to DeepSeek V3 providers post --- aider/website/_posts/2025-01-28-deepseek-down.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/aider/website/_posts/2025-01-28-deepseek-down.md b/aider/website/_posts/2025-01-28-deepseek-down.md index 7730d7161..20fbd094d 100644 --- a/aider/website/_posts/2025-01-28-deepseek-down.md +++ b/aider/website/_posts/2025-01-28-deepseek-down.md @@ -12,6 +12,9 @@ nav_exclude: true # Alternative DeepSeek V3 providers {: .no_toc } +* TOC +{:toc} + DeepSeek's API has been experiencing significant reliability issues for the past 24-48+ hours, with many users reporting downtime and overload problems. From 0b5e0a1113fdb1dec86ac6cc85ce2fd05ec18837 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Tue, 28 Jan 2025 11:16:48 -0800 Subject: [PATCH 199/229] copy --- aider/website/_posts/2025-01-28-deepseek-down.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/aider/website/_posts/2025-01-28-deepseek-down.md b/aider/website/_posts/2025-01-28-deepseek-down.md index 20fbd094d..20340595f 100644 --- a/aider/website/_posts/2025-01-28-deepseek-down.md +++ b/aider/website/_posts/2025-01-28-deepseek-down.md @@ -12,9 +12,6 @@ nav_exclude: true # Alternative DeepSeek V3 providers {: .no_toc } -* TOC -{:toc} - DeepSeek's API has been experiencing significant reliability issues for the past 24-48+ hours, with many users reporting downtime and overload problems. @@ -22,6 +19,10 @@ Their [status page](https://status.deepseek.com) notes an ongoing incident. If you're affected by these issues, several alternative providers offer access to DeepSeek V3. This article compares their performance on aider's polyglot benchmark to help you choose a reliable alternative. +## Providers +* TOC +{:toc} + ## OpenRouter [OpenRouter offers many DeepSeek providers](https://openrouter.ai/deepseek/deepseek-chat/providers) From 342271841573cb4d554f8542c3088f439640a620 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Tue, 28 Jan 2025 11:22:09 -0800 Subject: [PATCH 200/229] copy --- aider/website/_posts/2025-01-28-deepseek-down.md | 9 +++++---- aider/website/docs/llms/ollama.md | 2 ++ 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/aider/website/_posts/2025-01-28-deepseek-down.md b/aider/website/_posts/2025-01-28-deepseek-down.md index 20340595f..d4694ffe0 100644 --- a/aider/website/_posts/2025-01-28-deepseek-down.md +++ b/aider/website/_posts/2025-01-28-deepseek-down.md @@ -119,8 +119,11 @@ setx OLLAMA_API_BASE http://127.0.0.1:11434 # Windows, restart shell after set aider --model ollama/deepseek-v3 ``` -It's important to provide model settings, especially the `num_ctx` parameter. +It's important to provide model settings, especially the `num_ctx` parameter to +set the context window. Ollama uses a 2k context window by default, which is very small for working with aider. +Larger context windows will allow you to work with larger amounts of code, +but will use memory and increase latency. Unlike most other LLM servers, Ollama does not throw an error if you submit a request that exceeds the context window. Instead, it just silently truncates the request by discarding the “oldest” messages in the chat to make it fit within the context window. @@ -137,15 +140,13 @@ Create a `.aider.model.settings.yml` file in your home directory or git project lazy: false reminder: sys examples_as_sys_msg: true - extra_params: - max_tokens: 8192 cache_control: false caches_by_default: true use_system_prompt: true use_temperature: true streaming: true extra_params: - num_ctx: 8192 + num_ctx: 8192 # How large a context window? ``` ## Other providers diff --git a/aider/website/docs/llms/ollama.md b/aider/website/docs/llms/ollama.md index ba034a6cf..5207656f5 100644 --- a/aider/website/docs/llms/ollama.md +++ b/aider/website/docs/llms/ollama.md @@ -56,6 +56,8 @@ you added to the chat. That's because ollama is silently discarding them because they exceed the context window. Aider sets Ollama's context window to 8k by default. +Larger context windows will allow you to work with larger amounts of code, +but will use memory and increase latency. If you would like a larger context window you can use a From bfc57459e10b678ed13fd896c05ac17826484e63 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Tue, 28 Jan 2025 11:24:32 -0800 Subject: [PATCH 201/229] copy --- aider/website/_data/deepseek-down.yml | 28 ++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/aider/website/_data/deepseek-down.yml b/aider/website/_data/deepseek-down.yml index 8fa75e63c..f7233974e 100644 --- a/aider/website/_data/deepseek-down.yml +++ b/aider/website/_data/deepseek-down.yml @@ -49,4 +49,30 @@ date: 2025-01-28 versions: 0.72.4.dev seconds_per_case: 115.9 - total_cost: 2.1177 \ No newline at end of file + total_cost: 2.1177 + +- dirname: 2025-01-28-17-41-19--or-v3-deepinfra + test_cases: 221 + model: OpenRouter: Deepinfra + edit_format: whole + commit_hash: 0336a98-dirty + pass_rate_1: 24.0 + pass_rate_2: 47.1 + pass_num_1: 53 + pass_num_2: 106 + percent_cases_well_formed: 99.5 + error_outputs: 5 + num_malformed_responses: 1 + num_with_malformed_responses: 1 + user_asks: 38 + lazy_comments: 0 + syntax_errors: 0 + indentation_errors: 0 + exhausted_context_windows: 0 + test_timeouts: 5 + total_tests: 225 + command: aider --model openrouter/deepseek/deepseek-chat + date: 2025-01-28 + versions: 0.72.4.dev + seconds_per_case: 156.5 + total_cost: 0.2110 \ No newline at end of file From 77d2bc58fda934688d0129dd57a45bed9f4ab8f5 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Tue, 28 Jan 2025 11:30:22 -0800 Subject: [PATCH 202/229] copy --- aider/website/_data/deepseek-down.yml | 5 +++-- aider/website/_posts/2025-01-28-deepseek-down.md | 4 +++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/aider/website/_data/deepseek-down.yml b/aider/website/_data/deepseek-down.yml index f7233974e..a2e2ec645 100644 --- a/aider/website/_data/deepseek-down.yml +++ b/aider/website/_data/deepseek-down.yml @@ -53,7 +53,7 @@ - dirname: 2025-01-28-17-41-19--or-v3-deepinfra test_cases: 221 - model: OpenRouter: Deepinfra + model: "OpenRouter: Deepinfra" edit_format: whole commit_hash: 0336a98-dirty pass_rate_1: 24.0 @@ -75,4 +75,5 @@ date: 2025-01-28 versions: 0.72.4.dev seconds_per_case: 156.5 - total_cost: 0.2110 \ No newline at end of file + total_cost: 0.2110 + \ No newline at end of file diff --git a/aider/website/_posts/2025-01-28-deepseek-down.md b/aider/website/_posts/2025-01-28-deepseek-down.md index d4694ffe0..0d2067312 100644 --- a/aider/website/_posts/2025-01-28-deepseek-down.md +++ b/aider/website/_posts/2025-01-28-deepseek-down.md @@ -19,6 +19,9 @@ Their [status page](https://status.deepseek.com) notes an ongoing incident. If you're affected by these issues, several alternative providers offer access to DeepSeek V3. This article compares their performance on aider's polyglot benchmark to help you choose a reliable alternative. +{: .note :} +This article is being updated as benchmark runs complete. + ## Providers * TOC {:toc} @@ -197,7 +200,6 @@ See [Advanced model settings](https://aider.chat/docs/config/adv-model-settings. {% assign data_source = edit_sorted %} {% assign pass_rate_field = "pass_rate_2" %} {% assign highlight_model = "DeepSeek" %} -{% assign show_legend = false %} {% include leaderboard.js %} - - - - + + + + From 9f7275ecede6f5009c83af4f85ac1edba0bceb70 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Tue, 28 Jan 2025 13:28:10 -0800 Subject: [PATCH 209/229] copy --- aider/models.py | 7 ++++++ aider/website/assets/sample-analytics.jsonl | 18 +++++++-------- .../website/docs/config/adv-model-settings.md | 22 +++++++++++++++++++ aider/website/docs/faq.md | 6 ++--- 4 files changed, 41 insertions(+), 12 deletions(-) diff --git a/aider/models.py b/aider/models.py index 2ad6c0a46..bac6b1b15 100644 --- a/aider/models.py +++ b/aider/models.py @@ -1414,6 +1414,13 @@ def get_model_settings_as_yaml(): import yaml model_settings_list = [] + # Add default settings first with all field values + defaults = {} + for field in fields(ModelSettings): + defaults[field.name] = field.default + defaults["name"] = "(default values)" + model_settings_list.append(defaults) + for ms in MODEL_SETTINGS: # Create dict with explicit field order model_settings_dict = {} diff --git a/aider/website/assets/sample-analytics.jsonl b/aider/website/assets/sample-analytics.jsonl index eab5809bb..55693e870 100644 --- a/aider/website/assets/sample-analytics.jsonl +++ b/aider/website/assets/sample-analytics.jsonl @@ -1,12 +1,3 @@ -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737057101} -{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "ask", "prompt_tokens": 11279, "completion_tokens": 761, "total_tokens": 12040, "cost": 0.045252, "total_cost": 0.38676000000000005}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737057112} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737057130} -{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "ask", "prompt_tokens": 12062, "completion_tokens": 468, "total_tokens": 12530, "cost": 0.043206, "total_cost": 0.42996600000000007}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737057138} -{"event": "command_code", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737057142} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737057142} -{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 14256, "completion_tokens": 695, "total_tokens": 14951, "cost": 0.053193000000000004, "total_cost": 0.48315900000000006}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737057153} -{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737059273} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737066817} {"event": "model warning", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737066819} {"event": "exit", "properties": {"reason": "Keyboard interrupt during model warnings"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737130145} {"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737144019} @@ -998,3 +989,12 @@ {"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738099244} {"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738099244} {"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 16949, "completion_tokens": 281, "total_tokens": 17230, "cost": 0.055062, "total_cost": 0.055062}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738099253} +{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738099341} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738099341} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "ask", "prompt_tokens": 15010, "completion_tokens": 311, "total_tokens": 15321, "cost": 0.049695, "total_cost": 0.104757}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738099353} +{"event": "command_clear", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738099414} +{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738099442} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738099442} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 16959, "completion_tokens": 152, "total_tokens": 17111, "cost": 0.053156999999999996, "total_cost": 0.157914}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738099449} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738099474} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 17160, "completion_tokens": 292, "total_tokens": 17452, "cost": 0.05586, "total_cost": 0.213774}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738099498} diff --git a/aider/website/docs/config/adv-model-settings.md b/aider/website/docs/config/adv-model-settings.md index 019ae4641..600d58bb9 100644 --- a/aider/website/docs/config/adv-model-settings.md +++ b/aider/website/docs/config/adv-model-settings.md @@ -144,6 +144,10 @@ You can also look at the `ModelSettings` class in [models.py](https://github.com/Aider-AI/aider/blob/main/aider/models.py) file for more details about all of the model setting that aider supports. +The first entry shows all the settings, with their default values. +For a real model, +you just need to include whichever fields that you want to override the defaults. + ```yaml +- name: (default values) + edit_format: whole + weak_model_name: null + use_repo_map: false + send_undo_reply: false + lazy: false + reminder: user + examples_as_sys_msg: false + extra_params: null + cache_control: false + caches_by_default: false + use_system_prompt: true + use_temperature: true + streaming: true + editor_model_name: null + editor_edit_format: null + remove_reasoning: null + - name: gpt-3.5-turbo weak_model_name: gpt-4o-mini reminder: sys diff --git a/aider/website/docs/faq.md b/aider/website/docs/faq.md index 3e2c6a9f6..3580225ca 100644 --- a/aider/website/docs/faq.md +++ b/aider/website/docs/faq.md @@ -249,9 +249,9 @@ tr:hover { background-color: #f5f5f5; }
Model NameTotal TokensPercent
claude-3-5-sonnet-20241022916,38545.9%
deepseek/deepseek-chat704,11935.3%
deepseek/REDACTED308,84115.5%
deepseek/deepseek-reasoner40,5972.0%
claude-3-5-sonnet-20241022866,17544.5%
deepseek/deepseek-chat704,11936.2%
deepseek/REDACTED308,84115.9%
deepseek/deepseek-reasoner40,5972.1%
claude-3-5-haiku-2024102210,0830.5%
openrouter/deepseek/deepseek-chat9,9950.5%
o12,3850.1%
- - - + + + From ddbaa8b32b9af25931bcc1421032dcd3be2d127d Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Tue, 28 Jan 2025 13:31:31 -0800 Subject: [PATCH 210/229] refactor: Move model settings to external YAML configuration file --- aider/models.py | 766 +----------------------------------------------- 1 file changed, 4 insertions(+), 762 deletions(-) diff --git a/aider/models.py b/aider/models.py index bac6b1b15..ead18ada4 100644 --- a/aider/models.py +++ b/aider/models.py @@ -103,768 +103,10 @@ class ModelSettings: remove_reasoning: Optional[str] = None -# https://platform.openai.com/docs/models/gpt-4-and-gpt-4-turbo -# https://platform.openai.com/docs/models/gpt-3-5-turbo -# https://openai.com/pricing - -MODEL_SETTINGS = [ - # gpt-3.5 - ModelSettings( - "gpt-3.5-turbo", - "whole", - weak_model_name="gpt-4o-mini", - reminder="sys", - ), - ModelSettings( - "gpt-3.5-turbo-0125", - "whole", - weak_model_name="gpt-4o-mini", - reminder="sys", - ), - ModelSettings( - "gpt-3.5-turbo-1106", - "whole", - weak_model_name="gpt-4o-mini", - reminder="sys", - ), - ModelSettings( - "gpt-3.5-turbo-0613", - "whole", - weak_model_name="gpt-4o-mini", - reminder="sys", - ), - ModelSettings( - "gpt-3.5-turbo-16k-0613", - "whole", - weak_model_name="gpt-4o-mini", - reminder="sys", - ), - # gpt-4 - ModelSettings( - "gpt-4-turbo-2024-04-09", - "udiff", - weak_model_name="gpt-4o-mini", - use_repo_map=True, - lazy=True, - reminder="sys", - ), - ModelSettings( - "gpt-4-turbo", - "udiff", - weak_model_name="gpt-4o-mini", - use_repo_map=True, - lazy=True, - reminder="sys", - ), - ModelSettings( - "openai/gpt-4o", - "diff", - weak_model_name="gpt-4o-mini", - use_repo_map=True, - lazy=True, - reminder="sys", - editor_edit_format="editor-diff", - examples_as_sys_msg=True, - ), - ModelSettings( - "openai/gpt-4o-2024-08-06", - "diff", - weak_model_name="gpt-4o-mini", - use_repo_map=True, - lazy=True, - reminder="sys", - examples_as_sys_msg=True, - ), - ModelSettings( - "gpt-4o-2024-08-06", - "diff", - weak_model_name="gpt-4o-mini", - use_repo_map=True, - lazy=True, - reminder="sys", - examples_as_sys_msg=True, - ), - ModelSettings( - "gpt-4o-2024-11-20", - "diff", - weak_model_name="gpt-4o-mini", - use_repo_map=True, - lazy=True, - reminder="sys", - examples_as_sys_msg=True, - ), - ModelSettings( - "openai/gpt-4o-2024-11-20", - "diff", - weak_model_name="gpt-4o-mini", - use_repo_map=True, - lazy=True, - reminder="sys", - examples_as_sys_msg=True, - ), - ModelSettings( - "gpt-4o", - "diff", - weak_model_name="gpt-4o-mini", - use_repo_map=True, - lazy=True, - reminder="sys", - editor_edit_format="editor-diff", - examples_as_sys_msg=True, - ), - ModelSettings( - "gpt-4o-mini", - "whole", - weak_model_name="gpt-4o-mini", - lazy=True, - reminder="sys", - ), - ModelSettings( - "openai/gpt-4o-mini", - "whole", - weak_model_name="openai/gpt-4o-mini", - lazy=True, - reminder="sys", - ), - ModelSettings( - "gpt-4-0125-preview", - "udiff", - weak_model_name="gpt-4o-mini", - use_repo_map=True, - lazy=True, - reminder="sys", - examples_as_sys_msg=True, - ), - ModelSettings( - "gpt-4-1106-preview", - "udiff", - weak_model_name="gpt-4o-mini", - use_repo_map=True, - lazy=True, - reminder="sys", - ), - ModelSettings( - "gpt-4-vision-preview", - "diff", - weak_model_name="gpt-4o-mini", - use_repo_map=True, - reminder="sys", - ), - ModelSettings( - "gpt-4-0314", - "diff", - weak_model_name="gpt-4o-mini", - use_repo_map=True, - reminder="sys", - examples_as_sys_msg=True, - ), - ModelSettings( - "gpt-4-0613", - "diff", - weak_model_name="gpt-4o-mini", - use_repo_map=True, - reminder="sys", - ), - ModelSettings( - "gpt-4-32k-0613", - "diff", - weak_model_name="gpt-4o-mini", - use_repo_map=True, - reminder="sys", - ), - # Claude - ModelSettings( - "claude-3-opus-20240229", - "diff", - weak_model_name="claude-3-5-haiku-20241022", - use_repo_map=True, - ), - ModelSettings( - "openrouter/anthropic/claude-3-opus", - "diff", - weak_model_name="openrouter/anthropic/claude-3-5-haiku", - use_repo_map=True, - ), - ModelSettings( - "claude-3-sonnet-20240229", - "whole", - weak_model_name="claude-3-5-haiku-20241022", - ), - ModelSettings( - "claude-3-5-sonnet-20240620", - "diff", - weak_model_name="claude-3-5-haiku-20241022", - editor_model_name="claude-3-5-sonnet-20240620", - editor_edit_format="editor-diff", - use_repo_map=True, - examples_as_sys_msg=True, - extra_params={ - "extra_headers": { - "anthropic-beta": ANTHROPIC_BETA_HEADER, - }, - "max_tokens": 8192, - }, - cache_control=True, - reminder="user", - ), - ModelSettings( - "anthropic/claude-3-5-sonnet-20240620", - "diff", - weak_model_name="anthropic/claude-3-5-haiku-20241022", - editor_model_name="anthropic/claude-3-5-sonnet-20240620", - editor_edit_format="editor-diff", - use_repo_map=True, - examples_as_sys_msg=True, - extra_params={ - "extra_headers": { - "anthropic-beta": ANTHROPIC_BETA_HEADER, - }, - "max_tokens": 8192, - }, - cache_control=True, - reminder="user", - ), - ModelSettings( - "anthropic/claude-3-5-sonnet-20241022", - "diff", - weak_model_name="anthropic/claude-3-5-haiku-20241022", - editor_model_name="anthropic/claude-3-5-sonnet-20241022", - editor_edit_format="editor-diff", - use_repo_map=True, - examples_as_sys_msg=True, - extra_params={ - "extra_headers": { - "anthropic-beta": ANTHROPIC_BETA_HEADER, - }, - "max_tokens": 8192, - }, - cache_control=True, - reminder="user", - ), - ModelSettings( - "bedrock/anthropic.claude-3-5-sonnet-20241022-v2:0", - "diff", - weak_model_name="bedrock/anthropic.claude-3-5-haiku-20241022-v1:0", - editor_model_name="bedrock/anthropic.claude-3-5-sonnet-20241022-v2:0", - editor_edit_format="editor-diff", - use_repo_map=True, - examples_as_sys_msg=True, - extra_params={ - "extra_headers": { - "anthropic-beta": ANTHROPIC_BETA_HEADER, - }, - "max_tokens": 8192, - }, - cache_control=True, - reminder="user", - ), - ModelSettings( - "anthropic/claude-3-5-sonnet-latest", - "diff", - weak_model_name="anthropic/claude-3-5-haiku-20241022", - editor_model_name="anthropic/claude-3-5-sonnet-20241022", - editor_edit_format="editor-diff", - use_repo_map=True, - examples_as_sys_msg=True, - extra_params={ - "extra_headers": { - "anthropic-beta": ANTHROPIC_BETA_HEADER, - }, - "max_tokens": 8192, - }, - cache_control=True, - reminder="user", - ), - ModelSettings( - "claude-3-5-sonnet-20241022", - "diff", - weak_model_name="claude-3-5-haiku-20241022", - editor_model_name="claude-3-5-sonnet-20241022", - editor_edit_format="editor-diff", - use_repo_map=True, - examples_as_sys_msg=True, - extra_params={ - "extra_headers": { - "anthropic-beta": ANTHROPIC_BETA_HEADER, - }, - "max_tokens": 8192, - }, - cache_control=True, - reminder="user", - ), - ModelSettings( - "anthropic/claude-3-haiku-20240307", - "whole", - weak_model_name="anthropic/claude-3-haiku-20240307", - examples_as_sys_msg=True, - extra_params={ - "extra_headers": { - "anthropic-beta": ANTHROPIC_BETA_HEADER, - }, - }, - cache_control=True, - ), - ModelSettings( - "anthropic/claude-3-5-haiku-20241022", - "diff", - weak_model_name="anthropic/claude-3-5-haiku-20241022", - use_repo_map=True, - extra_params={ - "extra_headers": { - "anthropic-beta": ANTHROPIC_BETA_HEADER, - }, - }, - cache_control=True, - ), - ModelSettings( - "bedrock/anthropic.claude-3-5-haiku-20241022-v1:0", - "diff", - weak_model_name="bedrock/anthropic.claude-3-5-haiku-20241022-v1:0", - use_repo_map=True, - extra_params={ - "extra_headers": { - "anthropic-beta": ANTHROPIC_BETA_HEADER, - }, - }, - cache_control=True, - ), - ModelSettings( - "claude-3-5-haiku-20241022", - "diff", - weak_model_name="claude-3-5-haiku-20241022", - use_repo_map=True, - examples_as_sys_msg=True, - extra_params={ - "extra_headers": { - "anthropic-beta": ANTHROPIC_BETA_HEADER, - }, - }, - cache_control=True, - ), - ModelSettings( - "vertex_ai/claude-3-5-haiku@20241022", - "diff", - weak_model_name="vertex_ai/claude-3-5-haiku@20241022", - use_repo_map=True, - extra_params={ - "max_tokens": 4096, - }, - ), - ModelSettings( - "claude-3-haiku-20240307", - "whole", - weak_model_name="claude-3-haiku-20240307", - examples_as_sys_msg=True, - extra_params={ - "extra_headers": { - "anthropic-beta": ANTHROPIC_BETA_HEADER, - }, - }, - cache_control=True, - ), - ModelSettings( - "openrouter/anthropic/claude-3.5-sonnet", - "diff", - weak_model_name="openrouter/anthropic/claude-3-5-haiku", - editor_model_name="openrouter/anthropic/claude-3.5-sonnet", - editor_edit_format="editor-diff", - use_repo_map=True, - examples_as_sys_msg=True, - extra_params={ - "max_tokens": 8192, - }, - reminder="user", - cache_control=True, - ), - ModelSettings( - "openrouter/anthropic/claude-3.5-sonnet:beta", - "diff", - weak_model_name="openrouter/anthropic/claude-3-5-haiku:beta", - editor_model_name="openrouter/anthropic/claude-3.5-sonnet:beta", - editor_edit_format="editor-diff", - use_repo_map=True, - examples_as_sys_msg=True, - extra_params={ - "max_tokens": 8192, - }, - reminder="user", - cache_control=True, - ), - # Vertex AI Claude models - # Does not yet support 8k token - ModelSettings( - "vertex_ai/claude-3-5-sonnet@20240620", - "diff", - weak_model_name="vertex_ai/claude-3-5-haiku@20241022", - editor_model_name="vertex_ai/claude-3-5-sonnet@20240620", - editor_edit_format="editor-diff", - use_repo_map=True, - examples_as_sys_msg=True, - extra_params={ - "max_tokens": 8192, - }, - reminder="user", - ), - ModelSettings( - "vertex_ai/claude-3-5-sonnet-v2@20241022", - "diff", - weak_model_name="vertex_ai/claude-3-5-haiku@20241022", - editor_model_name="vertex_ai/claude-3-5-sonnet-v2@20241022", - editor_edit_format="editor-diff", - use_repo_map=True, - examples_as_sys_msg=True, - extra_params={ - "max_tokens": 8192, - }, - reminder="user", - ), - ModelSettings( - "vertex_ai/claude-3-opus@20240229", - "diff", - weak_model_name="vertex_ai/claude-3-5-haiku@20241022", - use_repo_map=True, - ), - ModelSettings( - "vertex_ai/claude-3-sonnet@20240229", - "whole", - weak_model_name="vertex_ai/claude-3-5-haiku@20241022", - ), - # Cohere - ModelSettings( - "command-r-plus", - "whole", - weak_model_name="command-r-plus", - use_repo_map=True, - ), - # New Cohere models - ModelSettings( - "command-r-08-2024", - "whole", - weak_model_name="command-r-08-2024", - use_repo_map=True, - ), - ModelSettings( - "command-r-plus-08-2024", - "whole", - weak_model_name="command-r-plus-08-2024", - use_repo_map=True, - ), - # Groq llama3 - ModelSettings( - "groq/llama3-70b-8192", - "diff", - weak_model_name="groq/llama3-8b-8192", - use_repo_map=False, - send_undo_reply=False, - examples_as_sys_msg=True, - ), - # Openrouter llama3 - ModelSettings( - "openrouter/meta-llama/llama-3-70b-instruct", - "diff", - weak_model_name="openrouter/meta-llama/llama-3-70b-instruct", - use_repo_map=False, - send_undo_reply=False, - examples_as_sys_msg=True, - ), - # Gemini - ModelSettings( - "gemini/gemini-1.5-pro-002", - "diff", - use_repo_map=True, - ), - ModelSettings( - "gemini/gemini-1.5-flash-002", - "whole", - ), - ModelSettings( - "gemini/gemini-1.5-pro", - "diff-fenced", - use_repo_map=True, - ), - ModelSettings( - "gemini/gemini-1.5-pro-latest", - "diff-fenced", - use_repo_map=True, - ), - ModelSettings( - "gemini/gemini-1.5-pro-exp-0827", - "diff-fenced", - use_repo_map=True, - ), - ModelSettings( - "gemini/gemini-exp-1206", - "diff", - use_repo_map=True, - ), - ModelSettings( - "gemini/gemini-exp-1114", - "diff", - use_repo_map=True, - ), - ModelSettings( - "gemini/gemini-exp-1121", - "diff", - use_repo_map=True, - ), - ModelSettings( - "vertex_ai/gemini-pro-experimental", - "diff-fenced", - use_repo_map=True, - ), - ModelSettings( - "gemini/gemini-1.5-flash-exp-0827", - "whole", - use_repo_map=False, - send_undo_reply=False, - ), - ModelSettings( - "gemini/gemini-2.0-flash-exp", - "diff", - use_repo_map=True, - send_undo_reply=False, - ), - ModelSettings( - "openrouter/deepseek/deepseek-r1", - "diff", - weak_model_name="openrouter/deepseek/deepseek-chat", - editor_model_name="openrouter/deepseek/deepseek-chat", - editor_edit_format="editor-diff", - use_repo_map=True, - examples_as_sys_msg=True, - use_temperature=False, - reminder="user", - caches_by_default=True, - extra_params={ - "max_tokens": 8192, - }, - ), - ModelSettings( - "deepseek/deepseek-reasoner", - "diff", - weak_model_name="deepseek/deepseek-chat", - editor_model_name="deepseek/deepseek-chat", - editor_edit_format="editor-diff", - use_repo_map=True, - examples_as_sys_msg=True, - use_temperature=False, - reminder="user", - caches_by_default=True, - extra_params={ - "max_tokens": 8192, - }, - ), - ModelSettings( - "deepseek/deepseek-chat", - "diff", - use_repo_map=True, - examples_as_sys_msg=True, - reminder="sys", - caches_by_default=True, - extra_params={ - "max_tokens": 8192, - }, - ), - ModelSettings( - "deepseek/deepseek-coder", - "diff", - use_repo_map=True, - examples_as_sys_msg=True, - reminder="sys", - caches_by_default=True, - extra_params={ - "max_tokens": 8192, - }, - ), - ModelSettings( - "deepseek-chat", - "diff", - use_repo_map=True, - examples_as_sys_msg=True, - reminder="sys", - extra_params={ - "max_tokens": 8192, - }, - ), - ModelSettings( - "deepseek-coder", - "diff", - use_repo_map=True, - examples_as_sys_msg=True, - reminder="sys", - caches_by_default=True, - extra_params={ - "max_tokens": 8192, - }, - ), - ModelSettings( - "openrouter/deepseek/deepseek-coder", - "diff", - use_repo_map=True, - examples_as_sys_msg=True, - reminder="sys", - ), - ModelSettings( - "openrouter/deepseek/deepseek-chat", - "diff", - use_repo_map=True, - examples_as_sys_msg=True, - reminder="sys", - ), - ModelSettings( - "openrouter/openai/gpt-4o", - "diff", - weak_model_name="openrouter/openai/gpt-4o-mini", - use_repo_map=True, - lazy=True, - reminder="sys", - editor_edit_format="editor-diff", - examples_as_sys_msg=True, - ), - ModelSettings( - "openai/o1-mini", - "whole", - weak_model_name="openai/gpt-4o-mini", - editor_model_name="openai/gpt-4o", - editor_edit_format="editor-diff", - use_repo_map=True, - reminder="user", - use_system_prompt=False, - use_temperature=False, - ), - ModelSettings( - "azure/o1-mini", - "whole", - weak_model_name="azure/gpt-4o-mini", - editor_model_name="azure/gpt-4o", - editor_edit_format="editor-diff", - use_repo_map=True, - reminder="user", - use_system_prompt=False, - use_temperature=False, - ), - ModelSettings( - "o1-mini", - "whole", - weak_model_name="gpt-4o-mini", - editor_model_name="gpt-4o", - editor_edit_format="editor-diff", - use_repo_map=True, - reminder="user", - use_system_prompt=False, - use_temperature=False, - ), - ModelSettings( - "openai/o1-preview", - "diff", - weak_model_name="openai/gpt-4o-mini", - editor_model_name="openai/gpt-4o", - editor_edit_format="editor-diff", - use_repo_map=True, - reminder="user", - use_system_prompt=False, - use_temperature=False, - ), - ModelSettings( - "azure/o1-preview", - "diff", - weak_model_name="azure/gpt-4o-mini", - editor_model_name="azure/gpt-4o", - editor_edit_format="editor-diff", - use_repo_map=True, - reminder="user", - use_system_prompt=False, - use_temperature=False, - ), - ModelSettings( - "azure/o1", - "diff", - weak_model_name="azure/gpt-4o-mini", - editor_model_name="azure/gpt-4o", - editor_edit_format="editor-diff", - use_repo_map=True, - streaming=False, - use_temperature=False, - # extra_params=dict(extra_body=dict(reasoning_effort="high")), - ), - ModelSettings( - "o1-preview", - "architect", - weak_model_name="gpt-4o-mini", - editor_model_name="gpt-4o", - editor_edit_format="editor-diff", - use_repo_map=True, - reminder="user", - use_system_prompt=False, - use_temperature=False, - ), - ModelSettings( - "openrouter/openai/o1-mini", - "whole", - weak_model_name="openrouter/openai/gpt-4o-mini", - editor_model_name="openrouter/openai/gpt-4o", - editor_edit_format="editor-diff", - use_repo_map=True, - reminder="user", - use_system_prompt=False, - use_temperature=False, - streaming=False, - ), - ModelSettings( - "openrouter/openai/o1-preview", - "diff", - weak_model_name="openrouter/openai/gpt-4o-mini", - editor_model_name="openrouter/openai/gpt-4o", - editor_edit_format="editor-diff", - use_repo_map=True, - reminder="user", - use_system_prompt=False, - use_temperature=False, - streaming=False, - ), - ModelSettings( - "openrouter/openai/o1", - "diff", - weak_model_name="openrouter/openai/gpt-4o-mini", - editor_model_name="openrouter/openai/gpt-4o", - editor_edit_format="editor-diff", - use_repo_map=True, - streaming=False, - use_temperature=False, - # extra_params=dict(extra_body=dict(reasoning_effort="high")), - ), - ModelSettings( - "openai/o1", - "diff", - weak_model_name="openai/gpt-4o-mini", - editor_model_name="openai/gpt-4o", - editor_edit_format="editor-diff", - use_repo_map=True, - streaming=False, - use_temperature=False, - # extra_params=dict(extra_body=dict(reasoning_effort="high")), - ), - ModelSettings( - "o1", - "diff", - weak_model_name="gpt-4o-mini", - editor_model_name="gpt-4o", - editor_edit_format="editor-diff", - use_repo_map=True, - streaming=False, - use_temperature=False, - # extra_params=dict(extra_body=dict(reasoning_effort="high")), - ), - ModelSettings( - "openrouter/qwen/qwen-2.5-coder-32b-instruct", - "diff", - weak_model_name="openrouter/qwen/qwen-2.5-coder-32b-instruct", - editor_model_name="openrouter/qwen/qwen-2.5-coder-32b-instruct", - editor_edit_format="editor-diff", - use_repo_map=True, - ), -] - +# load these from aider/resources/model-settings.yml +# use the proper packaging way to locate that file +# ai! +MODEL_SETTINGS = [] class ModelInfoManager: MODEL_INFO_URL = ( From 5095a9e1c3f82303f0b7e3349d56300910b41db4 Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Tue, 28 Jan 2025 13:31:32 -0800 Subject: [PATCH 211/229] feat: Load model settings from package resource using importlib.resources --- aider/models.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/aider/models.py b/aider/models.py index ead18ada4..24472e3d6 100644 --- a/aider/models.py +++ b/aider/models.py @@ -103,10 +103,14 @@ class ModelSettings: remove_reasoning: Optional[str] = None -# load these from aider/resources/model-settings.yml -# use the proper packaging way to locate that file -# ai! +import importlib.resources + +# Load model settings from package resource MODEL_SETTINGS = [] +with importlib.resources.open_text("aider.resources", "model-settings.yml") as f: + model_settings_list = yaml.safe_load(f) + for model_settings_dict in model_settings_list: + MODEL_SETTINGS.append(ModelSettings(**model_settings_dict)) class ModelInfoManager: MODEL_INFO_URL = ( From 0019a1f7dc87475fc315f44730e97c7247cb4ca6 Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Tue, 28 Jan 2025 13:31:38 -0800 Subject: [PATCH 212/229] style: Apply linter formatting to models.py --- aider/models.py | 1 + 1 file changed, 1 insertion(+) diff --git a/aider/models.py b/aider/models.py index 24472e3d6..86daca366 100644 --- a/aider/models.py +++ b/aider/models.py @@ -112,6 +112,7 @@ with importlib.resources.open_text("aider.resources", "model-settings.yml") as f for model_settings_dict in model_settings_list: MODEL_SETTINGS.append(ModelSettings(**model_settings_dict)) + class ModelInfoManager: MODEL_INFO_URL = ( "https://raw.githubusercontent.com/BerriAI/litellm/main/" From e68191dcd972f6170cb76690603574ae58f8407a Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Tue, 28 Jan 2025 13:31:49 -0800 Subject: [PATCH 213/229] fix: Move importlib.resources import to top of file --- aider/models.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/aider/models.py b/aider/models.py index 86daca366..99c994307 100644 --- a/aider/models.py +++ b/aider/models.py @@ -1,4 +1,5 @@ import difflib +import importlib.resources import json import math import os @@ -103,8 +104,6 @@ class ModelSettings: remove_reasoning: Optional[str] = None -import importlib.resources - # Load model settings from package resource MODEL_SETTINGS = [] with importlib.resources.open_text("aider.resources", "model-settings.yml") as f: From 8488175ee881c7903f380f02b553956de691e854 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Tue, 28 Jan 2025 13:35:33 -0800 Subject: [PATCH 214/229] refactor: Sort model settings by name in get_model_settings_as_yaml --- aider/models.py | 1 + 1 file changed, 1 insertion(+) diff --git a/aider/models.py b/aider/models.py index 99c994307..cb48e60e7 100644 --- a/aider/models.py +++ b/aider/models.py @@ -667,6 +667,7 @@ def get_model_settings_as_yaml(): defaults["name"] = "(default values)" model_settings_list.append(defaults) + # sort on .name ai! for ms in MODEL_SETTINGS: # Create dict with explicit field order model_settings_dict = {} From fb57d3beefd41d4e89a5307a3ea4416da69d70aa Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Tue, 28 Jan 2025 13:35:35 -0800 Subject: [PATCH 215/229] refactor: Sort MODEL_SETTINGS by name in get_model_settings_as_yaml --- aider/models.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/aider/models.py b/aider/models.py index cb48e60e7..006a976b2 100644 --- a/aider/models.py +++ b/aider/models.py @@ -667,8 +667,8 @@ def get_model_settings_as_yaml(): defaults["name"] = "(default values)" model_settings_list.append(defaults) - # sort on .name ai! - for ms in MODEL_SETTINGS: + # Sort model settings by name + for ms in sorted(MODEL_SETTINGS, key=lambda x: x.name): # Create dict with explicit field order model_settings_dict = {} for field in fields(ModelSettings): From ebb8596f03c98d35a5fa059bef042519f7f2eeda Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Tue, 28 Jan 2025 13:36:31 -0800 Subject: [PATCH 216/229] move model settings to resources/yml --- aider/resources/model-settings.yml | 580 ++++++++++++ aider/website/assets/sample-analytics.jsonl | 48 +- .../website/docs/config/adv-model-settings.md | 838 +++++++++--------- aider/website/docs/faq.md | 8 +- 4 files changed, 1027 insertions(+), 447 deletions(-) create mode 100644 aider/resources/model-settings.yml diff --git a/aider/resources/model-settings.yml b/aider/resources/model-settings.yml new file mode 100644 index 000000000..3607d979f --- /dev/null +++ b/aider/resources/model-settings.yml @@ -0,0 +1,580 @@ +- name: gpt-3.5-turbo + weak_model_name: gpt-4o-mini + reminder: sys + +- name: gpt-3.5-turbo-0125 + weak_model_name: gpt-4o-mini + reminder: sys + +- name: gpt-3.5-turbo-1106 + weak_model_name: gpt-4o-mini + reminder: sys + +- name: gpt-3.5-turbo-0613 + weak_model_name: gpt-4o-mini + reminder: sys + +- name: gpt-3.5-turbo-16k-0613 + weak_model_name: gpt-4o-mini + reminder: sys + +- name: gpt-4-turbo-2024-04-09 + edit_format: udiff + weak_model_name: gpt-4o-mini + use_repo_map: true + lazy: true + reminder: sys + +- name: gpt-4-turbo + edit_format: udiff + weak_model_name: gpt-4o-mini + use_repo_map: true + lazy: true + reminder: sys + +- name: openai/gpt-4o + edit_format: diff + weak_model_name: gpt-4o-mini + use_repo_map: true + lazy: true + reminder: sys + examples_as_sys_msg: true + editor_edit_format: editor-diff + +- name: openai/gpt-4o-2024-08-06 + edit_format: diff + weak_model_name: gpt-4o-mini + use_repo_map: true + lazy: true + reminder: sys + examples_as_sys_msg: true + +- name: gpt-4o-2024-08-06 + edit_format: diff + weak_model_name: gpt-4o-mini + use_repo_map: true + lazy: true + reminder: sys + examples_as_sys_msg: true + +- name: gpt-4o-2024-11-20 + edit_format: diff + weak_model_name: gpt-4o-mini + use_repo_map: true + lazy: true + reminder: sys + examples_as_sys_msg: true + +- name: openai/gpt-4o-2024-11-20 + edit_format: diff + weak_model_name: gpt-4o-mini + use_repo_map: true + lazy: true + reminder: sys + examples_as_sys_msg: true + +- name: gpt-4o + edit_format: diff + weak_model_name: gpt-4o-mini + use_repo_map: true + lazy: true + reminder: sys + examples_as_sys_msg: true + editor_edit_format: editor-diff + +- name: gpt-4o-mini + weak_model_name: gpt-4o-mini + lazy: true + reminder: sys + +- name: openai/gpt-4o-mini + weak_model_name: openai/gpt-4o-mini + lazy: true + reminder: sys + +- name: gpt-4-0125-preview + edit_format: udiff + weak_model_name: gpt-4o-mini + use_repo_map: true + lazy: true + reminder: sys + examples_as_sys_msg: true + +- name: gpt-4-1106-preview + edit_format: udiff + weak_model_name: gpt-4o-mini + use_repo_map: true + lazy: true + reminder: sys + +- name: gpt-4-vision-preview + edit_format: diff + weak_model_name: gpt-4o-mini + use_repo_map: true + reminder: sys + +- name: gpt-4-0314 + edit_format: diff + weak_model_name: gpt-4o-mini + use_repo_map: true + reminder: sys + examples_as_sys_msg: true + +- name: gpt-4-0613 + edit_format: diff + weak_model_name: gpt-4o-mini + use_repo_map: true + reminder: sys + +- name: gpt-4-32k-0613 + edit_format: diff + weak_model_name: gpt-4o-mini + use_repo_map: true + reminder: sys + +- name: claude-3-opus-20240229 + edit_format: diff + weak_model_name: claude-3-5-haiku-20241022 + use_repo_map: true + +- name: openrouter/anthropic/claude-3-opus + edit_format: diff + weak_model_name: openrouter/anthropic/claude-3-5-haiku + use_repo_map: true + +- name: claude-3-sonnet-20240229 + weak_model_name: claude-3-5-haiku-20241022 + +- name: claude-3-5-sonnet-20240620 + edit_format: diff + weak_model_name: claude-3-5-haiku-20241022 + use_repo_map: true + examples_as_sys_msg: true + extra_params: + extra_headers: + anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25 + max_tokens: 8192 + cache_control: true + editor_model_name: claude-3-5-sonnet-20240620 + editor_edit_format: editor-diff + +- name: anthropic/claude-3-5-sonnet-20240620 + edit_format: diff + weak_model_name: anthropic/claude-3-5-haiku-20241022 + use_repo_map: true + examples_as_sys_msg: true + extra_params: + extra_headers: + anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25 + max_tokens: 8192 + cache_control: true + editor_model_name: anthropic/claude-3-5-sonnet-20240620 + editor_edit_format: editor-diff + +- name: anthropic/claude-3-5-sonnet-20241022 + edit_format: diff + weak_model_name: anthropic/claude-3-5-haiku-20241022 + use_repo_map: true + examples_as_sys_msg: true + extra_params: + extra_headers: + anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25 + max_tokens: 8192 + cache_control: true + editor_model_name: anthropic/claude-3-5-sonnet-20241022 + editor_edit_format: editor-diff + +- name: bedrock/anthropic.claude-3-5-sonnet-20241022-v2:0 + edit_format: diff + weak_model_name: bedrock/anthropic.claude-3-5-haiku-20241022-v1:0 + use_repo_map: true + examples_as_sys_msg: true + extra_params: + extra_headers: + anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25 + max_tokens: 8192 + cache_control: true + editor_model_name: bedrock/anthropic.claude-3-5-sonnet-20241022-v2:0 + editor_edit_format: editor-diff + +- name: anthropic/claude-3-5-sonnet-latest + edit_format: diff + weak_model_name: anthropic/claude-3-5-haiku-20241022 + use_repo_map: true + examples_as_sys_msg: true + extra_params: + extra_headers: + anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25 + max_tokens: 8192 + cache_control: true + editor_model_name: anthropic/claude-3-5-sonnet-20241022 + editor_edit_format: editor-diff + +- name: claude-3-5-sonnet-20241022 + edit_format: diff + weak_model_name: claude-3-5-haiku-20241022 + use_repo_map: true + examples_as_sys_msg: true + extra_params: + extra_headers: + anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25 + max_tokens: 8192 + cache_control: true + editor_model_name: claude-3-5-sonnet-20241022 + editor_edit_format: editor-diff + +- name: anthropic/claude-3-haiku-20240307 + weak_model_name: anthropic/claude-3-haiku-20240307 + examples_as_sys_msg: true + extra_params: + extra_headers: + anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25 + cache_control: true + +- name: anthropic/claude-3-5-haiku-20241022 + edit_format: diff + weak_model_name: anthropic/claude-3-5-haiku-20241022 + use_repo_map: true + extra_params: + extra_headers: + anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25 + cache_control: true + +- name: bedrock/anthropic.claude-3-5-haiku-20241022-v1:0 + edit_format: diff + weak_model_name: bedrock/anthropic.claude-3-5-haiku-20241022-v1:0 + use_repo_map: true + extra_params: + extra_headers: + anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25 + cache_control: true + +- name: claude-3-5-haiku-20241022 + edit_format: diff + weak_model_name: claude-3-5-haiku-20241022 + use_repo_map: true + examples_as_sys_msg: true + extra_params: + extra_headers: + anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25 + cache_control: true + +- name: vertex_ai/claude-3-5-haiku@20241022 + edit_format: diff + weak_model_name: vertex_ai/claude-3-5-haiku@20241022 + use_repo_map: true + extra_params: + max_tokens: 4096 + +- name: claude-3-haiku-20240307 + weak_model_name: claude-3-haiku-20240307 + examples_as_sys_msg: true + extra_params: + extra_headers: + anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25 + cache_control: true + +- name: openrouter/anthropic/claude-3.5-sonnet + edit_format: diff + weak_model_name: openrouter/anthropic/claude-3-5-haiku + use_repo_map: true + examples_as_sys_msg: true + extra_params: + max_tokens: 8192 + cache_control: true + editor_model_name: openrouter/anthropic/claude-3.5-sonnet + editor_edit_format: editor-diff + +- name: openrouter/anthropic/claude-3.5-sonnet:beta + edit_format: diff + weak_model_name: openrouter/anthropic/claude-3-5-haiku:beta + use_repo_map: true + examples_as_sys_msg: true + extra_params: + max_tokens: 8192 + cache_control: true + editor_model_name: openrouter/anthropic/claude-3.5-sonnet:beta + editor_edit_format: editor-diff + +- name: vertex_ai/claude-3-5-sonnet@20240620 + edit_format: diff + weak_model_name: vertex_ai/claude-3-5-haiku@20241022 + use_repo_map: true + examples_as_sys_msg: true + extra_params: + max_tokens: 8192 + editor_model_name: vertex_ai/claude-3-5-sonnet@20240620 + editor_edit_format: editor-diff + +- name: vertex_ai/claude-3-5-sonnet-v2@20241022 + edit_format: diff + weak_model_name: vertex_ai/claude-3-5-haiku@20241022 + use_repo_map: true + examples_as_sys_msg: true + extra_params: + max_tokens: 8192 + editor_model_name: vertex_ai/claude-3-5-sonnet-v2@20241022 + editor_edit_format: editor-diff + +- name: vertex_ai/claude-3-opus@20240229 + edit_format: diff + weak_model_name: vertex_ai/claude-3-5-haiku@20241022 + use_repo_map: true + +- name: vertex_ai/claude-3-sonnet@20240229 + weak_model_name: vertex_ai/claude-3-5-haiku@20241022 + +- name: command-r-plus + weak_model_name: command-r-plus + use_repo_map: true + +- name: command-r-08-2024 + weak_model_name: command-r-08-2024 + use_repo_map: true + +- name: command-r-plus-08-2024 + weak_model_name: command-r-plus-08-2024 + use_repo_map: true + +- name: groq/llama3-70b-8192 + edit_format: diff + weak_model_name: groq/llama3-8b-8192 + examples_as_sys_msg: true + +- name: openrouter/meta-llama/llama-3-70b-instruct + edit_format: diff + weak_model_name: openrouter/meta-llama/llama-3-70b-instruct + examples_as_sys_msg: true + +- name: gemini/gemini-1.5-pro-002 + edit_format: diff + use_repo_map: true + +- name: gemini/gemini-1.5-flash-002 + +- name: gemini/gemini-1.5-pro + edit_format: diff-fenced + use_repo_map: true + +- name: gemini/gemini-1.5-pro-latest + edit_format: diff-fenced + use_repo_map: true + +- name: gemini/gemini-1.5-pro-exp-0827 + edit_format: diff-fenced + use_repo_map: true + +- name: gemini/gemini-exp-1206 + edit_format: diff + use_repo_map: true + +- name: gemini/gemini-exp-1114 + edit_format: diff + use_repo_map: true + +- name: gemini/gemini-exp-1121 + edit_format: diff + use_repo_map: true + +- name: vertex_ai/gemini-pro-experimental + edit_format: diff-fenced + use_repo_map: true + +- name: gemini/gemini-1.5-flash-exp-0827 + +- name: gemini/gemini-2.0-flash-exp + edit_format: diff + use_repo_map: true + +- name: openrouter/deepseek/deepseek-r1 + edit_format: diff + weak_model_name: openrouter/deepseek/deepseek-chat + use_repo_map: true + examples_as_sys_msg: true + extra_params: + max_tokens: 8192 + caches_by_default: true + use_temperature: false + editor_model_name: openrouter/deepseek/deepseek-chat + editor_edit_format: editor-diff + +- name: deepseek/deepseek-reasoner + edit_format: diff + weak_model_name: deepseek/deepseek-chat + use_repo_map: true + examples_as_sys_msg: true + extra_params: + max_tokens: 8192 + caches_by_default: true + use_temperature: false + editor_model_name: deepseek/deepseek-chat + editor_edit_format: editor-diff + +- name: deepseek/deepseek-chat + edit_format: diff + use_repo_map: true + reminder: sys + examples_as_sys_msg: true + extra_params: + max_tokens: 8192 + caches_by_default: true + +- name: deepseek/deepseek-coder + edit_format: diff + use_repo_map: true + reminder: sys + examples_as_sys_msg: true + extra_params: + max_tokens: 8192 + caches_by_default: true + +- name: deepseek-chat + edit_format: diff + use_repo_map: true + reminder: sys + examples_as_sys_msg: true + extra_params: + max_tokens: 8192 + +- name: deepseek-coder + edit_format: diff + use_repo_map: true + reminder: sys + examples_as_sys_msg: true + extra_params: + max_tokens: 8192 + caches_by_default: true + +- name: openrouter/deepseek/deepseek-coder + edit_format: diff + use_repo_map: true + reminder: sys + examples_as_sys_msg: true + +- name: openrouter/deepseek/deepseek-chat + edit_format: diff + use_repo_map: true + reminder: sys + examples_as_sys_msg: true + +- name: openrouter/openai/gpt-4o + edit_format: diff + weak_model_name: openrouter/openai/gpt-4o-mini + use_repo_map: true + lazy: true + reminder: sys + examples_as_sys_msg: true + editor_edit_format: editor-diff + +- name: openai/o1-mini + weak_model_name: openai/gpt-4o-mini + use_repo_map: true + use_system_prompt: false + use_temperature: false + editor_model_name: openai/gpt-4o + editor_edit_format: editor-diff + +- name: azure/o1-mini + weak_model_name: azure/gpt-4o-mini + use_repo_map: true + use_system_prompt: false + use_temperature: false + editor_model_name: azure/gpt-4o + editor_edit_format: editor-diff + +- name: o1-mini + weak_model_name: gpt-4o-mini + use_repo_map: true + use_system_prompt: false + use_temperature: false + editor_model_name: gpt-4o + editor_edit_format: editor-diff + +- name: openai/o1-preview + edit_format: diff + weak_model_name: openai/gpt-4o-mini + use_repo_map: true + use_system_prompt: false + use_temperature: false + editor_model_name: openai/gpt-4o + editor_edit_format: editor-diff + +- name: azure/o1-preview + edit_format: diff + weak_model_name: azure/gpt-4o-mini + use_repo_map: true + use_system_prompt: false + use_temperature: false + editor_model_name: azure/gpt-4o + editor_edit_format: editor-diff + +- name: azure/o1 + edit_format: diff + weak_model_name: azure/gpt-4o-mini + use_repo_map: true + use_temperature: false + streaming: false + editor_model_name: azure/gpt-4o + editor_edit_format: editor-diff + +- name: o1-preview + edit_format: architect + weak_model_name: gpt-4o-mini + use_repo_map: true + use_system_prompt: false + use_temperature: false + editor_model_name: gpt-4o + editor_edit_format: editor-diff + +- name: openrouter/openai/o1-mini + weak_model_name: openrouter/openai/gpt-4o-mini + use_repo_map: true + use_system_prompt: false + use_temperature: false + streaming: false + editor_model_name: openrouter/openai/gpt-4o + editor_edit_format: editor-diff + +- name: openrouter/openai/o1-preview + edit_format: diff + weak_model_name: openrouter/openai/gpt-4o-mini + use_repo_map: true + use_system_prompt: false + use_temperature: false + streaming: false + editor_model_name: openrouter/openai/gpt-4o + editor_edit_format: editor-diff + +- name: openrouter/openai/o1 + edit_format: diff + weak_model_name: openrouter/openai/gpt-4o-mini + use_repo_map: true + use_temperature: false + streaming: false + editor_model_name: openrouter/openai/gpt-4o + editor_edit_format: editor-diff + +- name: openai/o1 + edit_format: diff + weak_model_name: openai/gpt-4o-mini + use_repo_map: true + use_temperature: false + streaming: false + editor_model_name: openai/gpt-4o + editor_edit_format: editor-diff + +- name: o1 + edit_format: diff + weak_model_name: gpt-4o-mini + use_repo_map: true + use_temperature: false + streaming: false + editor_model_name: gpt-4o + editor_edit_format: editor-diff + +- name: openrouter/qwen/qwen-2.5-coder-32b-instruct + edit_format: diff + weak_model_name: openrouter/qwen/qwen-2.5-coder-32b-instruct + use_repo_map: true + editor_model_name: openrouter/qwen/qwen-2.5-coder-32b-instruct + editor_edit_format: editor-diff diff --git a/aider/website/assets/sample-analytics.jsonl b/aider/website/assets/sample-analytics.jsonl index 55693e870..edc99a6b0 100644 --- a/aider/website/assets/sample-analytics.jsonl +++ b/aider/website/assets/sample-analytics.jsonl @@ -1,27 +1,3 @@ -{"event": "model warning", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737066819} -{"event": "exit", "properties": {"reason": "Keyboard interrupt during model warnings"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737130145} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737144019} -{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737144020} -{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737144020} -{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737144021} -{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737144021} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737144038} -{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737144040} -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737144040} -{"event": "exit", "properties": {"reason": "Completed main CLI coder.run"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737144048} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149251} -{"event": "model warning", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149253} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149269} -{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149271} -{"event": "cli session", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None", "edit_format": "whole"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149271} -{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149312} -{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149312} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149332} -{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149333} -{"event": "cli session", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None", "edit_format": "whole"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149333} -{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149339} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149344} -{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149346} {"event": "cli session", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None", "edit_format": "whole"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149346} {"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149410} {"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149410} @@ -998,3 +974,27 @@ {"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 16959, "completion_tokens": 152, "total_tokens": 17111, "cost": 0.053156999999999996, "total_cost": 0.157914}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738099449} {"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738099474} {"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 17160, "completion_tokens": 292, "total_tokens": 17452, "cost": 0.05586, "total_cost": 0.213774}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738099498} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738099820} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738099849} +{"event": "repo", "properties": {"num_files": 432}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738099852} +{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738099852} +{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738099876} +{"event": "ai-comments file-add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738099876} +{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738099876} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738099876} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738099876} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 12221, "completion_tokens": 246, "total_tokens": 12467, "cost": 0.040353, "total_cost": 0.254127}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738099884} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 16521, "completion_tokens": 235, "total_tokens": 16756, "cost": 0.053088, "total_cost": 0.053088}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738099888} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738099901} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 17244, "completion_tokens": 170, "total_tokens": 17414, "cost": 0.054282, "total_cost": 0.10737}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738099907} +{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738099913} +{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738099913} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738099917} +{"event": "repo", "properties": {"num_files": 432}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738099919} +{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738099919} +{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738099952} +{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738099952} +{"event": "ai-comments file-add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100124} +{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100124} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100124} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 11609, "completion_tokens": 177, "total_tokens": 11786, "cost": 0.037482, "total_cost": 0.037482}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100131} diff --git a/aider/website/docs/config/adv-model-settings.md b/aider/website/docs/config/adv-model-settings.md index 600d58bb9..58fa86bf1 100644 --- a/aider/website/docs/config/adv-model-settings.md +++ b/aider/website/docs/config/adv-model-settings.md @@ -173,165 +173,14 @@ cog.out("```\n") editor_edit_format: null remove_reasoning: null -- name: gpt-3.5-turbo - weak_model_name: gpt-4o-mini - reminder: sys - -- name: gpt-3.5-turbo-0125 - weak_model_name: gpt-4o-mini - reminder: sys - -- name: gpt-3.5-turbo-1106 - weak_model_name: gpt-4o-mini - reminder: sys - -- name: gpt-3.5-turbo-0613 - weak_model_name: gpt-4o-mini - reminder: sys - -- name: gpt-3.5-turbo-16k-0613 - weak_model_name: gpt-4o-mini - reminder: sys - -- name: gpt-4-turbo-2024-04-09 - edit_format: udiff - weak_model_name: gpt-4o-mini - use_repo_map: true - lazy: true - reminder: sys - -- name: gpt-4-turbo - edit_format: udiff - weak_model_name: gpt-4o-mini - use_repo_map: true - lazy: true - reminder: sys - -- name: openai/gpt-4o +- name: anthropic/claude-3-5-haiku-20241022 edit_format: diff - weak_model_name: gpt-4o-mini + weak_model_name: anthropic/claude-3-5-haiku-20241022 use_repo_map: true - lazy: true - reminder: sys - examples_as_sys_msg: true - editor_edit_format: editor-diff - -- name: openai/gpt-4o-2024-08-06 - edit_format: diff - weak_model_name: gpt-4o-mini - use_repo_map: true - lazy: true - reminder: sys - examples_as_sys_msg: true - -- name: gpt-4o-2024-08-06 - edit_format: diff - weak_model_name: gpt-4o-mini - use_repo_map: true - lazy: true - reminder: sys - examples_as_sys_msg: true - -- name: gpt-4o-2024-11-20 - edit_format: diff - weak_model_name: gpt-4o-mini - use_repo_map: true - lazy: true - reminder: sys - examples_as_sys_msg: true - -- name: openai/gpt-4o-2024-11-20 - edit_format: diff - weak_model_name: gpt-4o-mini - use_repo_map: true - lazy: true - reminder: sys - examples_as_sys_msg: true - -- name: gpt-4o - edit_format: diff - weak_model_name: gpt-4o-mini - use_repo_map: true - lazy: true - reminder: sys - examples_as_sys_msg: true - editor_edit_format: editor-diff - -- name: gpt-4o-mini - weak_model_name: gpt-4o-mini - lazy: true - reminder: sys - -- name: openai/gpt-4o-mini - weak_model_name: openai/gpt-4o-mini - lazy: true - reminder: sys - -- name: gpt-4-0125-preview - edit_format: udiff - weak_model_name: gpt-4o-mini - use_repo_map: true - lazy: true - reminder: sys - examples_as_sys_msg: true - -- name: gpt-4-1106-preview - edit_format: udiff - weak_model_name: gpt-4o-mini - use_repo_map: true - lazy: true - reminder: sys - -- name: gpt-4-vision-preview - edit_format: diff - weak_model_name: gpt-4o-mini - use_repo_map: true - reminder: sys - -- name: gpt-4-0314 - edit_format: diff - weak_model_name: gpt-4o-mini - use_repo_map: true - reminder: sys - examples_as_sys_msg: true - -- name: gpt-4-0613 - edit_format: diff - weak_model_name: gpt-4o-mini - use_repo_map: true - reminder: sys - -- name: gpt-4-32k-0613 - edit_format: diff - weak_model_name: gpt-4o-mini - use_repo_map: true - reminder: sys - -- name: claude-3-opus-20240229 - edit_format: diff - weak_model_name: claude-3-5-haiku-20241022 - use_repo_map: true - -- name: openrouter/anthropic/claude-3-opus - edit_format: diff - weak_model_name: openrouter/anthropic/claude-3-5-haiku - use_repo_map: true - -- name: claude-3-sonnet-20240229 - weak_model_name: claude-3-5-haiku-20241022 - -- name: claude-3-5-sonnet-20240620 - edit_format: diff - weak_model_name: claude-3-5-haiku-20241022 - use_repo_map: true - examples_as_sys_msg: true extra_params: extra_headers: anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25 - max_tokens: 8192 cache_control: true - editor_model_name: claude-3-5-sonnet-20240620 - editor_edit_format: editor-diff - name: anthropic/claude-3-5-sonnet-20240620 edit_format: diff @@ -359,6 +208,62 @@ cog.out("```\n") editor_model_name: anthropic/claude-3-5-sonnet-20241022 editor_edit_format: editor-diff +- name: anthropic/claude-3-5-sonnet-latest + edit_format: diff + weak_model_name: anthropic/claude-3-5-haiku-20241022 + use_repo_map: true + examples_as_sys_msg: true + extra_params: + extra_headers: + anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25 + max_tokens: 8192 + cache_control: true + editor_model_name: anthropic/claude-3-5-sonnet-20241022 + editor_edit_format: editor-diff + +- name: anthropic/claude-3-haiku-20240307 + weak_model_name: anthropic/claude-3-haiku-20240307 + examples_as_sys_msg: true + extra_params: + extra_headers: + anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25 + cache_control: true + +- name: azure/o1 + edit_format: diff + weak_model_name: azure/gpt-4o-mini + use_repo_map: true + use_temperature: false + streaming: false + editor_model_name: azure/gpt-4o + editor_edit_format: editor-diff + +- name: azure/o1-mini + weak_model_name: azure/gpt-4o-mini + use_repo_map: true + use_system_prompt: false + use_temperature: false + editor_model_name: azure/gpt-4o + editor_edit_format: editor-diff + +- name: azure/o1-preview + edit_format: diff + weak_model_name: azure/gpt-4o-mini + use_repo_map: true + use_system_prompt: false + use_temperature: false + editor_model_name: azure/gpt-4o + editor_edit_format: editor-diff + +- name: bedrock/anthropic.claude-3-5-haiku-20241022-v1:0 + edit_format: diff + weak_model_name: bedrock/anthropic.claude-3-5-haiku-20241022-v1:0 + use_repo_map: true + extra_params: + extra_headers: + anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25 + cache_control: true + - name: bedrock/anthropic.claude-3-5-sonnet-20241022-v2:0 edit_format: diff weak_model_name: bedrock/anthropic.claude-3-5-haiku-20241022-v1:0 @@ -372,9 +277,19 @@ cog.out("```\n") editor_model_name: bedrock/anthropic.claude-3-5-sonnet-20241022-v2:0 editor_edit_format: editor-diff -- name: anthropic/claude-3-5-sonnet-latest +- name: claude-3-5-haiku-20241022 edit_format: diff - weak_model_name: anthropic/claude-3-5-haiku-20241022 + weak_model_name: claude-3-5-haiku-20241022 + use_repo_map: true + examples_as_sys_msg: true + extra_params: + extra_headers: + anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25 + cache_control: true + +- name: claude-3-5-sonnet-20240620 + edit_format: diff + weak_model_name: claude-3-5-haiku-20241022 use_repo_map: true examples_as_sys_msg: true extra_params: @@ -382,7 +297,7 @@ cog.out("```\n") anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25 max_tokens: 8192 cache_control: true - editor_model_name: anthropic/claude-3-5-sonnet-20241022 + editor_model_name: claude-3-5-sonnet-20240620 editor_edit_format: editor-diff - name: claude-3-5-sonnet-20241022 @@ -398,49 +313,6 @@ cog.out("```\n") editor_model_name: claude-3-5-sonnet-20241022 editor_edit_format: editor-diff -- name: anthropic/claude-3-haiku-20240307 - weak_model_name: anthropic/claude-3-haiku-20240307 - examples_as_sys_msg: true - extra_params: - extra_headers: - anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25 - cache_control: true - -- name: anthropic/claude-3-5-haiku-20241022 - edit_format: diff - weak_model_name: anthropic/claude-3-5-haiku-20241022 - use_repo_map: true - extra_params: - extra_headers: - anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25 - cache_control: true - -- name: bedrock/anthropic.claude-3-5-haiku-20241022-v1:0 - edit_format: diff - weak_model_name: bedrock/anthropic.claude-3-5-haiku-20241022-v1:0 - use_repo_map: true - extra_params: - extra_headers: - anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25 - cache_control: true - -- name: claude-3-5-haiku-20241022 - edit_format: diff - weak_model_name: claude-3-5-haiku-20241022 - use_repo_map: true - examples_as_sys_msg: true - extra_params: - extra_headers: - anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25 - cache_control: true - -- name: vertex_ai/claude-3-5-haiku@20241022 - edit_format: diff - weak_model_name: vertex_ai/claude-3-5-haiku@20241022 - use_repo_map: true - extra_params: - max_tokens: 4096 - - name: claude-3-haiku-20240307 weak_model_name: claude-3-haiku-20240307 examples_as_sys_msg: true @@ -449,6 +321,305 @@ cog.out("```\n") anthropic-beta: prompt-caching-2024-07-31,pdfs-2024-09-25 cache_control: true +- name: claude-3-opus-20240229 + edit_format: diff + weak_model_name: claude-3-5-haiku-20241022 + use_repo_map: true + +- name: claude-3-sonnet-20240229 + weak_model_name: claude-3-5-haiku-20241022 + +- name: command-r-08-2024 + weak_model_name: command-r-08-2024 + use_repo_map: true + +- name: command-r-plus + weak_model_name: command-r-plus + use_repo_map: true + +- name: command-r-plus-08-2024 + weak_model_name: command-r-plus-08-2024 + use_repo_map: true + +- name: deepseek-chat + edit_format: diff + use_repo_map: true + reminder: sys + examples_as_sys_msg: true + extra_params: + max_tokens: 8192 + +- name: deepseek-coder + edit_format: diff + use_repo_map: true + reminder: sys + examples_as_sys_msg: true + extra_params: + max_tokens: 8192 + caches_by_default: true + +- name: deepseek/deepseek-chat + edit_format: diff + use_repo_map: true + reminder: sys + examples_as_sys_msg: true + extra_params: + max_tokens: 8192 + caches_by_default: true + +- name: deepseek/deepseek-coder + edit_format: diff + use_repo_map: true + reminder: sys + examples_as_sys_msg: true + extra_params: + max_tokens: 8192 + caches_by_default: true + +- name: deepseek/deepseek-reasoner + edit_format: diff + weak_model_name: deepseek/deepseek-chat + use_repo_map: true + examples_as_sys_msg: true + extra_params: + max_tokens: 8192 + caches_by_default: true + use_temperature: false + editor_model_name: deepseek/deepseek-chat + editor_edit_format: editor-diff + +- name: gemini/gemini-1.5-flash-002 + +- name: gemini/gemini-1.5-flash-exp-0827 + +- name: gemini/gemini-1.5-pro + edit_format: diff-fenced + use_repo_map: true + +- name: gemini/gemini-1.5-pro-002 + edit_format: diff + use_repo_map: true + +- name: gemini/gemini-1.5-pro-exp-0827 + edit_format: diff-fenced + use_repo_map: true + +- name: gemini/gemini-1.5-pro-latest + edit_format: diff-fenced + use_repo_map: true + +- name: gemini/gemini-2.0-flash-exp + edit_format: diff + use_repo_map: true + +- name: gemini/gemini-exp-1114 + edit_format: diff + use_repo_map: true + +- name: gemini/gemini-exp-1121 + edit_format: diff + use_repo_map: true + +- name: gemini/gemini-exp-1206 + edit_format: diff + use_repo_map: true + +- name: gpt-3.5-turbo + weak_model_name: gpt-4o-mini + reminder: sys + +- name: gpt-3.5-turbo-0125 + weak_model_name: gpt-4o-mini + reminder: sys + +- name: gpt-3.5-turbo-0613 + weak_model_name: gpt-4o-mini + reminder: sys + +- name: gpt-3.5-turbo-1106 + weak_model_name: gpt-4o-mini + reminder: sys + +- name: gpt-3.5-turbo-16k-0613 + weak_model_name: gpt-4o-mini + reminder: sys + +- name: gpt-4-0125-preview + edit_format: udiff + weak_model_name: gpt-4o-mini + use_repo_map: true + lazy: true + reminder: sys + examples_as_sys_msg: true + +- name: gpt-4-0314 + edit_format: diff + weak_model_name: gpt-4o-mini + use_repo_map: true + reminder: sys + examples_as_sys_msg: true + +- name: gpt-4-0613 + edit_format: diff + weak_model_name: gpt-4o-mini + use_repo_map: true + reminder: sys + +- name: gpt-4-1106-preview + edit_format: udiff + weak_model_name: gpt-4o-mini + use_repo_map: true + lazy: true + reminder: sys + +- name: gpt-4-32k-0613 + edit_format: diff + weak_model_name: gpt-4o-mini + use_repo_map: true + reminder: sys + +- name: gpt-4-turbo + edit_format: udiff + weak_model_name: gpt-4o-mini + use_repo_map: true + lazy: true + reminder: sys + +- name: gpt-4-turbo-2024-04-09 + edit_format: udiff + weak_model_name: gpt-4o-mini + use_repo_map: true + lazy: true + reminder: sys + +- name: gpt-4-vision-preview + edit_format: diff + weak_model_name: gpt-4o-mini + use_repo_map: true + reminder: sys + +- name: gpt-4o + edit_format: diff + weak_model_name: gpt-4o-mini + use_repo_map: true + lazy: true + reminder: sys + examples_as_sys_msg: true + editor_edit_format: editor-diff + +- name: gpt-4o-2024-08-06 + edit_format: diff + weak_model_name: gpt-4o-mini + use_repo_map: true + lazy: true + reminder: sys + examples_as_sys_msg: true + +- name: gpt-4o-2024-11-20 + edit_format: diff + weak_model_name: gpt-4o-mini + use_repo_map: true + lazy: true + reminder: sys + examples_as_sys_msg: true + +- name: gpt-4o-mini + weak_model_name: gpt-4o-mini + lazy: true + reminder: sys + +- name: groq/llama3-70b-8192 + edit_format: diff + weak_model_name: groq/llama3-8b-8192 + examples_as_sys_msg: true + +- name: o1 + edit_format: diff + weak_model_name: gpt-4o-mini + use_repo_map: true + use_temperature: false + streaming: false + editor_model_name: gpt-4o + editor_edit_format: editor-diff + +- name: o1-mini + weak_model_name: gpt-4o-mini + use_repo_map: true + use_system_prompt: false + use_temperature: false + editor_model_name: gpt-4o + editor_edit_format: editor-diff + +- name: o1-preview + edit_format: architect + weak_model_name: gpt-4o-mini + use_repo_map: true + use_system_prompt: false + use_temperature: false + editor_model_name: gpt-4o + editor_edit_format: editor-diff + +- name: openai/gpt-4o + edit_format: diff + weak_model_name: gpt-4o-mini + use_repo_map: true + lazy: true + reminder: sys + examples_as_sys_msg: true + editor_edit_format: editor-diff + +- name: openai/gpt-4o-2024-08-06 + edit_format: diff + weak_model_name: gpt-4o-mini + use_repo_map: true + lazy: true + reminder: sys + examples_as_sys_msg: true + +- name: openai/gpt-4o-2024-11-20 + edit_format: diff + weak_model_name: gpt-4o-mini + use_repo_map: true + lazy: true + reminder: sys + examples_as_sys_msg: true + +- name: openai/gpt-4o-mini + weak_model_name: openai/gpt-4o-mini + lazy: true + reminder: sys + +- name: openai/o1 + edit_format: diff + weak_model_name: openai/gpt-4o-mini + use_repo_map: true + use_temperature: false + streaming: false + editor_model_name: openai/gpt-4o + editor_edit_format: editor-diff + +- name: openai/o1-mini + weak_model_name: openai/gpt-4o-mini + use_repo_map: true + use_system_prompt: false + use_temperature: false + editor_model_name: openai/gpt-4o + editor_edit_format: editor-diff + +- name: openai/o1-preview + edit_format: diff + weak_model_name: openai/gpt-4o-mini + use_repo_map: true + use_system_prompt: false + use_temperature: false + editor_model_name: openai/gpt-4o + editor_edit_format: editor-diff + +- name: openrouter/anthropic/claude-3-opus + edit_format: diff + weak_model_name: openrouter/anthropic/claude-3-5-haiku + use_repo_map: true + - name: openrouter/anthropic/claude-3.5-sonnet edit_format: diff weak_model_name: openrouter/anthropic/claude-3-5-haiku @@ -471,96 +642,18 @@ cog.out("```\n") editor_model_name: openrouter/anthropic/claude-3.5-sonnet:beta editor_edit_format: editor-diff -- name: vertex_ai/claude-3-5-sonnet@20240620 +- name: openrouter/deepseek/deepseek-chat edit_format: diff - weak_model_name: vertex_ai/claude-3-5-haiku@20241022 use_repo_map: true - examples_as_sys_msg: true - extra_params: - max_tokens: 8192 - editor_model_name: vertex_ai/claude-3-5-sonnet@20240620 - editor_edit_format: editor-diff - -- name: vertex_ai/claude-3-5-sonnet-v2@20241022 - edit_format: diff - weak_model_name: vertex_ai/claude-3-5-haiku@20241022 - use_repo_map: true - examples_as_sys_msg: true - extra_params: - max_tokens: 8192 - editor_model_name: vertex_ai/claude-3-5-sonnet-v2@20241022 - editor_edit_format: editor-diff - -- name: vertex_ai/claude-3-opus@20240229 - edit_format: diff - weak_model_name: vertex_ai/claude-3-5-haiku@20241022 - use_repo_map: true - -- name: vertex_ai/claude-3-sonnet@20240229 - weak_model_name: vertex_ai/claude-3-5-haiku@20241022 - -- name: command-r-plus - weak_model_name: command-r-plus - use_repo_map: true - -- name: command-r-08-2024 - weak_model_name: command-r-08-2024 - use_repo_map: true - -- name: command-r-plus-08-2024 - weak_model_name: command-r-plus-08-2024 - use_repo_map: true - -- name: groq/llama3-70b-8192 - edit_format: diff - weak_model_name: groq/llama3-8b-8192 + reminder: sys examples_as_sys_msg: true -- name: openrouter/meta-llama/llama-3-70b-instruct +- name: openrouter/deepseek/deepseek-coder edit_format: diff - weak_model_name: openrouter/meta-llama/llama-3-70b-instruct + use_repo_map: true + reminder: sys examples_as_sys_msg: true -- name: gemini/gemini-1.5-pro-002 - edit_format: diff - use_repo_map: true - -- name: gemini/gemini-1.5-flash-002 - -- name: gemini/gemini-1.5-pro - edit_format: diff-fenced - use_repo_map: true - -- name: gemini/gemini-1.5-pro-latest - edit_format: diff-fenced - use_repo_map: true - -- name: gemini/gemini-1.5-pro-exp-0827 - edit_format: diff-fenced - use_repo_map: true - -- name: gemini/gemini-exp-1206 - edit_format: diff - use_repo_map: true - -- name: gemini/gemini-exp-1114 - edit_format: diff - use_repo_map: true - -- name: gemini/gemini-exp-1121 - edit_format: diff - use_repo_map: true - -- name: vertex_ai/gemini-pro-experimental - edit_format: diff-fenced - use_repo_map: true - -- name: gemini/gemini-1.5-flash-exp-0827 - -- name: gemini/gemini-2.0-flash-exp - edit_format: diff - use_repo_map: true - - name: openrouter/deepseek/deepseek-r1 edit_format: diff weak_model_name: openrouter/deepseek/deepseek-chat @@ -573,63 +666,9 @@ cog.out("```\n") editor_model_name: openrouter/deepseek/deepseek-chat editor_edit_format: editor-diff -- name: deepseek/deepseek-reasoner +- name: openrouter/meta-llama/llama-3-70b-instruct edit_format: diff - weak_model_name: deepseek/deepseek-chat - use_repo_map: true - examples_as_sys_msg: true - extra_params: - max_tokens: 8192 - caches_by_default: true - use_temperature: false - editor_model_name: deepseek/deepseek-chat - editor_edit_format: editor-diff - -- name: deepseek/deepseek-chat - edit_format: diff - use_repo_map: true - reminder: sys - examples_as_sys_msg: true - extra_params: - max_tokens: 8192 - caches_by_default: true - -- name: deepseek/deepseek-coder - edit_format: diff - use_repo_map: true - reminder: sys - examples_as_sys_msg: true - extra_params: - max_tokens: 8192 - caches_by_default: true - -- name: deepseek-chat - edit_format: diff - use_repo_map: true - reminder: sys - examples_as_sys_msg: true - extra_params: - max_tokens: 8192 - -- name: deepseek-coder - edit_format: diff - use_repo_map: true - reminder: sys - examples_as_sys_msg: true - extra_params: - max_tokens: 8192 - caches_by_default: true - -- name: openrouter/deepseek/deepseek-coder - edit_format: diff - use_repo_map: true - reminder: sys - examples_as_sys_msg: true - -- name: openrouter/deepseek/deepseek-chat - edit_format: diff - use_repo_map: true - reminder: sys + weak_model_name: openrouter/meta-llama/llama-3-70b-instruct examples_as_sys_msg: true - name: openrouter/openai/gpt-4o @@ -641,64 +680,13 @@ cog.out("```\n") examples_as_sys_msg: true editor_edit_format: editor-diff -- name: openai/o1-mini - weak_model_name: openai/gpt-4o-mini - use_repo_map: true - use_system_prompt: false - use_temperature: false - editor_model_name: openai/gpt-4o - editor_edit_format: editor-diff - -- name: azure/o1-mini - weak_model_name: azure/gpt-4o-mini - use_repo_map: true - use_system_prompt: false - use_temperature: false - editor_model_name: azure/gpt-4o - editor_edit_format: editor-diff - -- name: o1-mini - weak_model_name: gpt-4o-mini - use_repo_map: true - use_system_prompt: false - use_temperature: false - editor_model_name: gpt-4o - editor_edit_format: editor-diff - -- name: openai/o1-preview +- name: openrouter/openai/o1 edit_format: diff - weak_model_name: openai/gpt-4o-mini - use_repo_map: true - use_system_prompt: false - use_temperature: false - editor_model_name: openai/gpt-4o - editor_edit_format: editor-diff - -- name: azure/o1-preview - edit_format: diff - weak_model_name: azure/gpt-4o-mini - use_repo_map: true - use_system_prompt: false - use_temperature: false - editor_model_name: azure/gpt-4o - editor_edit_format: editor-diff - -- name: azure/o1 - edit_format: diff - weak_model_name: azure/gpt-4o-mini + weak_model_name: openrouter/openai/gpt-4o-mini use_repo_map: true use_temperature: false streaming: false - editor_model_name: azure/gpt-4o - editor_edit_format: editor-diff - -- name: o1-preview - edit_format: architect - weak_model_name: gpt-4o-mini - use_repo_map: true - use_system_prompt: false - use_temperature: false - editor_model_name: gpt-4o + editor_model_name: openrouter/openai/gpt-4o editor_edit_format: editor-diff - name: openrouter/openai/o1-mini @@ -720,39 +708,51 @@ cog.out("```\n") editor_model_name: openrouter/openai/gpt-4o editor_edit_format: editor-diff -- name: openrouter/openai/o1 - edit_format: diff - weak_model_name: openrouter/openai/gpt-4o-mini - use_repo_map: true - use_temperature: false - streaming: false - editor_model_name: openrouter/openai/gpt-4o - editor_edit_format: editor-diff - -- name: openai/o1 - edit_format: diff - weak_model_name: openai/gpt-4o-mini - use_repo_map: true - use_temperature: false - streaming: false - editor_model_name: openai/gpt-4o - editor_edit_format: editor-diff - -- name: o1 - edit_format: diff - weak_model_name: gpt-4o-mini - use_repo_map: true - use_temperature: false - streaming: false - editor_model_name: gpt-4o - editor_edit_format: editor-diff - - name: openrouter/qwen/qwen-2.5-coder-32b-instruct edit_format: diff weak_model_name: openrouter/qwen/qwen-2.5-coder-32b-instruct use_repo_map: true editor_model_name: openrouter/qwen/qwen-2.5-coder-32b-instruct editor_edit_format: editor-diff + +- name: vertex_ai/claude-3-5-haiku@20241022 + edit_format: diff + weak_model_name: vertex_ai/claude-3-5-haiku@20241022 + use_repo_map: true + extra_params: + max_tokens: 4096 + +- name: vertex_ai/claude-3-5-sonnet-v2@20241022 + edit_format: diff + weak_model_name: vertex_ai/claude-3-5-haiku@20241022 + use_repo_map: true + examples_as_sys_msg: true + extra_params: + max_tokens: 8192 + editor_model_name: vertex_ai/claude-3-5-sonnet-v2@20241022 + editor_edit_format: editor-diff + +- name: vertex_ai/claude-3-5-sonnet@20240620 + edit_format: diff + weak_model_name: vertex_ai/claude-3-5-haiku@20241022 + use_repo_map: true + examples_as_sys_msg: true + extra_params: + max_tokens: 8192 + editor_model_name: vertex_ai/claude-3-5-sonnet@20240620 + editor_edit_format: editor-diff + +- name: vertex_ai/claude-3-opus@20240229 + edit_format: diff + weak_model_name: vertex_ai/claude-3-5-haiku@20241022 + use_repo_map: true + +- name: vertex_ai/claude-3-sonnet@20240229 + weak_model_name: vertex_ai/claude-3-5-haiku@20241022 + +- name: vertex_ai/gemini-pro-experimental + edit_format: diff-fenced + use_repo_map: true ``` diff --git a/aider/website/docs/faq.md b/aider/website/docs/faq.md index 3580225ca..3b636fd3a 100644 --- a/aider/website/docs/faq.md +++ b/aider/website/docs/faq.md @@ -249,10 +249,10 @@ tr:hover { background-color: #f5f5f5; }
Model NameTotal TokensPercent
claude-3-5-sonnet-20241022866,17544.5%
deepseek/deepseek-chat704,11936.2%
deepseek/REDACTED308,84115.9%
claude-3-5-sonnet-20241022876,53844.8%
deepseek/deepseek-chat704,11936.0%
deepseek/REDACTED308,84115.8%
deepseek/deepseek-reasoner40,5972.1%
claude-3-5-haiku-2024102210,0830.5%
openrouter/deepseek/deepseek-chat9,9950.5%
- - - - + + + + From aa339d0851d6b3762f6ad90687f33b3bd3a25d83 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Tue, 28 Jan 2025 14:16:02 -0800 Subject: [PATCH 217/229] refactor: Improve text processing by stripping whitespace after removing reasoning tags --- aider/coders/base_coder.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aider/coders/base_coder.py b/aider/coders/base_coder.py index d9d09765c..f932f257e 100755 --- a/aider/coders/base_coder.py +++ b/aider/coders/base_coder.py @@ -1889,7 +1889,7 @@ class Coder: pattern = ( f"<{self.main_model.remove_reasoning}>.*?" ) - res = re.sub(pattern, "", res, flags=re.DOTALL) + res = re.sub(pattern, "", res, flags=re.DOTALL).strip() return res From 298f713e9bcd292bda7ed2dc792eca14868eeabd Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Tue, 28 Jan 2025 16:33:25 -0800 Subject: [PATCH 218/229] copy --- aider/website/_data/deepseek-down.yml | 28 ++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/aider/website/_data/deepseek-down.yml b/aider/website/_data/deepseek-down.yml index c1a7d8d8c..c146ccfb8 100644 --- a/aider/website/_data/deepseek-down.yml +++ b/aider/website/_data/deepseek-down.yml @@ -75,4 +75,30 @@ date: 2025-01-28 versions: 0.72.4.dev seconds_per_case: 187.0 - total_cost: 0.2733 \ No newline at end of file + total_cost: 0.2733 + +- dirname: 2025-01-28-21-07-23--or-v3-novita-diff + test_cases: 225 + model: "OpenRouter: Novita" + edit_format: diff + commit_hash: 66025a0 + pass_rate_1: 20.4 + pass_rate_2: 42.7 + pass_num_1: 46 + pass_num_2: 96 + percent_cases_well_formed: 84.0 + error_outputs: 265 + num_malformed_responses: 67 + num_with_malformed_responses: 36 + user_asks: 5 + lazy_comments: 0 + syntax_errors: 0 + indentation_errors: 0 + exhausted_context_windows: 0 + test_timeouts: 8 + total_tests: 225 + command: aider --model openrouter/deepseek/deepseek-chat + date: 2025-01-28 + versions: 0.72.4.dev + seconds_per_case: 472.5 + total_cost: 0.0000 \ No newline at end of file From 7aa6a30169d86eca42370411ed9612565ecf0fcd Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Tue, 28 Jan 2025 18:44:34 -0800 Subject: [PATCH 219/229] fix: Update Ollama context window handling and input confirmation logic --- aider/coders/base_coder.py | 18 +++++++++--------- aider/io.py | 1 + 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/aider/coders/base_coder.py b/aider/coders/base_coder.py index f932f257e..bcb68bb68 100755 --- a/aider/coders/base_coder.py +++ b/aider/coders/base_coder.py @@ -1246,7 +1246,7 @@ class Coder: self.io.tool_output("- Use /drop to remove unneeded files from the chat") self.io.tool_output("- Use /clear to clear the chat history") self.io.tool_output("- Break your code into smaller files") - proceed = "y" + proceed = "Y" self.io.tool_output( "It's probably safe to try and send the request, most providers won't charge if" " the context limit is exceeded." @@ -1255,14 +1255,14 @@ class Coder: # Special warning for Ollama models about context window size if self.main_model.name.startswith(("ollama/", "ollama_chat/")): extra_params = getattr(self.main_model, "extra_params", None) or {} - num_ctx = extra_params.get("num_ctx", 8192) - if max_input_tokens and max_input_tokens > num_ctx: - self.io.tool_waning( - f"Your Ollama model is configured with num_ctx={num_ctx} tokens of" - " context window\nSee" - " https://aider.chat/docs/llms/ollama.html#setting-the-context-window-size" - " for help configuring larger context windows." - ) + num_ctx = extra_params.get("num_ctx", 2048) + if input_tokens > num_ctx: + proceed = "N" + self.io.tool_warning(f""" +Your Ollama model is configured with num_ctx={num_ctx} tokens of context window. +You are attempting to send {input_tokens} tokens. +See https://aider.chat/docs/llms/ollama.html#setting-the-context-window-size +""".strip()) # noqa if proceed and not self.io.confirm_ask("Try to proceed anyway?", default=proceed): return False diff --git a/aider/io.py b/aider/io.py index 34be6f294..87bce5b17 100644 --- a/aider/io.py +++ b/aider/io.py @@ -732,6 +732,7 @@ class InputOutput: question, style=style, complete_while_typing=False, + default=default, ) else: res = input(question) From 2e9f5623296c5895e58043eee54682c92b181891 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Tue, 28 Jan 2025 18:44:45 -0800 Subject: [PATCH 220/229] copy --- aider/website/docs/leaderboards/index.md | 7 ------- 1 file changed, 7 deletions(-) diff --git a/aider/website/docs/leaderboards/index.md b/aider/website/docs/leaderboards/index.md index e57839db5..00ae3a6a1 100644 --- a/aider/website/docs/leaderboards/index.md +++ b/aider/website/docs/leaderboards/index.md @@ -19,13 +19,6 @@ While [aider can connect to almost any LLM](/docs/llms.html), it works best with models that score well on the benchmarks. -{: .note :} -The -[original aider code editing leaderboard](edit.html) -has been replaced by this -new, much more challenging -[polyglot leaderboard](https://aider.chat/2024/12/21/polyglot.html). - ## Polyglot leaderboard [Aider's polyglot benchmark](/docs/benchmarks.html#the-benchmark) From 88d897eb14e5b4a55a41201d16a0d4f0a2ce7109 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Tue, 28 Jan 2025 18:47:17 -0800 Subject: [PATCH 221/229] copy --- aider/website/assets/sample-analytics.jsonl | 358 ++++++++++---------- aider/website/docs/faq.md | 16 +- aider/website/docs/leaderboards/index.md | 2 +- 3 files changed, 188 insertions(+), 188 deletions(-) diff --git a/aider/website/assets/sample-analytics.jsonl b/aider/website/assets/sample-analytics.jsonl index edc99a6b0..cfb3c5118 100644 --- a/aider/website/assets/sample-analytics.jsonl +++ b/aider/website/assets/sample-analytics.jsonl @@ -1,182 +1,3 @@ -{"event": "cli session", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None", "edit_format": "whole"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149346} -{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149410} -{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149410} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149416} -{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149417} -{"event": "cli session", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None", "edit_format": "whole"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149417} -{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149426} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149429} -{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149430} -{"event": "cli session", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None", "edit_format": "whole"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149430} -{"event": "exit", "properties": {"reason": "Completed main CLI coder.run"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149450} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149452} -{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149454} -{"event": "cli session", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None", "edit_format": "whole"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149454} -{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149457} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149484} -{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149485} -{"event": "cli session", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None", "edit_format": "whole"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149485} -{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149525} -{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149525} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149529} -{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149530} -{"event": "cli session", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None", "edit_format": "whole"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149530} -{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149585} -{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149585} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149588} -{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149590} -{"event": "cli session", "properties": {"main_model": "None", "weak_model": "None", "editor_model": "None", "edit_format": "whole"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149590} -{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149611} -{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149611} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149615} -{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149616} -{"event": "exit", "properties": {"reason": "Exit flag set"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149616} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149652} -{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149653} -{"event": "exit", "properties": {"reason": "Exit flag set"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149653} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149669} -{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149671} -{"event": "exit", "properties": {"reason": "Exit flag set"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149671} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149818} -{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149820} -{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737149822} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737157862} -{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737157864} -{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737157870} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737159856} -{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737159858} -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737159858} -{"event": "ai-comments file-add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737159859} -{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737159859} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737159859} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 15329, "completion_tokens": 197, "total_tokens": 15526, "cost": 0.00220121999999804, "total_cost": 0.00220121999999804}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737159869} -{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737159900} -{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737159900} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737167868} -{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737167870} -{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737167876} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737170874} -{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737170876} -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737170876} -{"event": "command_read-only", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737170888} -{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737170896} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737170970} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "ask", "prompt_tokens": 5604, "completion_tokens": 600, "total_tokens": 6204, "cost": 0.0009525599999980401, "total_cost": 0.0009525599999980401}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737170988} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737171218} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "ask", "prompt_tokens": 5643, "completion_tokens": 530, "total_tokens": 6173, "cost": 0.0009384199999980401, "total_cost": 0.0018909799999960802}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737171233} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737171262} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "ask", "prompt_tokens": 6194, "completion_tokens": 357, "total_tokens": 6551, "cost": 0.0009671199999980401, "total_cost": 0.0028580999999941203}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737171272} -{"event": "command_code", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737171284} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737171284} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 8860, "completion_tokens": 854, "total_tokens": 9714, "cost": 0.00147951999999804, "total_cost": 0.00433761999999216}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737171307} -{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737212408} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737316410} -{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737316413} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737316413} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 10031, "completion_tokens": 36, "total_tokens": 10067, "cost": 0.00141441999999804, "total_cost": 0.00141441999999804}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737316419} -{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737316419} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737316425} -{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737316426} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737316426} -{"event": "message_send", "properties": {"main_model": "claude-3-5-haiku-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-haiku-20241022", "edit_format": "diff", "prompt_tokens": 10028, "completion_tokens": 55, "total_tokens": 10083, "cost": 0.010302999999999998, "total_cost": 0.010302999999999998}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737316431} -{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737316431} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737389467} -{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737389469} -{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737389473} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737389491} -{"event": "model warning", "properties": {"main_model": "deepseek/REDACTED", "weak_model": "deepseek/REDACTED", "editor_model": "deepseek/deepseek-chat"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737389492} -{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737389500} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737389500} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737389516} -{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737389517} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737389517} -{"event": "message_send", "properties": {"main_model": "deepseek/REDACTED", "weak_model": "deepseek/REDACTED", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 3656, "completion_tokens": 95, "total_tokens": 3751, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737389523} -{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737389523} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737389624} -{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737389626} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737389626} -{"event": "message_send", "properties": {"main_model": "deepseek/REDACTED", "weak_model": "deepseek/REDACTED", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 3572, "completion_tokens": 109, "total_tokens": 3681, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737389635} -{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737389635} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737390822} -{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737390824} -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737390824} -{"event": "ai-comments file-add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737390865} -{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737390865} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737390865} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 7042, "completion_tokens": 335, "total_tokens": 7377, "cost": 0.00107968, "total_cost": 0.00107968}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737390876} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737390906} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 7484, "completion_tokens": 526, "total_tokens": 8010, "cost": 0.00119504, "total_cost": 0.00227472}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737390919} -{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737392442} -{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737392442} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737394710} -{"event": "repo", "properties": {"num_files": 424}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737394712} -{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737394725} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737394995} -{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737394997} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737394997} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 7557, "completion_tokens": 258, "total_tokens": 7815, "cost": 0.0011302199999980401, "total_cost": 0.0011302199999980401}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737395006} -{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737395006} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737395164} -{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737395166} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737395166} -{"event": "message_send", "properties": {"main_model": "o1", "weak_model": "gpt-4o-mini", "editor_model": "gpt-4o", "edit_format": "diff", "prompt_tokens": 2366, "completion_tokens": 19, "total_tokens": 2385, "cost": 0.03663, "total_cost": 0.03663}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737395169} -{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737395169} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737395174} -{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737395175} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737395175} -{"event": "message_send", "properties": {"main_model": "o1-preview", "weak_model": "gpt-4o-mini", "editor_model": "gpt-4o", "edit_format": "architect", "prompt_tokens": 138, "completion_tokens": 37, "total_tokens": 175, "cost": 0.00429, "total_cost": 0.00429}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737395182} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737395183} -{"event": "message_send", "properties": {"main_model": "gpt-4o", "weak_model": "gpt-4o-mini", "editor_model": "None", "edit_format": "editor-diff", "prompt_tokens": 1734, "completion_tokens": 41, "total_tokens": 1775, "cost": 0.004745, "total_cost": 0.009035000000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737395184} -{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737395184} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737396361} -{"event": "gui session", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737396362} -{"event": "exit", "properties": {"reason": "GUI session ended"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737396362} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737401397} -{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737401399} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737401399} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 12552, "completion_tokens": 375, "total_tokens": 12927, "cost": 0.0018622800000000002, "total_cost": 0.0018622800000000002}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737401412} -{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737401412} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737402071} -{"event": "gui session", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737402071} -{"event": "exit", "properties": {"reason": "GUI session ended"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737402071} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737402163} -{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737402165} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737402166} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 13089, "completion_tokens": 422, "total_tokens": 13511, "cost": 0.0019506200000000001, "total_cost": 0.0019506200000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737402181} -{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737402181} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737402282} -{"event": "gui session", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737402282} -{"event": "exit", "properties": {"reason": "GUI session ended"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737402282} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737402651} -{"event": "gui session", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737402652} -{"event": "exit", "properties": {"reason": "GUI session ended"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737402652} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737411600} -{"event": "repo", "properties": {"num_files": 426}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737411602} -{"event": "cli session", "properties": {"main_model": "openrouter/REDACTED", "weak_model": "openrouter/deepseek/deepseek-chat", "editor_model": "openrouter/deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737411602} -{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737411603} -{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737411603} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737411741} -{"event": "gui session", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737411741} -{"event": "exit", "properties": {"reason": "GUI session ended"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737411741} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737411858} -{"event": "gui session", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737411858} -{"event": "exit", "properties": {"reason": "GUI session ended"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737411858} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737422948} -{"event": "repo", "properties": {"num_files": 426}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737422951} -{"event": "cli session", "properties": {"main_model": "deepseek/REDACTED", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737422951} -{"event": "command_read-only", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737422981} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737422984} -{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737422992} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737422993} -{"event": "message_send", "properties": {"main_model": "deepseek/REDACTED", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "ask", "prompt_tokens": 4864, "completion_tokens": 703, "total_tokens": 5567, "cost": 0.00421477, "total_cost": 0.00421477}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737423010} -{"event": "command_editor", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737423094} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737423296} -{"event": "message_send", "properties": {"main_model": "deepseek/REDACTED", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "ask", "prompt_tokens": 5714, "completion_tokens": 1089, "total_tokens": 6803, "cost": 0.0055276100000000005, "total_cost": 0.00974238}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737423315} -{"event": "command_code", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737423319} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737423319} -{"event": "message_send", "properties": {"main_model": "deepseek/REDACTED", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 9191, "completion_tokens": 1051, "total_tokens": 10242, "cost": 0.0073567400000000005, "total_cost": 0.017099120000000002}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737423338} -{"event": "command_code", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737423533} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737423533} {"event": "message_send", "properties": {"main_model": "deepseek/REDACTED", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 11198, "completion_tokens": 128, "total_tokens": 11326, "cost": 0.00643922, "total_cost": 0.02353834}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737423544} {"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737423847} {"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737423847} @@ -998,3 +819,182 @@ {"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100124} {"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100124} {"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 11609, "completion_tokens": 177, "total_tokens": 11786, "cost": 0.037482, "total_cost": 0.037482}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100131} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100621} +{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100623} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100623} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100642} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100645} +{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100647} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100647} +{"event": "message_send", "properties": {"main_model": "fireworks_ai/REDACTED", "weak_model": "fireworks_ai/accounts/fireworks/models/deepseek-v3", "editor_model": "fireworks_ai/accounts/fireworks/models/deepseek-v3", "edit_format": "diff", "prompt_tokens": 2344, "completion_tokens": 269, "total_tokens": 2613, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100669} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100669} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100679} +{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100681} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100681} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100686} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100711} +{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100712} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100712} +{"event": "message_send", "properties": {"main_model": "fireworks_ai/REDACTED", "weak_model": "fireworks_ai/accounts/fireworks/models/deepseek-v3", "editor_model": "fireworks_ai/accounts/fireworks/models/deepseek-v3", "edit_format": "diff", "prompt_tokens": 2344, "completion_tokens": 236, "total_tokens": 2580, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100726} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100726} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100750} +{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100751} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100751} +{"event": "message_send", "properties": {"main_model": "fireworks_ai/REDACTED", "weak_model": "fireworks_ai/accounts/fireworks/models/deepseek-v3", "editor_model": "fireworks_ai/accounts/fireworks/models/deepseek-v3", "edit_format": "diff", "prompt_tokens": 2344, "completion_tokens": 224, "total_tokens": 2568, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100763} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100763} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100796} +{"event": "repo", "properties": {"num_files": 433}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100798} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100798} +{"event": "message_send_exception", "properties": {"exception": "No active exception to reraise"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100802} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100812} +{"event": "repo", "properties": {"num_files": 433}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100814} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100814} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 9981, "completion_tokens": 90, "total_tokens": 10071, "cost": 0.031293, "total_cost": 0.031293}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100819} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100819} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100840} +{"event": "repo", "properties": {"num_files": 433}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100842} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100842} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 9993, "completion_tokens": 78, "total_tokens": 10071, "cost": 0.031149000000000003, "total_cost": 0.031149000000000003}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100848} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100848} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100888} +{"event": "repo", "properties": {"num_files": 433}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100890} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100890} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 9993, "completion_tokens": 78, "total_tokens": 10071, "cost": 0.031149000000000003, "total_cost": 0.031149000000000003}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100895} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100895} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100907} +{"event": "repo", "properties": {"num_files": 433}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100909} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100909} +{"event": "message_send", "properties": {"main_model": "claude-3-5-haiku-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-haiku-20241022", "edit_format": "diff", "prompt_tokens": 10022, "completion_tokens": 54, "total_tokens": 10076, "cost": 0.010291999999999999, "total_cost": 0.010291999999999999}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100913} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100913} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100931} +{"event": "repo", "properties": {"num_files": 433}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100933} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100933} +{"event": "message_send", "properties": {"main_model": "claude-3-5-haiku-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-haiku-20241022", "edit_format": "diff", "prompt_tokens": 9978, "completion_tokens": 31, "total_tokens": 10009, "cost": 0.010133, "total_cost": 0.010133}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100937} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100937} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100960} +{"event": "repo", "properties": {"num_files": 433}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100962} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100962} +{"event": "message_send", "properties": {"main_model": "claude-3-5-haiku-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-haiku-20241022", "edit_format": "diff", "prompt_tokens": 10008, "completion_tokens": 31, "total_tokens": 10039, "cost": 0.010163, "total_cost": 0.010163}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100967} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100967} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100972} +{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100974} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100974} +{"event": "message_send", "properties": {"main_model": "fireworks_ai/REDACTED", "weak_model": "fireworks_ai/accounts/fireworks/models/deepseek-v3", "editor_model": "fireworks_ai/accounts/fireworks/models/deepseek-v3", "edit_format": "diff", "prompt_tokens": 2344, "completion_tokens": 238, "total_tokens": 2582, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100988} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100988} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100998} +{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100999} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738100999} +{"event": "message_send", "properties": {"main_model": "fireworks_ai/REDACTED", "weak_model": "fireworks_ai/accounts/fireworks/models/deepseek-v3", "editor_model": "fireworks_ai/accounts/fireworks/models/deepseek-v3", "edit_format": "diff", "prompt_tokens": 2344, "completion_tokens": 334, "total_tokens": 2678, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738101021} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738101021} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738101074} +{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738101076} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738101076} +{"event": "message_send", "properties": {"main_model": "fireworks_ai/REDACTED", "weak_model": "fireworks_ai/accounts/fireworks/models/deepseek-v3", "editor_model": "fireworks_ai/accounts/fireworks/models/deepseek-v3", "edit_format": "diff", "prompt_tokens": 2344, "completion_tokens": 311, "total_tokens": 2655, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738101101} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738101101} +{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738102536} +{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738102536} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738102552} +{"event": "repo", "properties": {"num_files": 433}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738102554} +{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738102562} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738115955} +{"event": "model warning", "properties": {"main_model": "groq/REDACTED", "weak_model": "groq/REDACTED", "editor_model": "groq/REDACTED"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738115957} +{"event": "repo", "properties": {"num_files": 433}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738115959} +{"event": "cli session", "properties": {"main_model": "groq/REDACTED", "weak_model": "groq/REDACTED", "editor_model": "groq/REDACTED", "edit_format": "whole"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738115959} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738115960} +{"event": "message_send", "properties": {"main_model": "groq/REDACTED", "weak_model": "groq/REDACTED", "editor_model": "groq/REDACTED", "edit_format": "whole", "prompt_tokens": 1928, "completion_tokens": 534, "total_tokens": 2462, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738115963} +{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738115964} +{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738115964} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738116064} +{"event": "model warning", "properties": {"main_model": "groq/REDACTED", "weak_model": "groq/llama-3.3-70b-versatile", "editor_model": "groq/llama-3.3-70b-versatile"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738116066} +{"event": "repo", "properties": {"num_files": 433}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738116068} +{"event": "cli session", "properties": {"main_model": "groq/REDACTED", "weak_model": "groq/llama-3.3-70b-versatile", "editor_model": "groq/llama-3.3-70b-versatile", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738116068} +{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738116073} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738117530} +{"event": "model warning", "properties": {"main_model": "ollama/REDACTED", "weak_model": "ollama/REDACTED", "editor_model": "ollama/REDACTED"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738117533} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738117540} +{"event": "repo", "properties": {"num_files": 433}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738117542} +{"event": "cli session", "properties": {"main_model": "ollama/REDACTED", "weak_model": "ollama/REDACTED", "editor_model": "ollama/REDACTED", "edit_format": "whole"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738117542} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738117542} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738117561} +{"event": "repo", "properties": {"num_files": 433}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738117563} +{"event": "cli session", "properties": {"main_model": "ollama/REDACTED", "weak_model": "ollama/REDACTED", "editor_model": "ollama/REDACTED", "edit_format": "whole"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738117563} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738117565} +{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738117622} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738117720} +{"event": "repo", "properties": {"num_files": 433}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738117722} +{"event": "cli session", "properties": {"main_model": "ollama/REDACTED", "weak_model": "ollama/REDACTED", "editor_model": "ollama/REDACTED", "edit_format": "whole"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738117723} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738117724} +{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738117753} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738117754} +{"event": "repo", "properties": {"num_files": 433}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738117756} +{"event": "cli session", "properties": {"main_model": "ollama/REDACTED", "weak_model": "ollama/REDACTED", "editor_model": "ollama/REDACTED", "edit_format": "whole"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738117757} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738117759} +{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738117815} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738117817} +{"event": "repo", "properties": {"num_files": 433}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738117819} +{"event": "cli session", "properties": {"main_model": "ollama/REDACTED", "weak_model": "ollama/REDACTED", "editor_model": "ollama/REDACTED", "edit_format": "whole"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738117819} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738117820} +{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738117840} +{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738117840} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738117852} +{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738117853} +{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738117853} +{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738117855} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738117861} +{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738117862} +{"event": "cli session", "properties": {"main_model": "ollama/REDACTED", "weak_model": "ollama/REDACTED", "editor_model": "ollama/REDACTED", "edit_format": "whole"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738117862} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738117862} +{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738117883} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738117884} +{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738117886} +{"event": "cli session", "properties": {"main_model": "ollama/REDACTED", "weak_model": "ollama/REDACTED", "editor_model": "ollama/REDACTED", "edit_format": "whole"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738117886} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738117887} +{"event": "command_clear", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738117907} +{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738117924} +{"event": "command_chat-mode", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738117926} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738117931} +{"event": "message_send", "properties": {"main_model": "ollama/REDACTED", "weak_model": "ollama/REDACTED", "editor_model": "ollama/REDACTED", "edit_format": "ask", "prompt_tokens": 514, "completion_tokens": 85, "total_tokens": 599, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738117943} +{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738117951} +{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738117951} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738117956} +{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738117958} +{"event": "cli session", "properties": {"main_model": "ollama/REDACTED", "weak_model": "ollama/REDACTED", "editor_model": "ollama/REDACTED", "edit_format": "whole"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738117958} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738117964} +{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738117975} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738117981} +{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738117983} +{"event": "cli session", "properties": {"main_model": "ollama/REDACTED", "weak_model": "ollama/REDACTED", "editor_model": "ollama/REDACTED", "edit_format": "whole"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738117983} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738117984} +{"event": "message_send", "properties": {"main_model": "ollama/REDACTED", "weak_model": "ollama/REDACTED", "editor_model": "ollama/REDACTED", "edit_format": "ask", "prompt_tokens": 84, "completion_tokens": 101, "total_tokens": 185, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738117995} +{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738118005} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738118006} +{"event": "command_clear", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738118023} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738118028} +{"event": "message_send", "properties": {"main_model": "ollama/REDACTED", "weak_model": "ollama/REDACTED", "editor_model": "ollama/REDACTED", "edit_format": "ask", "prompt_tokens": 516, "completion_tokens": 52, "total_tokens": 568, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738118033} +{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738118048} +{"event": "command_clear", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738118052} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738118054} +{"event": "message_send", "properties": {"main_model": "ollama/REDACTED", "weak_model": "ollama/REDACTED", "editor_model": "ollama/REDACTED", "edit_format": "ask", "prompt_tokens": 13988, "completion_tokens": 40, "total_tokens": 14028, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738118079} +{"event": "exit", "properties": {"reason": "Control-C"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738118109} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738118191} +{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738118193} +{"event": "cli session", "properties": {"main_model": "ollama/REDACTED", "weak_model": "ollama/REDACTED", "editor_model": "ollama/REDACTED", "edit_format": "whole"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738118193} +{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738118217} +{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738118217} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738118237} +{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738118239} +{"event": "cli session", "properties": {"main_model": "ollama/REDACTED", "weak_model": "ollama/REDACTED", "editor_model": "ollama/REDACTED", "edit_format": "whole"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738118239} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738118241} +{"event": "message_send", "properties": {"main_model": "ollama/REDACTED", "weak_model": "ollama/REDACTED", "editor_model": "ollama/REDACTED", "edit_format": "ask", "prompt_tokens": 79, "completion_tokens": 9, "total_tokens": 88, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738118250} +{"event": "command_read-only", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738118261} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738118263} +{"event": "message_send", "properties": {"main_model": "ollama/REDACTED", "weak_model": "ollama/REDACTED", "editor_model": "ollama/REDACTED", "edit_format": "ask", "prompt_tokens": 524, "completion_tokens": 65, "total_tokens": 589, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738118280} +{"event": "command_tokens", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738118285} +{"event": "command_read-only", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738118296} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738118297} +{"event": "message_send", "properties": {"main_model": "ollama/REDACTED", "weak_model": "ollama/REDACTED", "editor_model": "ollama/REDACTED", "edit_format": "ask", "prompt_tokens": 6458, "completion_tokens": 126, "total_tokens": 6584, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738118366} +{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738118390} +{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738118390} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738118663} +{"event": "repo", "properties": {"num_files": 433}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738118665} +{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738118674} diff --git a/aider/website/docs/faq.md b/aider/website/docs/faq.md index 3b636fd3a..734a73196 100644 --- a/aider/website/docs/faq.md +++ b/aider/website/docs/faq.md @@ -249,16 +249,16 @@ tr:hover { background-color: #f5f5f5; }
Model NameTotal TokensPercent
claude-3-5-sonnet-20241022876,53844.8%
deepseek/deepseek-chat704,11936.0%
deepseek/REDACTED308,84115.8%
deepseek/deepseek-reasoner40,5972.1%
claude-3-5-sonnet-20241022934,96146.4%
deepseek/deepseek-chat704,11934.9%
deepseek/REDACTED308,84115.3%
deepseek/deepseek-reasoner40,5972.0%
claude-3-5-haiku-2024102210,0830.5%
openrouter/deepseek/deepseek-chat9,9950.5%
o12,3850.1%
- - - - - + + + + + + + - + - -
Model NameTotal TokensPercent
claude-3-5-sonnet-20241022934,96146.4%
deepseek/deepseek-chat704,11934.9%
deepseek/REDACTED308,84115.3%
deepseek/deepseek-reasoner40,5972.0%
claude-3-5-haiku-2024102210,0830.5%
claude-3-5-sonnet-20241022965,17449.1%
deepseek/deepseek-chat600,24430.5%
deepseek/REDACTED278,79714.2%
deepseek/deepseek-reasoner40,5972.1%
claude-3-5-haiku-2024102230,1241.5%
ollama/REDACTED22,6411.2%
fireworks_ai/REDACTED15,6760.8%
openrouter/deepseek/deepseek-chat9,9950.5%
o12,3850.1%
groq/REDACTED2,4620.1%
openai/REDACTED1,8800.1%
gpt-4o1,7750.1%
o1-preview1750.0%
{: .note :} diff --git a/aider/website/docs/leaderboards/index.md b/aider/website/docs/leaderboards/index.md index 00ae3a6a1..d36309009 100644 --- a/aider/website/docs/leaderboards/index.md +++ b/aider/website/docs/leaderboards/index.md @@ -114,6 +114,6 @@ mod_dates = [get_last_modified_date(file) for file in files] latest_mod_date = max(mod_dates) cog.out(f"{latest_mod_date.strftime('%B %d, %Y.')}") ]]]--> -January 25, 2025. +January 28, 2025.

From b80a2b0bc2a0b3546ae81b3c1163cbbc9f8db2bc Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Tue, 28 Jan 2025 19:01:12 -0800 Subject: [PATCH 222/229] feat: Add Hyperbolic section with DeepSeek V3 configuration details --- .../_posts/2025-01-28-deepseek-down.md | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/aider/website/_posts/2025-01-28-deepseek-down.md b/aider/website/_posts/2025-01-28-deepseek-down.md index ef8215fc8..79e3ccb0a 100644 --- a/aider/website/_posts/2025-01-28-deepseek-down.md +++ b/aider/website/_posts/2025-01-28-deepseek-down.md @@ -106,6 +106,46 @@ Create a `.aider.model.settings.yml` file in your home directory or git project ``` +## Hyperbolic + +You can use [Hyperbolic's API](https://hyperbolic.xyz) as an OpenAI-compatible provider: + +```bash +# Set your API key using environment variables +export OPENAI_API_BASE=https://api.hyperbolic.xyz/v1/ +export OPENAI_API_KEY= +aider --model openai/deepseek-ai/DeepSeek-V3 + +# Or use the --api-key command line option +aider --model openai/deepseek-ai/DeepSeek-V3 --api-key openai= + +# Or add it to .aider.conf.yml in your home directory or project root: +api-key: + - openai= +``` + +Create a `.aider.model.settings.yml` file in your home directory or git project root with settings like this: + +```yaml +- name: openai/deepseek-ai/DeepSeek-V3 + edit_format: diff + weak_model_name: null + use_repo_map: true + send_undo_reply: false + lazy: false + reminder: sys + examples_as_sys_msg: true + cache_control: false + caches_by_default: true + use_system_prompt: true + use_temperature: true + streaming: true + editor_model_name: null + editor_edit_format: null + extra_params: + max_tokens: 65536 +``` + ## Ollama You can run [DeepSeek V3 via Ollama](https://ollama.com/library/deepseek-v3). From a7828809e915ea946c6b2cb19c400498f6a63607 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Tue, 28 Jan 2025 19:05:05 -0800 Subject: [PATCH 223/229] copy --- aider/website/_data/deepseek-down.yml | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/aider/website/_data/deepseek-down.yml b/aider/website/_data/deepseek-down.yml index c146ccfb8..75942a2e5 100644 --- a/aider/website/_data/deepseek-down.yml +++ b/aider/website/_data/deepseek-down.yml @@ -101,4 +101,30 @@ date: 2025-01-28 versions: 0.72.4.dev seconds_per_case: 472.5 + total_cost: 0.0000 + +- dirname: 2025-01-29-00-36-49--v3-hyperolic-diff + test_cases: 224 + model: Hyperbolic + edit_format: diff + commit_hash: 298f713 + pass_rate_1: 20.5 + pass_rate_2: 48.4 + pass_num_1: 46 + pass_num_2: 109 + percent_cases_well_formed: 97.3 + error_outputs: 29 + num_malformed_responses: 6 + num_with_malformed_responses: 6 + user_asks: 7 + lazy_comments: 0 + syntax_errors: 0 + indentation_errors: 0 + exhausted_context_windows: 0 + test_timeouts: 7 + total_tests: 225 + command: OPENAI_API_BASE=https://api.hyperbolic.xyz/v1/ aider --model openai/deepseek-ai/DeepSeek-V3 + date: 2025-01-29 + versions: 0.72.4.dev + seconds_per_case: 365.4 total_cost: 0.0000 \ No newline at end of file From f3f5f0f896c1b8e9a282beb33d1f9d7374b8e326 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Tue, 28 Jan 2025 19:05:53 -0800 Subject: [PATCH 224/229] docs: Remove total cost column from DeepSeek performance table --- aider/website/_posts/2025-01-28-deepseek-down.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/aider/website/_posts/2025-01-28-deepseek-down.md b/aider/website/_posts/2025-01-28-deepseek-down.md index 79e3ccb0a..90f864bc8 100644 --- a/aider/website/_posts/2025-01-28-deepseek-down.md +++ b/aider/website/_posts/2025-01-28-deepseek-down.md @@ -210,6 +210,8 @@ See [Advanced model settings](https://aider.chat/docs/config/adv-model-settings. ## Results +# remove the total cost column. ai! + From 70883d7fdc524b8c93beb86190e4bb95f416928b Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Tue, 28 Jan 2025 19:05:55 -0800 Subject: [PATCH 225/229] refactor: Remove total cost column from markdown table --- aider/website/_posts/2025-01-28-deepseek-down.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/aider/website/_posts/2025-01-28-deepseek-down.md b/aider/website/_posts/2025-01-28-deepseek-down.md index 90f864bc8..03d65d71c 100644 --- a/aider/website/_posts/2025-01-28-deepseek-down.md +++ b/aider/website/_posts/2025-01-28-deepseek-down.md @@ -210,7 +210,6 @@ See [Advanced model settings](https://aider.chat/docs/config/adv-model-settings. ## Results -# remove the total cost column. ai!
@@ -220,7 +219,6 @@ See [Advanced model settings](https://aider.chat/docs/config/adv-model-settings. - @@ -232,7 +230,6 @@ See [Advanced model settings](https://aider.chat/docs/config/adv-model-settings. - {% endfor %} From 1df2465222da6f465da287b81c120aa35e6841e6 Mon Sep 17 00:00:00 2001 From: Yu Zhang Date: Wed, 29 Jan 2025 15:18:59 +0900 Subject: [PATCH 226/229] Fix docs regarding extra_body --- aider/website/docs/config/adv-model-settings.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/aider/website/docs/config/adv-model-settings.md b/aider/website/docs/config/adv-model-settings.md index 58fa86bf1..7e8aa55a6 100644 --- a/aider/website/docs/config/adv-model-settings.md +++ b/aider/website/docs/config/adv-model-settings.md @@ -108,12 +108,13 @@ These settings will be merged with any model-specific settings, with the You need this chunk of yaml: ``` - extra_body: - reasoning_effort: high + extra_params: + extra_body: + reasoning_effort: high ``` This is a full entry for o1 with that setting, obtained by finding the default -entry in the list below and adding the above `extra_body` entry: +entry in the list below and adding the above `extra_params` entry: ``` - name: o1 @@ -132,8 +133,9 @@ entry in the list below and adding the above `extra_body` entry: streaming: false editor_model_name: gpt-4o editor_edit_format: editor-diff - extra_body: - reasoning_effort: high + extra_params: + extra_body: + reasoning_effort: high ``` ### Default model settings From 19e9e52c4f82245edb1e62a5a7a68a67d8c2c469 Mon Sep 17 00:00:00 2001 From: Yu Zhang Date: Wed, 29 Jan 2025 15:27:32 +0900 Subject: [PATCH 227/229] remove redundant `extra_params` --- aider/website/docs/config/adv-model-settings.md | 1 - 1 file changed, 1 deletion(-) diff --git a/aider/website/docs/config/adv-model-settings.md b/aider/website/docs/config/adv-model-settings.md index 7e8aa55a6..4cdbf345e 100644 --- a/aider/website/docs/config/adv-model-settings.md +++ b/aider/website/docs/config/adv-model-settings.md @@ -125,7 +125,6 @@ entry in the list below and adding the above `extra_params` entry: lazy: false reminder: user examples_as_sys_msg: false - extra_params: null cache_control: false caches_by_default: false use_system_prompt: true From c0cbb5c75d21601817045a3d220c07876ee37e49 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 29 Jan 2025 08:43:29 -0800 Subject: [PATCH 228/229] copy --- aider/website/_posts/2025-01-28-deepseek-down.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/aider/website/_posts/2025-01-28-deepseek-down.md b/aider/website/_posts/2025-01-28-deepseek-down.md index 03d65d71c..b3145ce93 100644 --- a/aider/website/_posts/2025-01-28-deepseek-down.md +++ b/aider/website/_posts/2025-01-28-deepseek-down.md @@ -19,9 +19,6 @@ Their [status page](https://status.deepseek.com) notes an ongoing incident. If you're affected by these issues, several alternative providers offer access to DeepSeek V3. This article compares their performance on aider's polyglot benchmark to help you choose a reliable alternative. -{: .note :} -This article is being updated as benchmark runs complete. - ## Providers {: .no_toc } From 74c8b381e6d826c7ef0ce8c235174fa981e3e835 Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Wed, 29 Jan 2025 08:43:53 -0800 Subject: [PATCH 229/229] copy --- aider/website/assets/sample-analytics.jsonl | 44 ++++++++++----------- aider/website/docs/faq.md | 6 +-- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/aider/website/assets/sample-analytics.jsonl b/aider/website/assets/sample-analytics.jsonl index cfb3c5118..680024c36 100644 --- a/aider/website/assets/sample-analytics.jsonl +++ b/aider/website/assets/sample-analytics.jsonl @@ -1,25 +1,3 @@ -{"event": "message_send", "properties": {"main_model": "deepseek/REDACTED", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 11198, "completion_tokens": 128, "total_tokens": 11326, "cost": 0.00643922, "total_cost": 0.02353834}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737423544} -{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737423847} -{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737423847} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737423852} -{"event": "repo", "properties": {"num_files": 427}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737423855} -{"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737423857} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737426234} -{"event": "repo", "properties": {"num_files": 427}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737426236} -{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737426236} -{"event": "ai-comments file-add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737426272} -{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737426272} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737426272} -{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-chat", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "diff", "prompt_tokens": 11196, "completion_tokens": 282, "total_tokens": 11478, "cost": 0.0016464000000000001, "total_cost": 0.0016464000000000001}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737426283} -{"event": "command_model", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737426294} -{"event": "command_ask", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737426308} -{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737426308} -{"event": "message_send", "properties": {"main_model": "deepseek/REDACTED", "weak_model": "deepseek/deepseek-chat", "editor_model": "deepseek/deepseek-chat", "edit_format": "ask", "prompt_tokens": 9247, "completion_tokens": 214, "total_tokens": 9461, "cost": 0.00555451, "total_cost": 0.0072009100000000005}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737426317} -{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737426334} -{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737426334} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737426447} -{"event": "model warning", "properties": {"main_model": "openai/REDACTED", "weak_model": "openai/REDACTED", "editor_model": "openai/REDACTED"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737426449} -{"event": "repo", "properties": {"num_files": 427}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737426453} {"event": "cli session", "properties": {"main_model": "openai/REDACTED", "weak_model": "openai/REDACTED", "editor_model": "openai/REDACTED", "edit_format": "whole"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737426453} {"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737426454} {"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1737426486} @@ -998,3 +976,25 @@ {"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738118663} {"event": "repo", "properties": {"num_files": 433}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738118665} {"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738118674} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738118899} +{"event": "gui session", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738118899} +{"event": "exit", "properties": {"reason": "GUI session ended"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738118899} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738119546} +{"event": "repo", "properties": {"num_files": 433}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738119548} +{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738119548} +{"event": "command_add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738119552} +{"event": "command_editor", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738119579} +{"event": "command_read-only", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738119655} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738119659} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 9456, "completion_tokens": 415, "total_tokens": 9871, "cost": 0.034593, "total_cost": 0.034593}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738119671} +{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738119727} +{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738119727} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738119940} +{"event": "repo", "properties": {"num_files": 433}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738119940} +{"event": "cli session", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738119940} +{"event": "ai-comments file-add", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738119942} +{"event": "ai-comments execute", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738119942} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738119942} +{"event": "message_send", "properties": {"main_model": "claude-3-5-sonnet-20241022", "weak_model": "claude-3-5-haiku-20241022", "editor_model": "claude-3-5-sonnet-20241022", "edit_format": "diff", "prompt_tokens": 9471, "completion_tokens": 333, "total_tokens": 9804, "cost": 0.033408, "total_cost": 0.033408}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738119952} +{"event": "command_exit", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738120000} +{"event": "exit", "properties": {"reason": "/exit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1738120000} diff --git a/aider/website/docs/faq.md b/aider/website/docs/faq.md index 734a73196..9d13a6486 100644 --- a/aider/website/docs/faq.md +++ b/aider/website/docs/faq.md @@ -249,9 +249,9 @@ tr:hover { background-color: #f5f5f5; }
Percent using correct edit format Command Edit formatTotal Cost
{{ row.percent_cases_well_formed }}% {{ row.command }} {{ row.edit_format }}{% if row.total_cost == 0 %}?{% else %}${{ row.total_cost | times: 1.0 | round: 2 }}{% endif %}
- - - + + +
Model NameTotal TokensPercent
claude-3-5-sonnet-20241022965,17449.1%
deepseek/deepseek-chat600,24430.5%
deepseek/REDACTED278,79714.2%
claude-3-5-sonnet-20241022984,84950.4%
deepseek/deepseek-chat588,76630.1%
deepseek/REDACTED258,01013.2%
deepseek/deepseek-reasoner40,5972.1%
claude-3-5-haiku-2024102230,1241.5%
ollama/REDACTED22,6411.2%