diff --git a/aider/__init__.py b/aider/__init__.py index be63f7136..362e01532 100644 --- a/aider/__init__.py +++ b/aider/__init__.py @@ -1,6 +1,6 @@ try: from aider.__version__ import __version__ except Exception: - __version__ = "0.62.1.dev" + __version__ = "0.62.2.dev" __all__ = [__version__] diff --git a/aider/coders/base_coder.py b/aider/coders/base_coder.py index 1beed7a45..2f42adfd6 100755 --- a/aider/coders/base_coder.py +++ b/aider/coders/base_coder.py @@ -13,7 +13,6 @@ import sys import threading import time import traceback -import webbrowser from collections import defaultdict from datetime import datetime from json.decoder import JSONDecodeError @@ -23,6 +22,7 @@ from typing import List from aider import __version__, models, prompts, urls, utils from aider.analytics import Analytics from aider.commands import Commands +from aider.exceptions import LiteLLMExceptions from aider.history import ChatSummary from aider.io import ConfirmGroup, InputOutput from aider.linter import Linter @@ -30,7 +30,7 @@ from aider.llm import litellm from aider.repo import ANY_GIT_ERROR, GitRepo from aider.repomap import RepoMap from aider.run_cmd import run_cmd -from aider.sendchat import RETRY_TIMEOUT, retry_exceptions, send_completion +from aider.sendchat import RETRY_TIMEOUT, send_completion from aider.utils import format_content, format_messages, format_tokens, is_image_file from ..dump import dump # noqa: F401 @@ -790,34 +790,9 @@ class Coder: self.num_reflections += 1 message = self.reflected_message - def check_and_open_urls(self, exc: Exception) -> List[str]: - import openai - + def check_and_open_urls(self, exc, friendly_msg=None): """Check exception for URLs, offer to open in a browser, with user-friendly error msgs.""" text = str(exc) - friendly_msg = None - - if isinstance(exc, (openai.APITimeoutError, openai.APIConnectionError)): - friendly_msg = ( - "There is a problem connecting to the API provider. Please try again later or check" - " your model settings." - ) - elif isinstance(exc, openai.RateLimitError): - friendly_msg = ( - "The API provider's rate limits have been exceeded. Check with your provider or" - " wait awhile and retry." - ) - elif isinstance(exc, openai.InternalServerError): - friendly_msg = ( - "The API provider seems to be down or overloaded. Please try again later." - ) - elif isinstance(exc, openai.BadRequestError): - friendly_msg = "The API provider refused the request as invalid?" - elif isinstance(exc, openai.AuthenticationError): - friendly_msg = ( - "The API provider refused your authentication. Please check that you are using a" - " valid API key." - ) if friendly_msg: self.io.tool_warning(text) @@ -829,8 +804,7 @@ class Coder: urls = list(set(url_pattern.findall(text))) # Use set to remove duplicates for url in urls: url = url.rstrip(".',\"") - if self.io.confirm_ask("Open URL for more info about this error?", subject=url): - webbrowser.open(url) + self.io.offer_url(url) return urls def check_for_urls(self, inp: str) -> List[str]: @@ -1154,8 +1128,6 @@ class Coder: return chunks def send_message(self, inp): - import openai # for error codes below - self.cur_messages += [ dict(role="user", content=inp), ] @@ -1175,6 +1147,8 @@ class Coder: retry_delay = 0.125 + litellm_ex = LiteLLMExceptions() + self.usage_report = None exhausted = False interrupted = False @@ -1183,30 +1157,37 @@ class Coder: try: yield from self.send(messages, functions=self.functions) break - except retry_exceptions() as err: - # Print the error and its base classes - # for cls in err.__class__.__mro__: dump(cls.__name__) + except litellm_ex.exceptions_tuple() as err: + ex_info = litellm_ex.get_ex_info(err) - retry_delay *= 2 - if retry_delay > RETRY_TIMEOUT: - self.mdstream = None - self.check_and_open_urls(err) + if ex_info.name == "ContextWindowExceededError": + exhausted = True break + + should_retry = ex_info.retry + if should_retry: + retry_delay *= 2 + if retry_delay > RETRY_TIMEOUT: + should_retry = False + + if not should_retry: + self.mdstream = None + self.check_and_open_urls(err, ex_info.description) + break + err_msg = str(err) - self.io.tool_error(err_msg) + if ex_info.description: + self.io.tool_warning(err_msg) + self.io.tool_error(ex_info.description) + else: + self.io.tool_error(err_msg) + self.io.tool_output(f"Retrying in {retry_delay:.1f} seconds...") time.sleep(retry_delay) continue except KeyboardInterrupt: interrupted = True break - except litellm.ContextWindowExceededError: - # The input is overflowing the context window! - exhausted = True - break - except litellm.exceptions.BadRequestError as br_err: - self.io.tool_error(f"BadRequestError: {br_err}") - return except FinishReasonLength: # We hit the output limit! if not self.main_model.info.get("supports_assistant_prefill"): @@ -1221,12 +1202,8 @@ class Coder: messages.append( dict(role="assistant", content=self.multi_response_content, prefix=True) ) - except (openai.APIError, openai.APIStatusError) as err: - # for cls in err.__class__.__mro__: dump(cls.__name__) - self.mdstream = None - self.check_and_open_urls(err) - break except Exception as err: + self.mdstream = None lines = traceback.format_exception(type(err), err, err.__traceback__) self.io.tool_warning("".join(lines)) self.io.tool_error(str(err)) @@ -1374,11 +1351,9 @@ class Coder: res.append("- Use /clear to clear the chat history.") res.append("- Break your code into smaller source files.") - res.append("") - res.append(f"For more info: {urls.token_limits}") - res = "".join([line + "\n" for line in res]) self.io.tool_error(res) + self.io.offer_url(urls.token_limits) def lint_edited(self, fnames): res = "" diff --git a/aider/coders/editblock_coder.py b/aider/coders/editblock_coder.py index 316205e72..ecd94e47a 100644 --- a/aider/coders/editblock_coder.py +++ b/aider/coders/editblock_coder.py @@ -52,7 +52,10 @@ class EditBlockCoder(Coder): content = self.io.read_text(full_path) new_content = do_replace(full_path, content, original, updated, self.fence) - if not new_content: + # If the edit failed, and + # this is not a "create a new file" with an empty original... + # https://github.com/Aider-AI/aider/issues/2258 + if not new_content and original.strip(): # try patching any of the other files in the chat for full_path in self.abs_fnames: content = self.io.read_text(full_path) diff --git a/aider/exceptions.py b/aider/exceptions.py new file mode 100644 index 000000000..73a88cc9c --- /dev/null +++ b/aider/exceptions.py @@ -0,0 +1,76 @@ +from dataclasses import dataclass + + +@dataclass +class ExInfo: + name: str + retry: bool + description: str + + +EXCEPTIONS = [ + ExInfo("APIConnectionError", True, None), + ExInfo("APIError", True, None), + ExInfo("APIResponseValidationError", True, None), + ExInfo( + "AuthenticationError", + False, + "The API provider is not able to authenticate you. Check your API key.", + ), + ExInfo("AzureOpenAIError", True, None), + ExInfo("BadRequestError", False, None), + ExInfo("BudgetExceededError", True, None), + ExInfo( + "ContentPolicyViolationError", + True, + "The API provider has refused the request due to a safety policy about the content.", + ), + ExInfo("ContextWindowExceededError", False, None), # special case handled in base_coder + ExInfo("InternalServerError", True, "The API provider's servers are down or overloaded."), + ExInfo("InvalidRequestError", True, None), + ExInfo("JSONSchemaValidationError", True, None), + ExInfo("NotFoundError", False, None), + ExInfo("OpenAIError", True, None), + ExInfo( + "RateLimitError", + True, + "The API provider has rate limited you. Try again later or check your quotas.", + ), + ExInfo("RouterRateLimitError", True, None), + ExInfo("ServiceUnavailableError", True, "The API provider's servers are down or overloaded."), + ExInfo("UnprocessableEntityError", True, None), + ExInfo("UnsupportedParamsError", True, None), +] + + +class LiteLLMExceptions: + exceptions = dict() + + def __init__(self): + self._load() + + def _load(self, strict=False): + import litellm + + for var in dir(litellm): + if not var.endswith("Error"): + continue + + ex_info = None + for exi in EXCEPTIONS: + if var == exi.name: + ex_info = exi + break + + if strict and not ex_info: + raise ValueError(f"{var} is in litellm but not in aider's exceptions list") + + ex = getattr(litellm, var) + self.exceptions[ex] = ex_info + + def exceptions_tuple(self): + return tuple(self.exceptions) + + def get_ex_info(self, ex): + """Return the ExInfo for a given exception instance""" + return self.exceptions.get(ex.__class__, ExInfo(None, None, None)) diff --git a/aider/io.py b/aider/io.py index 67c5c3548..b6bcab3ee 100644 --- a/aider/io.py +++ b/aider/io.py @@ -1,6 +1,7 @@ import base64 import os import threading +import webbrowser from collections import defaultdict from dataclasses import dataclass from datetime import datetime @@ -532,6 +533,15 @@ class InputOutput: hist = "\n" + content.strip() + "\n\n" self.append_chat_history(hist) + def offer_url(self, url, prompt="Open URL for more info?"): + """Offer to open a URL in the browser, returns True if opened.""" + if url in self.never_prompts: + return False + if self.confirm_ask(prompt, subject=url, allow_never=True): + webbrowser.open(url) + return True + return False + def confirm_ask( self, question, diff --git a/aider/main.py b/aider/main.py index 514393164..179d4560f 100644 --- a/aider/main.py +++ b/aider/main.py @@ -5,7 +5,6 @@ import re import sys import threading import traceback -import webbrowser from pathlib import Path import git @@ -367,8 +366,7 @@ def sanity_check_repo(repo, io): io.tool_error("Aider only works with git repos with version number 1 or 2.") io.tool_output("You may be able to convert your repo: git update-index --index-version=2") io.tool_output("Or run aider --no-git to proceed without using git.") - if io.confirm_ask("Open documentation url for more info?", subject=urls.git_index_version): - webbrowser.open(urls.git_index_version) + io.offer_url(urls.git_index_version, "Open documentation url for more info?") return False io.tool_error("Unable to read git repository, it may be corrupt?") @@ -641,10 +639,7 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F io.tool_output("You can skip this check with --no-show-model-warnings") try: - if io.confirm_ask( - "Open documentation url for more info?", subject=urls.model_warnings - ): - webbrowser.open(urls.model_warnings) + io.offer_url(urls.model_warnings, "Open documentation url for more info?") io.tool_output() except KeyboardInterrupt: return 1 @@ -869,10 +864,7 @@ def check_and_load_imports(io, verbose=False): except Exception as err: io.tool_error(str(err)) io.tool_output("Error loading required imports. Did you install aider properly?") - if io.confirm_ask( - "Open documentation url for more info?", subject=urls.install_properly - ): - webbrowser.open(urls.install_properly) + io.offer_url(urls.install_properly, "Open documentation url for more info?") sys.exit(1) diff --git a/aider/models.py b/aider/models.py index bc0fac898..95a4483a0 100644 --- a/aider/models.py +++ b/aider/models.py @@ -234,24 +234,24 @@ MODEL_SETTINGS = [ ModelSettings( "claude-3-opus-20240229", "diff", - weak_model_name="claude-3-haiku-20240307", + 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-haiku", + weak_model_name="openrouter/anthropic/claude-3-5-haiku", use_repo_map=True, ), ModelSettings( "claude-3-sonnet-20240229", "whole", - weak_model_name="claude-3-haiku-20240307", + weak_model_name="claude-3-5-haiku-20241022", ), ModelSettings( "claude-3-5-sonnet-20240620", "diff", - weak_model_name="claude-3-haiku-20240307", + 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, @@ -268,7 +268,7 @@ MODEL_SETTINGS = [ ModelSettings( "anthropic/claude-3-5-sonnet-20240620", "diff", - weak_model_name="anthropic/claude-3-haiku-20240307", + 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, @@ -285,7 +285,7 @@ MODEL_SETTINGS = [ ModelSettings( "anthropic/claude-3-5-sonnet-20241022", "diff", - weak_model_name="anthropic/claude-3-haiku-20240307", + 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, @@ -299,10 +299,27 @@ MODEL_SETTINGS = [ 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-haiku-20240307", + 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, @@ -319,7 +336,7 @@ MODEL_SETTINGS = [ ModelSettings( "claude-3-5-sonnet-20241022", "diff", - weak_model_name="claude-3-haiku-20240307", + 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, @@ -349,6 +366,19 @@ MODEL_SETTINGS = [ "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, @@ -360,6 +390,7 @@ MODEL_SETTINGS = [ "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": { @@ -372,28 +403,11 @@ MODEL_SETTINGS = [ "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( - "openrouter/anthropic/claude-3.5-haiku", - "diff", - weak_model_name="openrouter/anthropic/claude-3.5-haiku", - extra_params={ - "max_tokens": 4096, - }, - cache_control=True, - ), - ModelSettings( - "openrouter/anthropic/claude-3.5-haiku:beta", - "diff", - weak_model_name="openrouter/anthropic/claude-3.5-haiku:beta", - extra_params={ - "max_tokens": 4096, - }, - cache_control=True, - ), ModelSettings( "claude-3-haiku-20240307", "whole", @@ -409,7 +423,7 @@ MODEL_SETTINGS = [ ModelSettings( "openrouter/anthropic/claude-3.5-sonnet", "diff", - weak_model_name="openrouter/anthropic/claude-3-haiku", + 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, @@ -423,7 +437,7 @@ MODEL_SETTINGS = [ ModelSettings( "openrouter/anthropic/claude-3.5-sonnet:beta", "diff", - weak_model_name="openrouter/anthropic/claude-3-haiku:beta", + 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, @@ -439,7 +453,7 @@ MODEL_SETTINGS = [ ModelSettings( "vertex_ai/claude-3-5-sonnet@20240620", "diff", - weak_model_name="vertex_ai/claude-3-haiku@20240307", + 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, @@ -452,7 +466,7 @@ MODEL_SETTINGS = [ ModelSettings( "vertex_ai/claude-3-5-sonnet-v2@20241022", "diff", - weak_model_name="vertex_ai/claude-3-haiku@20240307", + 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, @@ -465,13 +479,13 @@ MODEL_SETTINGS = [ ModelSettings( "vertex_ai/claude-3-opus@20240229", "diff", - weak_model_name="vertex_ai/claude-3-haiku@20240307", + 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-haiku@20240307", + weak_model_name="vertex_ai/claude-3-5-haiku@20241022", ), # Cohere ModelSettings( diff --git a/aider/repomap.py b/aider/repomap.py index 12bd40b75..0ec4f710a 100644 --- a/aider/repomap.py +++ b/aider/repomap.py @@ -28,7 +28,7 @@ from tree_sitter_languages import get_language, get_parser # noqa: E402 Tag = namedtuple("Tag", "rel_fname fname line name kind".split()) -SQLITE_ERRORS = (sqlite3.OperationalError, sqlite3.DatabaseError) +SQLITE_ERRORS = (sqlite3.OperationalError, sqlite3.DatabaseError, OSError) class RepoMap: @@ -197,7 +197,7 @@ class RepoMap: self.TAGS_CACHE = new_cache return - except (SQLITE_ERRORS, OSError) as e: + except SQLITE_ERRORS as e: # If anything goes wrong, warn and fall back to dict self.io.tool_warning( f"Unable to use tags cache at {path}, falling back to memory cache" @@ -368,6 +368,8 @@ class RepoMap: showing_bar = False for fname in fnames: + if self.verbose: + self.io.tool_output(f"Processing {fname}") if progress and not showing_bar: progress() diff --git a/aider/sendchat.py b/aider/sendchat.py index e82e0d8fe..e4b8bd7bf 100644 --- a/aider/sendchat.py +++ b/aider/sendchat.py @@ -2,9 +2,8 @@ import hashlib import json import time -import backoff - from aider.dump import dump # noqa: F401 +from aider.exceptions import LiteLLMExceptions from aider.llm import litellm # from diskcache import Cache @@ -17,52 +16,6 @@ CACHE = None RETRY_TIMEOUT = 60 -def retry_exceptions(): - import httpx - import openai - - return ( - # httpx - httpx.ConnectError, - httpx.RemoteProtocolError, - httpx.ReadTimeout, - # - # litellm exceptions inherit from openai exceptions - # https://docs.litellm.ai/docs/exception_mapping - # - # openai.BadRequestError, - # litellm.ContextWindowExceededError, - # litellm.ContentPolicyViolationError, - # - # openai.AuthenticationError, - # openai.PermissionDeniedError, - # openai.NotFoundError, - # - openai.APITimeoutError, - openai.UnprocessableEntityError, - openai.RateLimitError, - openai.APIConnectionError, - # openai.APIError, - # openai.APIStatusError, - openai.InternalServerError, - ) - - -def lazy_litellm_retry_decorator(func): - def wrapper(*args, **kwargs): - decorated_func = backoff.on_exception( - backoff.expo, - retry_exceptions(), - max_time=RETRY_TIMEOUT, - on_backoff=lambda details: print( - f"{details.get('exception', 'Exception')}\nRetry in {details['wait']:.1f} seconds." - ), - )(func) - return decorated_func(*args, **kwargs) - - return wrapper - - def send_completion( model_name, messages, @@ -104,6 +57,8 @@ def send_completion( def simple_send_with_retries(model_name, messages, extra_params=None): + litellm_ex = LiteLLMExceptions() + retry_delay = 0.125 while True: try: @@ -117,11 +72,22 @@ def simple_send_with_retries(model_name, messages, extra_params=None): _hash, response = send_completion(**kwargs) return response.choices[0].message.content - except retry_exceptions() as err: + except litellm_ex.exceptions_tuple() as err: + ex_info = litellm_ex.get_ex_info(err) + print(str(err)) - retry_delay *= 2 - if retry_delay > RETRY_TIMEOUT: + if ex_info.description: + print(ex_info.description) + + should_retry = ex_info.retry + if should_retry: + retry_delay *= 2 + if retry_delay > RETRY_TIMEOUT: + should_retry = False + + if not should_retry: break + print(f"Retrying in {retry_delay:.1f} seconds...") time.sleep(retry_delay) continue diff --git a/aider/website/_data/edit_leaderboard.yml b/aider/website/_data/edit_leaderboard.yml index d247002a1..09d84630c 100644 --- a/aider/website/_data/edit_leaderboard.yml +++ b/aider/website/_data/edit_leaderboard.yml @@ -20,7 +20,7 @@ versions: 0.30.2-dev seconds_per_case: 32.4 total_cost: 13.8395 - + - dirname: 2024-03-06-16-42-00--claude3-sonnet-whole test_cases: 133 model: claude-3-sonnet-20240229 @@ -43,7 +43,7 @@ versions: 0.25.1-dev seconds_per_case: 23.1 total_cost: 0.0000 - + - dirname: 2024-05-03-20-47-24--gemini-1.5-pro-diff-fenced test_cases: 133 model: gemini-1.5-pro-latest @@ -88,7 +88,7 @@ versions: 0.33.1-dev seconds_per_case: 6.5 total_cost: 0.5032 - + - dirname: 2023-11-06-21-23-59--gpt-3.5-turbo-0301 test_cases: 133 model: gpt-3.5-turbo-0301 @@ -111,7 +111,7 @@ versions: 0.16.4-dev seconds_per_case: 6.5 total_cost: 0.4822 - + - dirname: 2023-11-07-02-41-07--gpt-3.5-turbo-0613 test_cases: 133 model: gpt-3.5-turbo-0613 @@ -155,7 +155,7 @@ versions: 0.30.2-dev seconds_per_case: 5.3 total_cost: 0.3261 - + - dirname: 2024-01-25-23-37-15--jan-exercism-gpt-4-0125-preview-udiff test_cases: 133 model: gpt-4-0125-preview @@ -178,7 +178,7 @@ versions: 0.22.1-dev seconds_per_case: 44.8 total_cost: 14.6428 - + - dirname: 2024-05-04-15-07-30--redo-gpt-4-0314-diff-reminder-rules test_cases: 133 model: gpt-4-0314 @@ -201,7 +201,7 @@ versions: 0.31.2-dev seconds_per_case: 19.8 total_cost: 16.2689 - + - dirname: 2023-12-16-21-24-28--editblock-gpt-4-0613-actual-main test_cases: 133 model: gpt-4-0613 @@ -228,7 +228,7 @@ - dirname: 2024-05-08-21-16-03--may-gpt-4-1106-preview-udiff test_cases: 133 model: gpt-4-1106-preview - released: 2023-11-06 + released: 2023-11-06 edit_format: udiff commit_hash: 87664dc pass_rate_1: 51.9 @@ -247,7 +247,7 @@ versions: 0.33.1-dev seconds_per_case: 20.4 total_cost: 6.6061 - + - dirname: 2024-05-01-02-09-20--gpt-4-turbo-examples test_cases: 133 model: gpt-4-turbo-2024-04-09 (udiff) @@ -270,7 +270,7 @@ versions: 0.30.2-dev seconds_per_case: 22.8 total_cost: 6.3337 - + - dirname: 2024-05-03-22-24-48--openrouter--llama3-diff-examples-sys-msg test_cases: 132 model: llama3-70b-8192 @@ -293,7 +293,7 @@ versions: 0.31.2-dev seconds_per_case: 14.5 total_cost: 0.4311 - + - dirname: 2024-05-06-18-31-08--command-r-plus-whole-final test_cases: 133 model: command-r-plus @@ -316,11 +316,11 @@ versions: 0.31.2-dev seconds_per_case: 22.9 total_cost: 2.7494 - + - dirname: 2024-05-07-20-32-37--qwen1.5-110b-chat-whole test_cases: 133 model: qwen1.5-110b-chat - released: 2024-02-04 + released: 2024-02-04 edit_format: whole commit_hash: 70b1c0c pass_rate_1: 30.8 @@ -339,7 +339,7 @@ versions: 0.31.2-dev seconds_per_case: 46.9 total_cost: 0.0000 - + - dirname: 2024-05-07-20-57-04--wizardlm-2-8x22b-whole test_cases: 133 model: WizardLM-2 8x22B @@ -384,7 +384,7 @@ versions: 0.34.1-dev seconds_per_case: 6.0 total_cost: 0.0000 - + - dirname: 2024-04-12-22-18-20--gpt-4-turbo-2024-04-09-plain-diff test_cases: 33 model: gpt-4-turbo-2024-04-09 (diff) @@ -568,7 +568,7 @@ versions: 0.42.1-dev seconds_per_case: 17.6 total_cost: 3.6346 - + - dirname: 2024-07-01-21-41-48--haiku-whole test_cases: 133 model: claude-3-haiku-20240307 @@ -1131,7 +1131,7 @@ versions: 0.56.1.dev seconds_per_case: 80.9 total_cost: 63.9190 - + - dirname: 2024-09-19-16-58-29--qwen2.5-coder:7b-instruct-q8_0 test_cases: 133 model: qwen2.5-coder:7b-instruct-q8_0 @@ -1154,7 +1154,7 @@ versions: 0.56.0 seconds_per_case: 9.3 total_cost: 0.0000 - + - dirname: 2024-09-20-20-20-19--qwen-2.5-72b-instruct-diff test_cases: 133 model: qwen-2.5-72b-instruct (bf16) @@ -1458,7 +1458,7 @@ versions: 0.58.1.dev seconds_per_case: 63.7 total_cost: 0.0000 - + - dirname: 2024-10-01-16-50-09--hermes3-whole-4 test_cases: 133 model: ollama/hermes3 @@ -1633,4 +1633,27 @@ date: 2024-11-04 versions: 0.61.1.dev seconds_per_case: 18.4 - total_cost: 0.0000 \ No newline at end of file + total_cost: 0.0000 + +- dirname: 2024-11-07-06-15-36--Qwen2.5.1-Coder-7B-Instruct-GGUF:Q8_0-32k-whole + test_cases: 133 + model: ollama/Qwen2.5.1-Coder-7B-Instruct-GGUF:Q8_0-32k + edit_format: whole + commit_hash: e76704e + pass_rate_1: 52.6 + pass_rate_2: 63.9 + percent_cases_well_formed: 100.0 + error_outputs: 0 + num_malformed_responses: 0 + num_with_malformed_responses: 0 + user_asks: 4 + lazy_comments: 0 + syntax_errors: 0 + indentation_errors: 0 + exhausted_context_windows: 0 + test_timeouts: 1 + command: aider --model ollama/Qwen2.5.1-Coder-7B-Instruct-GGUF:Q8_0-32k + date: 2024-11-07 + versions: 0.59.2.dev + seconds_per_case: 18.2 + total_cost: 0.0000 diff --git a/aider/website/_includes/blame.md b/aider/website/_includes/blame.md index 5c1866b47..3973ea812 100644 --- a/aider/website/_includes/blame.md +++ b/aider/website/_includes/blame.md @@ -1,5 +1,5 @@ - + diff --git a/aider/website/assets/sample-analytics.jsonl b/aider/website/assets/sample-analytics.jsonl index 9c1b66864..cf09949b6 100644 --- a/aider/website/assets/sample-analytics.jsonl +++ b/aider/website/assets/sample-analytics.jsonl @@ -483,3 +483,138 @@ {"event": "cli session", "properties": {"main_model": "openrouter/REDACTED", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "openrouter/REDACTED", "edit_format": "whole", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730754176} {"event": "message_send", "properties": {"main_model": "openrouter/REDACTED", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "openrouter/REDACTED", "edit_format": "whole", "prompt_tokens": 593, "completion_tokens": 53, "total_tokens": 646, "cost": 0.000858, "total_cost": 0.000858, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730754179} {"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730818364} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730818452} +{"event": "gui session", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730818452} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730818654} +{"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", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730818656} +{"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": 4733, "completion_tokens": 745, "total_tokens": 5478, "cost": 0.025374, "total_cost": 0.025374, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730818718} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.61.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730818841} +{"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", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.61.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730818842} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730818882} +{"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", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730818884} +{"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": 4657, "completion_tokens": 83, "total_tokens": 4740, "cost": 0.015216, "total_cost": 0.015216, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730818900} +{"event": "command_add", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730818904} +{"event": "command_clear", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730818907} +{"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": 5113, "completion_tokens": 1484, "total_tokens": 6597, "cost": 0.037599, "total_cost": 0.052815, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730818940} +{"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": 6654, "completion_tokens": 435, "total_tokens": 7089, "cost": 0.026487, "total_cost": 0.079302, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730819050} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730825144} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730825234} +{"event": "cli session", "properties": {"main_model": "gpt-4o-mini", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "gpt-4o-mini", "edit_format": "whole", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730825235} +{"event": "message_send", "properties": {"main_model": "gpt-4o-mini", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "gpt-4o-mini", "edit_format": "whole", "prompt_tokens": 674, "completion_tokens": 23, "total_tokens": 697, "cost": 0.00011489999999999999, "total_cost": 0.00011489999999999999, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730825238} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730825250} +{"event": "cli session", "properties": {"main_model": "None", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "None", "edit_format": "diff", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730825252} +{"event": "message_send", "properties": {"main_model": "None", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "None", "edit_format": "diff", "prompt_tokens": 2185, "completion_tokens": 56, "total_tokens": 2241, "cost": 0.0024649999999999997, "total_cost": 0.0024649999999999997, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730825255} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730825273} +{"event": "cli session", "properties": {"main_model": "None", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "None", "edit_format": "diff", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730825275} +{"event": "message_send", "properties": {"main_model": "None", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "None", "edit_format": "diff", "prompt_tokens": 4601, "completion_tokens": 0, "total_tokens": 4601, "cost": 0.004601, "total_cost": 0.004601, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730825277} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730825280} +{"event": "command_reset", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730825329} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730825344} +{"event": "gui session", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730825345} +{"event": "command_add", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730825356} +{"event": "command_add", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730825371} +{"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": 12023, "completion_tokens": 494, "total_tokens": 12517, "cost": 0.043479000000000004, "total_cost": 0.122781, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730825392} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730825584} +{"event": "model warning", "properties": {"main_model": "openrouter/REDACTED", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "openrouter/REDACTED", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730825586} +{"event": "cli session", "properties": {"main_model": "openrouter/REDACTED", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "openrouter/REDACTED", "edit_format": "diff", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730825588} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730825603} +{"event": "message_send", "properties": {"main_model": "openrouter/REDACTED", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "openrouter/REDACTED", "edit_format": "whole", "prompt_tokens": 406, "completion_tokens": 57, "total_tokens": 463, "cost": 0.000691, "total_cost": 0.000691, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730825607} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730825613} +{"event": "message_send", "properties": {"main_model": "openrouter/anthropic/claude-3.5-sonnet", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "openrouter/anthropic/claude-3.5-sonnet", "edit_format": "diff", "prompt_tokens": 4608, "completion_tokens": 52, "total_tokens": 4660, "cost": 0.014603999999999999, "total_cost": 0.014603999999999999, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730825618} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730825641} +{"event": "model warning", "properties": {"main_model": "openrouter/REDACTED", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "openrouter/REDACTED", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730825643} +{"event": "message_send", "properties": {"main_model": "openrouter/REDACTED", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "openrouter/REDACTED", "edit_format": "whole", "prompt_tokens": 406, "completion_tokens": 79, "total_tokens": 485, "cost": 0.0, "total_cost": 0.0, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730825648} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730825746} +{"event": "model warning", "properties": {"main_model": "openrouter/REDACTED", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "openrouter/REDACTED", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730825748} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730825774} +{"event": "model warning", "properties": {"main_model": "openrouter/REDACTED", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "openrouter/REDACTED", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730825775} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730826090} +{"event": "command_reset", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730826167} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730826833} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730826902} +{"event": "gui session", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730826902} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730835152} +{"event": "cli session", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730835155} +{"event": "message_send", "properties": {"main_model": "deepseek/deepseek-coder", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "deepseek/deepseek-coder", "edit_format": "diff", "prompt_tokens": 4613, "completion_tokens": 147, "total_tokens": 4760, "cost": 0.0006869800000000001, "total_cost": 0.0006869800000000001, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730835165} +{"event": "command_add", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730835605} +{"event": "command_add", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730835621} +{"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": 7077, "completion_tokens": 131, "total_tokens": 7208, "cost": 0.023196, "total_cost": 0.145977, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730835629} +{"event": "command_reset", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730835647} +{"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": 4650, "completion_tokens": 79, "total_tokens": 4729, "cost": 0.015135000000000001, "total_cost": 0.161112, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730835652} +{"event": "command_add", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730835659} +{"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": 7216, "completion_tokens": 202, "total_tokens": 7418, "cost": 0.024678000000000002, "total_cost": 0.18579, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730835666} +{"event": "command_reset", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730835725} +{"event": "command_add", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730835729} +{"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": 7091, "completion_tokens": 179, "total_tokens": 7270, "cost": 0.023958, "total_cost": 0.20974800000000002, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730835748} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730835777} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730835846} +{"event": "gui session", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730835846} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730836461} +{"event": "command_reset", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730836569} +{"event": "command_reset", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730836572} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730837470} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730837568} +{"event": "gui session", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730837568} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730839181} +{"event": "gui session", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730839182} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730839281} +{"event": "gui session", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730839282} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730850606} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730850628} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730850671} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730952885} +{"event": "gui session", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1730952886} +{"event": "command_add", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731003938} +{"event": "command_add", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731003955} +{"event": "command_add", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731003977} +{"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": 22688, "completion_tokens": 350, "total_tokens": 23038, "cost": 0.073314, "total_cost": 0.28306200000000004, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731003989} +{"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": 23909, "completion_tokens": 208, "total_tokens": 24117, "cost": 0.074847, "total_cost": 0.35790900000000003, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731004012} +{"event": "command_add", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731004099} +{"event": "command_add", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731004134} +{"event": "command_drop", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731004203} +{"event": "command_add", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731004216} +{"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": 11315, "completion_tokens": 297, "total_tokens": 11612, "cost": 0.038400000000000004, "total_cost": 0.396309, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731004236} +{"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": 11339, "completion_tokens": 84, "total_tokens": 11423, "cost": 0.035276999999999996, "total_cost": 0.431586, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731007380} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731007384} +{"event": "model warning", "properties": {"main_model": "None", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "None", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731007387} +{"event": "cli session", "properties": {"main_model": "None", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "None", "edit_format": "whole", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731007391} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731007412} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731007458} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731007531} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731007542} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731007602} +{"event": "cli session", "properties": {"main_model": "gpt-4o-2024-08-06", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "gpt-4o-2024-08-06", "edit_format": "diff", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731007604} +{"event": "message_send", "properties": {"main_model": "gpt-4o-2024-08-06", "weak_model": "claude-3-5-sonnet-20241022", "editor_model": "gpt-4o-2024-08-06", "edit_format": "diff", "prompt_tokens": 4630, "completion_tokens": 12, "total_tokens": 4642, "cost": 0.011695, "total_cost": 0.011695, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731007609} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731007614} +{"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", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731007616} +{"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": 4637, "completion_tokens": 89, "total_tokens": 4726, "cost": 0.015246, "total_cost": 0.015246, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731007620} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731007631} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731007654} +{"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", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731007655} +{"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": 2175, "completion_tokens": 75, "total_tokens": 2250, "cost": 0.0076500000000000005, "total_cost": 0.0076500000000000005, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731007660} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731007674} +{"event": "command_add", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731007733} +{"event": "command_drop", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731008017} +{"event": "command_reset", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731008018} +{"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": 4609, "completion_tokens": 118, "total_tokens": 4727, "cost": 0.015597000000000001, "total_cost": 0.44718300000000005, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731008044} +{"event": "command_reset", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731008050} +{"event": "command_add", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731008053} +{"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": 9093, "completion_tokens": 174, "total_tokens": 9267, "cost": 0.029889000000000002, "total_cost": 0.47707200000000005, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731008063} +{"event": "command_ask", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731008066} +{"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": "ask", "prompt_tokens": 7163, "completion_tokens": 149, "total_tokens": 7312, "cost": 0.023724000000000002, "total_cost": 0.500796, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731008071} +{"event": "command_add", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731008091} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731008122} +{"event": "command_add", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731008124} +{"event": "command_add", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731008125} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731008135} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731008162} +{"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", "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731008163} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731008178} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731008738} +{"event": "gui session", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731008738} +{"event": "command_reset", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731008808} +{"event": "command_add", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731008815} +{"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": 4879, "completion_tokens": 279, "total_tokens": 5158, "cost": 0.018822000000000002, "total_cost": 0.519618, "python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.1.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731008851} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731008891} +{"event": "launched", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731008957} +{"event": "gui session", "properties": {"python_version": "3.12.6", "os_platform": "Darwin", "os_release": "23.6.0", "machine": "x86_64", "aider_version": "0.62.2.dev"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1731008958} diff --git a/aider/website/docs/config/adv-model-settings.md b/aider/website/docs/config/adv-model-settings.md index 7ffcb5bca..d6b710894 100644 --- a/aider/website/docs/config/adv-model-settings.md +++ b/aider/website/docs/config/adv-model-settings.md @@ -400,7 +400,7 @@ cog.out("```\n") use_repo_map: true use_system_prompt: true use_temperature: true - weak_model_name: claude-3-haiku-20240307 + weak_model_name: claude-3-5-haiku-20241022 - cache_control: false caches_by_default: false edit_format: diff @@ -416,7 +416,7 @@ cog.out("```\n") use_repo_map: true use_system_prompt: true use_temperature: true - weak_model_name: openrouter/anthropic/claude-3-haiku + weak_model_name: openrouter/anthropic/claude-3-5-haiku - cache_control: false caches_by_default: false edit_format: whole @@ -432,7 +432,7 @@ cog.out("```\n") use_repo_map: false use_system_prompt: true use_temperature: true - weak_model_name: claude-3-haiku-20240307 + weak_model_name: claude-3-5-haiku-20241022 - cache_control: true caches_by_default: false edit_format: diff @@ -451,7 +451,7 @@ cog.out("```\n") use_repo_map: true use_system_prompt: true use_temperature: true - weak_model_name: claude-3-haiku-20240307 + weak_model_name: claude-3-5-haiku-20241022 - cache_control: true caches_by_default: false edit_format: diff @@ -470,7 +470,7 @@ cog.out("```\n") use_repo_map: true use_system_prompt: true use_temperature: true - weak_model_name: anthropic/claude-3-haiku-20240307 + weak_model_name: anthropic/claude-3-5-haiku-20241022 - cache_control: true caches_by_default: false edit_format: diff @@ -489,7 +489,26 @@ cog.out("```\n") use_repo_map: true use_system_prompt: true use_temperature: true - weak_model_name: anthropic/claude-3-haiku-20240307 + 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 + 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 @@ -508,7 +527,7 @@ cog.out("```\n") use_repo_map: true use_system_prompt: true use_temperature: true - weak_model_name: anthropic/claude-3-haiku-20240307 + weak_model_name: anthropic/claude-3-5-haiku-20241022 - cache_control: true caches_by_default: false edit_format: diff @@ -527,7 +546,7 @@ cog.out("```\n") use_repo_map: true use_system_prompt: true use_temperature: true - weak_model_name: claude-3-haiku-20240307 + weak_model_name: claude-3-5-haiku-20241022 - cache_control: true caches_by_default: false edit_format: whole @@ -560,10 +579,28 @@ cog.out("```\n") reminder: user send_undo_reply: false streaming: true - use_repo_map: false + 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 + 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 @@ -578,7 +615,7 @@ cog.out("```\n") reminder: user send_undo_reply: false streaming: true - use_repo_map: false + use_repo_map: true use_system_prompt: true use_temperature: true weak_model_name: claude-3-5-haiku-20241022 @@ -595,44 +632,10 @@ cog.out("```\n") reminder: user send_undo_reply: false streaming: true - use_repo_map: false + use_repo_map: true 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: diff - editor_edit_format: null - editor_model_name: null - examples_as_sys_msg: false - extra_params: - max_tokens: 4096 - lazy: false - name: openrouter/anthropic/claude-3.5-haiku - reminder: user - send_undo_reply: false - streaming: true - use_repo_map: false - use_system_prompt: true - use_temperature: true - weak_model_name: openrouter/anthropic/claude-3.5-haiku -- 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: - max_tokens: 4096 - lazy: false - name: openrouter/anthropic/claude-3.5-haiku:beta - reminder: user - send_undo_reply: false - streaming: true - use_repo_map: false - use_system_prompt: true - use_temperature: true - weak_model_name: openrouter/anthropic/claude-3.5-haiku:beta - cache_control: true caches_by_default: false edit_format: whole @@ -667,7 +670,7 @@ cog.out("```\n") use_repo_map: true use_system_prompt: true use_temperature: true - weak_model_name: openrouter/anthropic/claude-3-haiku + weak_model_name: openrouter/anthropic/claude-3-5-haiku - cache_control: true caches_by_default: false edit_format: diff @@ -684,7 +687,7 @@ cog.out("```\n") use_repo_map: true use_system_prompt: true use_temperature: true - weak_model_name: openrouter/anthropic/claude-3-haiku:beta + weak_model_name: openrouter/anthropic/claude-3-5-haiku:beta - cache_control: false caches_by_default: false edit_format: diff @@ -701,7 +704,7 @@ cog.out("```\n") use_repo_map: true use_system_prompt: true use_temperature: true - weak_model_name: vertex_ai/claude-3-haiku@20240307 + weak_model_name: vertex_ai/claude-3-5-haiku@20241022 - cache_control: false caches_by_default: false edit_format: diff @@ -718,7 +721,7 @@ cog.out("```\n") use_repo_map: true use_system_prompt: true use_temperature: true - weak_model_name: vertex_ai/claude-3-haiku@20240307 + weak_model_name: vertex_ai/claude-3-5-haiku@20241022 - cache_control: false caches_by_default: false edit_format: diff @@ -734,7 +737,7 @@ cog.out("```\n") use_repo_map: true use_system_prompt: true use_temperature: true - weak_model_name: vertex_ai/claude-3-haiku@20240307 + weak_model_name: vertex_ai/claude-3-5-haiku@20241022 - cache_control: false caches_by_default: false edit_format: whole @@ -750,7 +753,7 @@ cog.out("```\n") use_repo_map: false use_system_prompt: true use_temperature: true - weak_model_name: vertex_ai/claude-3-haiku@20240307 + weak_model_name: vertex_ai/claude-3-5-haiku@20241022 - cache_control: false caches_by_default: false edit_format: whole diff --git a/aider/website/docs/faq.md b/aider/website/docs/faq.md index dfbb7942c..f7cf40cfe 100644 --- a/aider/website/docs/faq.md +++ b/aider/website/docs/faq.md @@ -30,7 +30,7 @@ current chat to build a compact Adding a bunch of files that are mostly irrelevant to the task at hand will often distract or confuse the LLM. The LLM will give worse coding results, and sometimese even fail to correctly edit files. -Addings extra files will also increase the token costs on your OpenAI invoice. +Addings extra files will also increase your token costs. Again, it's usually best to just add the files to the chat that will need to be modified. If you still wish to add lots of files to the chat, you can: diff --git a/aider/website/docs/leaderboards/index.md b/aider/website/docs/leaderboards/index.md index 0ccbbefbb..7563bec64 100644 --- a/aider/website/docs/leaderboards/index.md +++ b/aider/website/docs/leaderboards/index.md @@ -318,6 +318,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.')}") ]]]--> -November 04, 2024. +November 07, 2024.

diff --git a/scripts/issues.py b/scripts/issues.py index a02fd235e..f41e53baa 100755 --- a/scripts/issues.py +++ b/scripts/issues.py @@ -115,6 +115,10 @@ def comment_and_close_duplicate(issue, oldest_issue): def find_unlabeled_with_paul_comments(issues): unlabeled_issues = [] for issue in issues: + # Skip pull requests + if "pull_request" in issue: + continue + if not issue["labels"] and issue["state"] == "open": # Get comments for this issue comments_url = ( @@ -130,49 +134,33 @@ def find_unlabeled_with_paul_comments(issues): return unlabeled_issues -def main(): - parser = argparse.ArgumentParser(description="Handle duplicate GitHub issues") - parser.add_argument( - "--yes", action="store_true", help="Automatically close duplicates without prompting" - ) - parser.add_argument( - "--find-unlabeled", - action="store_true", - help="Find unlabeled issues with paul-gauthier comments", - ) - args = parser.parse_args() +def handle_unlabeled_issues(all_issues, auto_yes): + print("\nFinding unlabeled issues with paul-gauthier comments...") + unlabeled_issues = find_unlabeled_with_paul_comments(all_issues) - if not TOKEN: - print("Error: Missing GITHUB_TOKEN environment variable. Please check your .env file.") + if not unlabeled_issues: + print("No unlabeled issues with paul-gauthier comments found.") return - all_issues = get_issues("all") + print(f"\nFound {len(unlabeled_issues)} unlabeled issues with paul-gauthier comments:") + for issue in unlabeled_issues: + print(f" - #{issue['number']}: {issue['title']} {issue['html_url']}") - if args.find_unlabeled: - print("\nFinding unlabeled issues with paul-gauthier comments...") - unlabeled_issues = find_unlabeled_with_paul_comments(all_issues) - - if not unlabeled_issues: - print("No unlabeled issues with paul-gauthier comments found.") + if not auto_yes: + confirm = input("\nDo you want to add the 'question' label to these issues? (y/n): ") + if confirm.lower() != "y": + print("Skipping labeling.") return - print(f"\nFound {len(unlabeled_issues)} unlabeled issues with paul-gauthier comments:") - for issue in unlabeled_issues: - print(f" - #{issue['number']}: {issue['title']} {issue['html_url']}") + print("\nAdding 'question' label to issues...") + for issue in unlabeled_issues: + url = f"{GITHUB_API_URL}/repos/{REPO_OWNER}/{REPO_NAME}/issues/{issue['number']}" + response = requests.patch(url, headers=headers, json={"labels": ["question"]}) + response.raise_for_status() + print(f" - Added 'question' label to #{issue['number']}") - if not args.yes: - confirm = input("\nDo you want to add the 'question' label to these issues? (y/n): ") - if confirm.lower() != "y": - print("Skipping labeling.") - return - print("\nAdding 'question' label to issues...") - for issue in unlabeled_issues: - url = f"{GITHUB_API_URL}/repos/{REPO_OWNER}/{REPO_NAME}/issues/{issue['number']}" - response = requests.patch(url, headers=headers, json={"labels": ["question"]}) - response.raise_for_status() - print(f" - Added 'question' label to #{issue['number']}") - return +def handle_duplicate_issues(all_issues, auto_yes): open_issues = [issue for issue in all_issues if issue["state"] == "open"] grouped_open_issues = group_issues_by_subject(open_issues) @@ -198,14 +186,12 @@ def main(): f" {oldest_issue['html_url']} ({oldest_issue['state']})" ) - if not args.yes: - # Confirmation prompt + if not auto_yes: confirm = input("Do you want to comment and close duplicate issues? (y/n): ") if confirm.lower() != "y": print("Skipping this group of issues.") continue - # Comment and close duplicate issues for issue in issues: if issue["number"] != oldest_issue["number"]: comment_and_close_duplicate(issue, oldest_issue) @@ -214,5 +200,22 @@ def main(): print(f"Oldest issue #{oldest_issue['number']} left open") +def main(): + parser = argparse.ArgumentParser(description="Handle duplicate GitHub issues") + parser.add_argument( + "--yes", action="store_true", help="Automatically close duplicates without prompting" + ) + args = parser.parse_args() + + if not TOKEN: + print("Error: Missing GITHUB_TOKEN environment variable. Please check your .env file.") + return + + all_issues = get_issues("all") + + handle_unlabeled_issues(all_issues, args.yes) + handle_duplicate_issues(all_issues, args.yes) + + if __name__ == "__main__": main() diff --git a/tests/basic/test_coder.py b/tests/basic/test_coder.py index a5172cbc1..9456c61c0 100644 --- a/tests/basic/test_coder.py +++ b/tests/basic/test_coder.py @@ -17,6 +17,8 @@ from aider.utils import GitTemporaryDirectory class TestCoder(unittest.TestCase): def setUp(self): self.GPT35 = Model("gpt-3.5-turbo") + self.webbrowser_patcher = patch("aider.io.webbrowser.open") + self.mock_webbrowser = self.webbrowser_patcher.start() def test_allowed_to_edit(self): with GitTemporaryDirectory(): diff --git a/tests/basic/test_editblock.py b/tests/basic/test_editblock.py index 4b3817b1c..1ac1e41b0 100644 --- a/tests/basic/test_editblock.py +++ b/tests/basic/test_editblock.py @@ -10,6 +10,7 @@ from aider.coders import editblock_coder as eb from aider.dump import dump # noqa: F401 from aider.io import InputOutput from aider.models import Model +from aider.utils import ChdirTemporaryDirectory class TestUtils(unittest.TestCase): @@ -341,6 +342,46 @@ These changes replace the `subprocess.run` patches with `subprocess.check_output result = eb.replace_most_similar_chunk(whole, part, replace) self.assertEqual(result, expected_output) + def test_create_new_file_with_other_file_in_chat(self): + # https://github.com/Aider-AI/aider/issues/2258 + with ChdirTemporaryDirectory(): + # Create a few temporary files + file1 = "file.txt" + + with open(file1, "w", encoding="utf-8") as f: + f.write("one\ntwo\nthree\n") + + files = [file1] + + # Initialize the Coder object with the mocked IO and mocked repo + coder = Coder.create( + self.GPT35, "diff", use_git=False, io=InputOutput(yes=True), fnames=files + ) + + def mock_send(*args, **kwargs): + coder.partial_response_content = f""" +Do this: + +newfile.txt +<<<<<<< SEARCH +======= +creating a new file +>>>>>>> REPLACE + +""" + coder.partial_response_function_call = dict() + return [] + + coder.send = mock_send + + coder.run(with_message="hi") + + content = Path(file1).read_text(encoding="utf-8") + self.assertEqual(content, "one\ntwo\nthree\n") + + content = Path("newfile.txt").read_text(encoding="utf-8") + self.assertEqual(content, "creating a new file\n") + def test_full_edit(self): # Create a few temporary files _, file1 = tempfile.mkstemp() diff --git a/tests/basic/test_main.py b/tests/basic/test_main.py index 6fa4a9ed6..1b85cfd22 100644 --- a/tests/basic/test_main.py +++ b/tests/basic/test_main.py @@ -32,7 +32,7 @@ class TestMain(TestCase): os.environ["HOME"] = self.homedir_obj.name self.input_patcher = patch("builtins.input", return_value=None) self.mock_input = self.input_patcher.start() - self.webbrowser_patcher = patch("webbrowser.open") + self.webbrowser_patcher = patch("aider.io.webbrowser.open") self.mock_webbrowser = self.webbrowser_patcher.start() def tearDown(self): diff --git a/tests/basic/test_sanity_check_repo.py b/tests/basic/test_sanity_check_repo.py index 3ba18e2f3..860572ec5 100644 --- a/tests/basic/test_sanity_check_repo.py +++ b/tests/basic/test_sanity_check_repo.py @@ -127,8 +127,9 @@ def test_git_index_version_greater_than_2(mock_browser, create_repo, mock_io): "You may be able to convert your repo: git update-index --index-version=2" ) mock_io.tool_output.assert_any_call("Or run aider --no-git to proceed without using git.") - mock_io.confirm_ask.assert_any_call( - "Open documentation url for more info?", subject=urls.git_index_version + mock_io.offer_url.assert_any_call( + urls.git_index_version, + "Open documentation url for more info?", ) diff --git a/tests/basic/test_sendchat.py b/tests/basic/test_sendchat.py index e2395bc14..28397e5c8 100644 --- a/tests/basic/test_sendchat.py +++ b/tests/basic/test_sendchat.py @@ -1,10 +1,9 @@ import unittest from unittest.mock import MagicMock, patch -import httpx - +from aider.exceptions import LiteLLMExceptions from aider.llm import litellm -from aider.sendchat import retry_exceptions, simple_send_with_retries +from aider.sendchat import simple_send_with_retries class PrintCalled(Exception): @@ -12,9 +11,9 @@ class PrintCalled(Exception): class TestSendChat(unittest.TestCase): - def test_retry_exceptions(self): - """Test that retry_exceptions() can be called without raising errors""" - retry_exceptions() # Should not raise any exceptions + def test_litellm_exceptions(self): + litellm_ex = LiteLLMExceptions() + litellm_ex._load(strict=True) @patch("litellm.completion") @patch("builtins.print") @@ -24,7 +23,7 @@ class TestSendChat(unittest.TestCase): # Set up the mock to raise mock_completion.side_effect = [ - litellm.exceptions.RateLimitError( + litellm.RateLimitError( "rate limit exceeded", response=mock, llm_provider="llm_provider", @@ -35,17 +34,4 @@ class TestSendChat(unittest.TestCase): # Call the simple_send_with_retries method simple_send_with_retries("model", ["message"]) - assert mock_print.call_count == 2 - - @patch("litellm.completion") - @patch("builtins.print") - def test_simple_send_with_retries_connection_error(self, mock_print, mock_completion): - # Set up the mock to raise - mock_completion.side_effect = [ - httpx.ConnectError("Connection error"), - None, - ] - - # Call the simple_send_with_retries method - simple_send_with_retries("model", ["message"]) - assert mock_print.call_count == 2 + assert mock_print.call_count == 3