Merge branch 'main' into watch

This commit is contained in:
Paul Gauthier 2024-11-07 13:44:51 -08:00
commit d4a88d08e4
21 changed files with 521 additions and 289 deletions

View file

@ -1,6 +1,6 @@
try: try:
from aider.__version__ import __version__ from aider.__version__ import __version__
except Exception: except Exception:
__version__ = "0.62.1.dev" __version__ = "0.62.2.dev"
__all__ = [__version__] __all__ = [__version__]

View file

@ -13,7 +13,6 @@ import sys
import threading import threading
import time import time
import traceback import traceback
import webbrowser
from collections import defaultdict from collections import defaultdict
from datetime import datetime from datetime import datetime
from json.decoder import JSONDecodeError from json.decoder import JSONDecodeError
@ -23,6 +22,7 @@ from typing import List
from aider import __version__, models, prompts, urls, utils from aider import __version__, models, prompts, urls, utils
from aider.analytics import Analytics from aider.analytics import Analytics
from aider.commands import Commands from aider.commands import Commands
from aider.exceptions import LiteLLMExceptions
from aider.history import ChatSummary from aider.history import ChatSummary
from aider.io import ConfirmGroup, InputOutput from aider.io import ConfirmGroup, InputOutput
from aider.linter import Linter from aider.linter import Linter
@ -30,7 +30,7 @@ from aider.llm import litellm
from aider.repo import ANY_GIT_ERROR, GitRepo from aider.repo import ANY_GIT_ERROR, GitRepo
from aider.repomap import RepoMap from aider.repomap import RepoMap
from aider.run_cmd import run_cmd 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 aider.utils import format_content, format_messages, format_tokens, is_image_file
from ..dump import dump # noqa: F401 from ..dump import dump # noqa: F401
@ -790,34 +790,9 @@ class Coder:
self.num_reflections += 1 self.num_reflections += 1
message = self.reflected_message message = self.reflected_message
def check_and_open_urls(self, exc: Exception) -> List[str]: def check_and_open_urls(self, exc, friendly_msg=None):
import openai
"""Check exception for URLs, offer to open in a browser, with user-friendly error msgs.""" """Check exception for URLs, offer to open in a browser, with user-friendly error msgs."""
text = str(exc) 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: if friendly_msg:
self.io.tool_warning(text) self.io.tool_warning(text)
@ -829,8 +804,7 @@ class Coder:
urls = list(set(url_pattern.findall(text))) # Use set to remove duplicates urls = list(set(url_pattern.findall(text))) # Use set to remove duplicates
for url in urls: for url in urls:
url = url.rstrip(".',\"") url = url.rstrip(".',\"")
if self.io.confirm_ask("Open URL for more info about this error?", subject=url): self.io.offer_url(url)
webbrowser.open(url)
return urls return urls
def check_for_urls(self, inp: str) -> List[str]: def check_for_urls(self, inp: str) -> List[str]:
@ -1154,8 +1128,6 @@ class Coder:
return chunks return chunks
def send_message(self, inp): def send_message(self, inp):
import openai # for error codes below
self.cur_messages += [ self.cur_messages += [
dict(role="user", content=inp), dict(role="user", content=inp),
] ]
@ -1175,6 +1147,8 @@ class Coder:
retry_delay = 0.125 retry_delay = 0.125
litellm_ex = LiteLLMExceptions()
self.usage_report = None self.usage_report = None
exhausted = False exhausted = False
interrupted = False interrupted = False
@ -1183,30 +1157,37 @@ class Coder:
try: try:
yield from self.send(messages, functions=self.functions) yield from self.send(messages, functions=self.functions)
break break
except retry_exceptions() as err: except litellm_ex.exceptions_tuple() as err:
# Print the error and its base classes ex_info = litellm_ex.get_ex_info(err)
# for cls in err.__class__.__mro__: dump(cls.__name__)
retry_delay *= 2 if ex_info.name == "ContextWindowExceededError":
if retry_delay > RETRY_TIMEOUT: exhausted = True
self.mdstream = None
self.check_and_open_urls(err)
break 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) 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...") self.io.tool_output(f"Retrying in {retry_delay:.1f} seconds...")
time.sleep(retry_delay) time.sleep(retry_delay)
continue continue
except KeyboardInterrupt: except KeyboardInterrupt:
interrupted = True interrupted = True
break 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: except FinishReasonLength:
# We hit the output limit! # We hit the output limit!
if not self.main_model.info.get("supports_assistant_prefill"): if not self.main_model.info.get("supports_assistant_prefill"):
@ -1221,12 +1202,8 @@ class Coder:
messages.append( messages.append(
dict(role="assistant", content=self.multi_response_content, prefix=True) 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: except Exception as err:
self.mdstream = None
lines = traceback.format_exception(type(err), err, err.__traceback__) lines = traceback.format_exception(type(err), err, err.__traceback__)
self.io.tool_warning("".join(lines)) self.io.tool_warning("".join(lines))
self.io.tool_error(str(err)) self.io.tool_error(str(err))
@ -1374,11 +1351,9 @@ class Coder:
res.append("- Use /clear to clear the chat history.") res.append("- Use /clear to clear the chat history.")
res.append("- Break your code into smaller source files.") 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]) res = "".join([line + "\n" for line in res])
self.io.tool_error(res) self.io.tool_error(res)
self.io.offer_url(urls.token_limits)
def lint_edited(self, fnames): def lint_edited(self, fnames):
res = "" res = ""

View file

@ -52,7 +52,10 @@ class EditBlockCoder(Coder):
content = self.io.read_text(full_path) content = self.io.read_text(full_path)
new_content = do_replace(full_path, content, original, updated, self.fence) 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 # try patching any of the other files in the chat
for full_path in self.abs_fnames: for full_path in self.abs_fnames:
content = self.io.read_text(full_path) content = self.io.read_text(full_path)

76
aider/exceptions.py Normal file
View file

@ -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))

View file

@ -1,6 +1,7 @@
import base64 import base64
import os import os
import threading import threading
import webbrowser
from collections import defaultdict from collections import defaultdict
from dataclasses import dataclass from dataclasses import dataclass
from datetime import datetime from datetime import datetime
@ -532,6 +533,15 @@ class InputOutput:
hist = "\n" + content.strip() + "\n\n" hist = "\n" + content.strip() + "\n\n"
self.append_chat_history(hist) 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( def confirm_ask(
self, self,
question, question,

View file

@ -5,7 +5,6 @@ import re
import sys import sys
import threading import threading
import traceback import traceback
import webbrowser
from pathlib import Path from pathlib import Path
import git 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_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("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.") 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): io.offer_url(urls.git_index_version, "Open documentation url for more info?")
webbrowser.open(urls.git_index_version)
return False return False
io.tool_error("Unable to read git repository, it may be corrupt?") 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") io.tool_output("You can skip this check with --no-show-model-warnings")
try: try:
if io.confirm_ask( io.offer_url(urls.model_warnings, "Open documentation url for more info?")
"Open documentation url for more info?", subject=urls.model_warnings
):
webbrowser.open(urls.model_warnings)
io.tool_output() io.tool_output()
except KeyboardInterrupt: except KeyboardInterrupt:
return 1 return 1
@ -869,10 +864,7 @@ def check_and_load_imports(io, verbose=False):
except Exception as err: except Exception as err:
io.tool_error(str(err)) io.tool_error(str(err))
io.tool_output("Error loading required imports. Did you install aider properly?") io.tool_output("Error loading required imports. Did you install aider properly?")
if io.confirm_ask( io.offer_url(urls.install_properly, "Open documentation url for more info?")
"Open documentation url for more info?", subject=urls.install_properly
):
webbrowser.open(urls.install_properly)
sys.exit(1) sys.exit(1)

View file

@ -234,24 +234,24 @@ MODEL_SETTINGS = [
ModelSettings( ModelSettings(
"claude-3-opus-20240229", "claude-3-opus-20240229",
"diff", "diff",
weak_model_name="claude-3-haiku-20240307", weak_model_name="claude-3-5-haiku-20241022",
use_repo_map=True, use_repo_map=True,
), ),
ModelSettings( ModelSettings(
"openrouter/anthropic/claude-3-opus", "openrouter/anthropic/claude-3-opus",
"diff", "diff",
weak_model_name="openrouter/anthropic/claude-3-haiku", weak_model_name="openrouter/anthropic/claude-3-5-haiku",
use_repo_map=True, use_repo_map=True,
), ),
ModelSettings( ModelSettings(
"claude-3-sonnet-20240229", "claude-3-sonnet-20240229",
"whole", "whole",
weak_model_name="claude-3-haiku-20240307", weak_model_name="claude-3-5-haiku-20241022",
), ),
ModelSettings( ModelSettings(
"claude-3-5-sonnet-20240620", "claude-3-5-sonnet-20240620",
"diff", "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_model_name="claude-3-5-sonnet-20240620",
editor_edit_format="editor-diff", editor_edit_format="editor-diff",
use_repo_map=True, use_repo_map=True,
@ -268,7 +268,7 @@ MODEL_SETTINGS = [
ModelSettings( ModelSettings(
"anthropic/claude-3-5-sonnet-20240620", "anthropic/claude-3-5-sonnet-20240620",
"diff", "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_model_name="anthropic/claude-3-5-sonnet-20240620",
editor_edit_format="editor-diff", editor_edit_format="editor-diff",
use_repo_map=True, use_repo_map=True,
@ -285,7 +285,7 @@ MODEL_SETTINGS = [
ModelSettings( ModelSettings(
"anthropic/claude-3-5-sonnet-20241022", "anthropic/claude-3-5-sonnet-20241022",
"diff", "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_model_name="anthropic/claude-3-5-sonnet-20241022",
editor_edit_format="editor-diff", editor_edit_format="editor-diff",
use_repo_map=True, use_repo_map=True,
@ -299,10 +299,27 @@ MODEL_SETTINGS = [
cache_control=True, cache_control=True,
reminder="user", 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( ModelSettings(
"anthropic/claude-3-5-sonnet-latest", "anthropic/claude-3-5-sonnet-latest",
"diff", "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_model_name="anthropic/claude-3-5-sonnet-20241022",
editor_edit_format="editor-diff", editor_edit_format="editor-diff",
use_repo_map=True, use_repo_map=True,
@ -319,7 +336,7 @@ MODEL_SETTINGS = [
ModelSettings( ModelSettings(
"claude-3-5-sonnet-20241022", "claude-3-5-sonnet-20241022",
"diff", "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_model_name="claude-3-5-sonnet-20241022",
editor_edit_format="editor-diff", editor_edit_format="editor-diff",
use_repo_map=True, use_repo_map=True,
@ -349,6 +366,19 @@ MODEL_SETTINGS = [
"anthropic/claude-3-5-haiku-20241022", "anthropic/claude-3-5-haiku-20241022",
"diff", "diff",
weak_model_name="anthropic/claude-3-5-haiku-20241022", 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_params={
"extra_headers": { "extra_headers": {
"anthropic-beta": ANTHROPIC_BETA_HEADER, "anthropic-beta": ANTHROPIC_BETA_HEADER,
@ -360,6 +390,7 @@ MODEL_SETTINGS = [
"claude-3-5-haiku-20241022", "claude-3-5-haiku-20241022",
"diff", "diff",
weak_model_name="claude-3-5-haiku-20241022", weak_model_name="claude-3-5-haiku-20241022",
use_repo_map=True,
examples_as_sys_msg=True, examples_as_sys_msg=True,
extra_params={ extra_params={
"extra_headers": { "extra_headers": {
@ -372,28 +403,11 @@ MODEL_SETTINGS = [
"vertex_ai/claude-3-5-haiku@20241022", "vertex_ai/claude-3-5-haiku@20241022",
"diff", "diff",
weak_model_name="vertex_ai/claude-3-5-haiku@20241022", weak_model_name="vertex_ai/claude-3-5-haiku@20241022",
use_repo_map=True,
extra_params={ extra_params={
"max_tokens": 4096, "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( ModelSettings(
"claude-3-haiku-20240307", "claude-3-haiku-20240307",
"whole", "whole",
@ -409,7 +423,7 @@ MODEL_SETTINGS = [
ModelSettings( ModelSettings(
"openrouter/anthropic/claude-3.5-sonnet", "openrouter/anthropic/claude-3.5-sonnet",
"diff", "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_model_name="openrouter/anthropic/claude-3.5-sonnet",
editor_edit_format="editor-diff", editor_edit_format="editor-diff",
use_repo_map=True, use_repo_map=True,
@ -423,7 +437,7 @@ MODEL_SETTINGS = [
ModelSettings( ModelSettings(
"openrouter/anthropic/claude-3.5-sonnet:beta", "openrouter/anthropic/claude-3.5-sonnet:beta",
"diff", "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_model_name="openrouter/anthropic/claude-3.5-sonnet:beta",
editor_edit_format="editor-diff", editor_edit_format="editor-diff",
use_repo_map=True, use_repo_map=True,
@ -439,7 +453,7 @@ MODEL_SETTINGS = [
ModelSettings( ModelSettings(
"vertex_ai/claude-3-5-sonnet@20240620", "vertex_ai/claude-3-5-sonnet@20240620",
"diff", "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_model_name="vertex_ai/claude-3-5-sonnet@20240620",
editor_edit_format="editor-diff", editor_edit_format="editor-diff",
use_repo_map=True, use_repo_map=True,
@ -452,7 +466,7 @@ MODEL_SETTINGS = [
ModelSettings( ModelSettings(
"vertex_ai/claude-3-5-sonnet-v2@20241022", "vertex_ai/claude-3-5-sonnet-v2@20241022",
"diff", "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_model_name="vertex_ai/claude-3-5-sonnet-v2@20241022",
editor_edit_format="editor-diff", editor_edit_format="editor-diff",
use_repo_map=True, use_repo_map=True,
@ -465,13 +479,13 @@ MODEL_SETTINGS = [
ModelSettings( ModelSettings(
"vertex_ai/claude-3-opus@20240229", "vertex_ai/claude-3-opus@20240229",
"diff", "diff",
weak_model_name="vertex_ai/claude-3-haiku@20240307", weak_model_name="vertex_ai/claude-3-5-haiku@20241022",
use_repo_map=True, use_repo_map=True,
), ),
ModelSettings( ModelSettings(
"vertex_ai/claude-3-sonnet@20240229", "vertex_ai/claude-3-sonnet@20240229",
"whole", "whole",
weak_model_name="vertex_ai/claude-3-haiku@20240307", weak_model_name="vertex_ai/claude-3-5-haiku@20241022",
), ),
# Cohere # Cohere
ModelSettings( ModelSettings(

View file

@ -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()) 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: class RepoMap:
@ -197,7 +197,7 @@ class RepoMap:
self.TAGS_CACHE = new_cache self.TAGS_CACHE = new_cache
return return
except (SQLITE_ERRORS, OSError) as e: except SQLITE_ERRORS as e:
# If anything goes wrong, warn and fall back to dict # If anything goes wrong, warn and fall back to dict
self.io.tool_warning( self.io.tool_warning(
f"Unable to use tags cache at {path}, falling back to memory cache" f"Unable to use tags cache at {path}, falling back to memory cache"
@ -368,6 +368,8 @@ class RepoMap:
showing_bar = False showing_bar = False
for fname in fnames: for fname in fnames:
if self.verbose:
self.io.tool_output(f"Processing {fname}")
if progress and not showing_bar: if progress and not showing_bar:
progress() progress()

View file

@ -2,9 +2,8 @@ import hashlib
import json import json
import time import time
import backoff
from aider.dump import dump # noqa: F401 from aider.dump import dump # noqa: F401
from aider.exceptions import LiteLLMExceptions
from aider.llm import litellm from aider.llm import litellm
# from diskcache import Cache # from diskcache import Cache
@ -17,52 +16,6 @@ CACHE = None
RETRY_TIMEOUT = 60 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( def send_completion(
model_name, model_name,
messages, messages,
@ -104,6 +57,8 @@ def send_completion(
def simple_send_with_retries(model_name, messages, extra_params=None): def simple_send_with_retries(model_name, messages, extra_params=None):
litellm_ex = LiteLLMExceptions()
retry_delay = 0.125 retry_delay = 0.125
while True: while True:
try: try:
@ -117,11 +72,22 @@ def simple_send_with_retries(model_name, messages, extra_params=None):
_hash, response = send_completion(**kwargs) _hash, response = send_completion(**kwargs)
return response.choices[0].message.content 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)) print(str(err))
retry_delay *= 2 if ex_info.description:
if retry_delay > RETRY_TIMEOUT: 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 break
print(f"Retrying in {retry_delay:.1f} seconds...") print(f"Retrying in {retry_delay:.1f} seconds...")
time.sleep(retry_delay) time.sleep(retry_delay)
continue continue

View file

@ -20,7 +20,7 @@
versions: 0.30.2-dev versions: 0.30.2-dev
seconds_per_case: 32.4 seconds_per_case: 32.4
total_cost: 13.8395 total_cost: 13.8395
- dirname: 2024-03-06-16-42-00--claude3-sonnet-whole - dirname: 2024-03-06-16-42-00--claude3-sonnet-whole
test_cases: 133 test_cases: 133
model: claude-3-sonnet-20240229 model: claude-3-sonnet-20240229
@ -43,7 +43,7 @@
versions: 0.25.1-dev versions: 0.25.1-dev
seconds_per_case: 23.1 seconds_per_case: 23.1
total_cost: 0.0000 total_cost: 0.0000
- dirname: 2024-05-03-20-47-24--gemini-1.5-pro-diff-fenced - dirname: 2024-05-03-20-47-24--gemini-1.5-pro-diff-fenced
test_cases: 133 test_cases: 133
model: gemini-1.5-pro-latest model: gemini-1.5-pro-latest
@ -88,7 +88,7 @@
versions: 0.33.1-dev versions: 0.33.1-dev
seconds_per_case: 6.5 seconds_per_case: 6.5
total_cost: 0.5032 total_cost: 0.5032
- dirname: 2023-11-06-21-23-59--gpt-3.5-turbo-0301 - dirname: 2023-11-06-21-23-59--gpt-3.5-turbo-0301
test_cases: 133 test_cases: 133
model: gpt-3.5-turbo-0301 model: gpt-3.5-turbo-0301
@ -111,7 +111,7 @@
versions: 0.16.4-dev versions: 0.16.4-dev
seconds_per_case: 6.5 seconds_per_case: 6.5
total_cost: 0.4822 total_cost: 0.4822
- dirname: 2023-11-07-02-41-07--gpt-3.5-turbo-0613 - dirname: 2023-11-07-02-41-07--gpt-3.5-turbo-0613
test_cases: 133 test_cases: 133
model: gpt-3.5-turbo-0613 model: gpt-3.5-turbo-0613
@ -155,7 +155,7 @@
versions: 0.30.2-dev versions: 0.30.2-dev
seconds_per_case: 5.3 seconds_per_case: 5.3
total_cost: 0.3261 total_cost: 0.3261
- dirname: 2024-01-25-23-37-15--jan-exercism-gpt-4-0125-preview-udiff - dirname: 2024-01-25-23-37-15--jan-exercism-gpt-4-0125-preview-udiff
test_cases: 133 test_cases: 133
model: gpt-4-0125-preview model: gpt-4-0125-preview
@ -178,7 +178,7 @@
versions: 0.22.1-dev versions: 0.22.1-dev
seconds_per_case: 44.8 seconds_per_case: 44.8
total_cost: 14.6428 total_cost: 14.6428
- dirname: 2024-05-04-15-07-30--redo-gpt-4-0314-diff-reminder-rules - dirname: 2024-05-04-15-07-30--redo-gpt-4-0314-diff-reminder-rules
test_cases: 133 test_cases: 133
model: gpt-4-0314 model: gpt-4-0314
@ -201,7 +201,7 @@
versions: 0.31.2-dev versions: 0.31.2-dev
seconds_per_case: 19.8 seconds_per_case: 19.8
total_cost: 16.2689 total_cost: 16.2689
- dirname: 2023-12-16-21-24-28--editblock-gpt-4-0613-actual-main - dirname: 2023-12-16-21-24-28--editblock-gpt-4-0613-actual-main
test_cases: 133 test_cases: 133
model: gpt-4-0613 model: gpt-4-0613
@ -228,7 +228,7 @@
- dirname: 2024-05-08-21-16-03--may-gpt-4-1106-preview-udiff - dirname: 2024-05-08-21-16-03--may-gpt-4-1106-preview-udiff
test_cases: 133 test_cases: 133
model: gpt-4-1106-preview model: gpt-4-1106-preview
released: 2023-11-06 released: 2023-11-06
edit_format: udiff edit_format: udiff
commit_hash: 87664dc commit_hash: 87664dc
pass_rate_1: 51.9 pass_rate_1: 51.9
@ -247,7 +247,7 @@
versions: 0.33.1-dev versions: 0.33.1-dev
seconds_per_case: 20.4 seconds_per_case: 20.4
total_cost: 6.6061 total_cost: 6.6061
- dirname: 2024-05-01-02-09-20--gpt-4-turbo-examples - dirname: 2024-05-01-02-09-20--gpt-4-turbo-examples
test_cases: 133 test_cases: 133
model: gpt-4-turbo-2024-04-09 (udiff) model: gpt-4-turbo-2024-04-09 (udiff)
@ -270,7 +270,7 @@
versions: 0.30.2-dev versions: 0.30.2-dev
seconds_per_case: 22.8 seconds_per_case: 22.8
total_cost: 6.3337 total_cost: 6.3337
- dirname: 2024-05-03-22-24-48--openrouter--llama3-diff-examples-sys-msg - dirname: 2024-05-03-22-24-48--openrouter--llama3-diff-examples-sys-msg
test_cases: 132 test_cases: 132
model: llama3-70b-8192 model: llama3-70b-8192
@ -293,7 +293,7 @@
versions: 0.31.2-dev versions: 0.31.2-dev
seconds_per_case: 14.5 seconds_per_case: 14.5
total_cost: 0.4311 total_cost: 0.4311
- dirname: 2024-05-06-18-31-08--command-r-plus-whole-final - dirname: 2024-05-06-18-31-08--command-r-plus-whole-final
test_cases: 133 test_cases: 133
model: command-r-plus model: command-r-plus
@ -316,11 +316,11 @@
versions: 0.31.2-dev versions: 0.31.2-dev
seconds_per_case: 22.9 seconds_per_case: 22.9
total_cost: 2.7494 total_cost: 2.7494
- dirname: 2024-05-07-20-32-37--qwen1.5-110b-chat-whole - dirname: 2024-05-07-20-32-37--qwen1.5-110b-chat-whole
test_cases: 133 test_cases: 133
model: qwen1.5-110b-chat model: qwen1.5-110b-chat
released: 2024-02-04 released: 2024-02-04
edit_format: whole edit_format: whole
commit_hash: 70b1c0c commit_hash: 70b1c0c
pass_rate_1: 30.8 pass_rate_1: 30.8
@ -339,7 +339,7 @@
versions: 0.31.2-dev versions: 0.31.2-dev
seconds_per_case: 46.9 seconds_per_case: 46.9
total_cost: 0.0000 total_cost: 0.0000
- dirname: 2024-05-07-20-57-04--wizardlm-2-8x22b-whole - dirname: 2024-05-07-20-57-04--wizardlm-2-8x22b-whole
test_cases: 133 test_cases: 133
model: WizardLM-2 8x22B model: WizardLM-2 8x22B
@ -384,7 +384,7 @@
versions: 0.34.1-dev versions: 0.34.1-dev
seconds_per_case: 6.0 seconds_per_case: 6.0
total_cost: 0.0000 total_cost: 0.0000
- dirname: 2024-04-12-22-18-20--gpt-4-turbo-2024-04-09-plain-diff - dirname: 2024-04-12-22-18-20--gpt-4-turbo-2024-04-09-plain-diff
test_cases: 33 test_cases: 33
model: gpt-4-turbo-2024-04-09 (diff) model: gpt-4-turbo-2024-04-09 (diff)
@ -568,7 +568,7 @@
versions: 0.42.1-dev versions: 0.42.1-dev
seconds_per_case: 17.6 seconds_per_case: 17.6
total_cost: 3.6346 total_cost: 3.6346
- dirname: 2024-07-01-21-41-48--haiku-whole - dirname: 2024-07-01-21-41-48--haiku-whole
test_cases: 133 test_cases: 133
model: claude-3-haiku-20240307 model: claude-3-haiku-20240307
@ -1131,7 +1131,7 @@
versions: 0.56.1.dev versions: 0.56.1.dev
seconds_per_case: 80.9 seconds_per_case: 80.9
total_cost: 63.9190 total_cost: 63.9190
- dirname: 2024-09-19-16-58-29--qwen2.5-coder:7b-instruct-q8_0 - dirname: 2024-09-19-16-58-29--qwen2.5-coder:7b-instruct-q8_0
test_cases: 133 test_cases: 133
model: qwen2.5-coder:7b-instruct-q8_0 model: qwen2.5-coder:7b-instruct-q8_0
@ -1154,7 +1154,7 @@
versions: 0.56.0 versions: 0.56.0
seconds_per_case: 9.3 seconds_per_case: 9.3
total_cost: 0.0000 total_cost: 0.0000
- dirname: 2024-09-20-20-20-19--qwen-2.5-72b-instruct-diff - dirname: 2024-09-20-20-20-19--qwen-2.5-72b-instruct-diff
test_cases: 133 test_cases: 133
model: qwen-2.5-72b-instruct (bf16) model: qwen-2.5-72b-instruct (bf16)
@ -1458,7 +1458,7 @@
versions: 0.58.1.dev versions: 0.58.1.dev
seconds_per_case: 63.7 seconds_per_case: 63.7
total_cost: 0.0000 total_cost: 0.0000
- dirname: 2024-10-01-16-50-09--hermes3-whole-4 - dirname: 2024-10-01-16-50-09--hermes3-whole-4
test_cases: 133 test_cases: 133
model: ollama/hermes3 model: ollama/hermes3
@ -1633,4 +1633,27 @@
date: 2024-11-04 date: 2024-11-04
versions: 0.61.1.dev versions: 0.61.1.dev
seconds_per_case: 18.4 seconds_per_case: 18.4
total_cost: 0.0000 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

View file

@ -1,5 +1,5 @@
<canvas id="linesChart" width="800" height="360" style="margin-top: 20px"></canvas>
<canvas id="blameChart" width="800" height="360" style="margin-top: 20px"></canvas> <canvas id="blameChart" width="800" height="360" style="margin-top: 20px"></canvas>
<canvas id="linesChart" width="800" height="360" style="margin-top: 20px"></canvas>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script> <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<script src="https://cdn.jsdelivr.net/npm/moment"></script> <script src="https://cdn.jsdelivr.net/npm/moment"></script>
<script src="https://cdn.jsdelivr.net/npm/chartjs-adapter-moment"></script> <script src="https://cdn.jsdelivr.net/npm/chartjs-adapter-moment"></script>

View file

@ -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": "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": "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": 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}

View file

@ -400,7 +400,7 @@ cog.out("```\n")
use_repo_map: true use_repo_map: true
use_system_prompt: true use_system_prompt: true
use_temperature: true use_temperature: true
weak_model_name: claude-3-haiku-20240307 weak_model_name: claude-3-5-haiku-20241022
- cache_control: false - cache_control: false
caches_by_default: false caches_by_default: false
edit_format: diff edit_format: diff
@ -416,7 +416,7 @@ cog.out("```\n")
use_repo_map: true use_repo_map: true
use_system_prompt: true use_system_prompt: true
use_temperature: true use_temperature: true
weak_model_name: openrouter/anthropic/claude-3-haiku weak_model_name: openrouter/anthropic/claude-3-5-haiku
- cache_control: false - cache_control: false
caches_by_default: false caches_by_default: false
edit_format: whole edit_format: whole
@ -432,7 +432,7 @@ cog.out("```\n")
use_repo_map: false use_repo_map: false
use_system_prompt: true use_system_prompt: true
use_temperature: true use_temperature: true
weak_model_name: claude-3-haiku-20240307 weak_model_name: claude-3-5-haiku-20241022
- cache_control: true - cache_control: true
caches_by_default: false caches_by_default: false
edit_format: diff edit_format: diff
@ -451,7 +451,7 @@ cog.out("```\n")
use_repo_map: true use_repo_map: true
use_system_prompt: true use_system_prompt: true
use_temperature: true use_temperature: true
weak_model_name: claude-3-haiku-20240307 weak_model_name: claude-3-5-haiku-20241022
- cache_control: true - cache_control: true
caches_by_default: false caches_by_default: false
edit_format: diff edit_format: diff
@ -470,7 +470,7 @@ cog.out("```\n")
use_repo_map: true use_repo_map: true
use_system_prompt: true use_system_prompt: true
use_temperature: true use_temperature: true
weak_model_name: anthropic/claude-3-haiku-20240307 weak_model_name: anthropic/claude-3-5-haiku-20241022
- cache_control: true - cache_control: true
caches_by_default: false caches_by_default: false
edit_format: diff edit_format: diff
@ -489,7 +489,26 @@ cog.out("```\n")
use_repo_map: true use_repo_map: true
use_system_prompt: true use_system_prompt: true
use_temperature: 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 - cache_control: true
caches_by_default: false caches_by_default: false
edit_format: diff edit_format: diff
@ -508,7 +527,7 @@ cog.out("```\n")
use_repo_map: true use_repo_map: true
use_system_prompt: true use_system_prompt: true
use_temperature: true use_temperature: true
weak_model_name: anthropic/claude-3-haiku-20240307 weak_model_name: anthropic/claude-3-5-haiku-20241022
- cache_control: true - cache_control: true
caches_by_default: false caches_by_default: false
edit_format: diff edit_format: diff
@ -527,7 +546,7 @@ cog.out("```\n")
use_repo_map: true use_repo_map: true
use_system_prompt: true use_system_prompt: true
use_temperature: true use_temperature: true
weak_model_name: claude-3-haiku-20240307 weak_model_name: claude-3-5-haiku-20241022
- cache_control: true - cache_control: true
caches_by_default: false caches_by_default: false
edit_format: whole edit_format: whole
@ -560,10 +579,28 @@ cog.out("```\n")
reminder: user reminder: user
send_undo_reply: false send_undo_reply: false
streaming: true streaming: true
use_repo_map: false use_repo_map: true
use_system_prompt: true use_system_prompt: true
use_temperature: true use_temperature: true
weak_model_name: anthropic/claude-3-5-haiku-20241022 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 - cache_control: true
caches_by_default: false caches_by_default: false
edit_format: diff edit_format: diff
@ -578,7 +615,7 @@ cog.out("```\n")
reminder: user reminder: user
send_undo_reply: false send_undo_reply: false
streaming: true streaming: true
use_repo_map: false use_repo_map: true
use_system_prompt: true use_system_prompt: true
use_temperature: true use_temperature: true
weak_model_name: claude-3-5-haiku-20241022 weak_model_name: claude-3-5-haiku-20241022
@ -595,44 +632,10 @@ cog.out("```\n")
reminder: user reminder: user
send_undo_reply: false send_undo_reply: false
streaming: true streaming: true
use_repo_map: false use_repo_map: true
use_system_prompt: true use_system_prompt: true
use_temperature: true use_temperature: true
weak_model_name: vertex_ai/claude-3-5-haiku@20241022 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 - cache_control: true
caches_by_default: false caches_by_default: false
edit_format: whole edit_format: whole
@ -667,7 +670,7 @@ cog.out("```\n")
use_repo_map: true use_repo_map: true
use_system_prompt: true use_system_prompt: true
use_temperature: true use_temperature: true
weak_model_name: openrouter/anthropic/claude-3-haiku weak_model_name: openrouter/anthropic/claude-3-5-haiku
- cache_control: true - cache_control: true
caches_by_default: false caches_by_default: false
edit_format: diff edit_format: diff
@ -684,7 +687,7 @@ cog.out("```\n")
use_repo_map: true use_repo_map: true
use_system_prompt: true use_system_prompt: true
use_temperature: 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 - cache_control: false
caches_by_default: false caches_by_default: false
edit_format: diff edit_format: diff
@ -701,7 +704,7 @@ cog.out("```\n")
use_repo_map: true use_repo_map: true
use_system_prompt: true use_system_prompt: true
use_temperature: 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 - cache_control: false
caches_by_default: false caches_by_default: false
edit_format: diff edit_format: diff
@ -718,7 +721,7 @@ cog.out("```\n")
use_repo_map: true use_repo_map: true
use_system_prompt: true use_system_prompt: true
use_temperature: 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 - cache_control: false
caches_by_default: false caches_by_default: false
edit_format: diff edit_format: diff
@ -734,7 +737,7 @@ cog.out("```\n")
use_repo_map: true use_repo_map: true
use_system_prompt: true use_system_prompt: true
use_temperature: 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 - cache_control: false
caches_by_default: false caches_by_default: false
edit_format: whole edit_format: whole
@ -750,7 +753,7 @@ cog.out("```\n")
use_repo_map: false use_repo_map: false
use_system_prompt: true use_system_prompt: true
use_temperature: 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 - cache_control: false
caches_by_default: false caches_by_default: false
edit_format: whole edit_format: whole

View file

@ -30,7 +30,7 @@ current chat to build a compact
Adding a bunch of files that are mostly irrelevant to the Adding a bunch of files that are mostly irrelevant to the
task at hand will often distract or confuse the LLM. 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. 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. 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: If you still wish to add lots of files to the chat, you can:

View file

@ -318,6 +318,6 @@ mod_dates = [get_last_modified_date(file) for file in files]
latest_mod_date = max(mod_dates) latest_mod_date = max(mod_dates)
cog.out(f"{latest_mod_date.strftime('%B %d, %Y.')}") cog.out(f"{latest_mod_date.strftime('%B %d, %Y.')}")
]]]--> ]]]-->
November 04, 2024. November 07, 2024.
<!--[[[end]]]--> <!--[[[end]]]-->
</p> </p>

View file

@ -115,6 +115,10 @@ def comment_and_close_duplicate(issue, oldest_issue):
def find_unlabeled_with_paul_comments(issues): def find_unlabeled_with_paul_comments(issues):
unlabeled_issues = [] unlabeled_issues = []
for issue in issues: for issue in issues:
# Skip pull requests
if "pull_request" in issue:
continue
if not issue["labels"] and issue["state"] == "open": if not issue["labels"] and issue["state"] == "open":
# Get comments for this issue # Get comments for this issue
comments_url = ( comments_url = (
@ -130,49 +134,33 @@ def find_unlabeled_with_paul_comments(issues):
return unlabeled_issues return unlabeled_issues
def main(): def handle_unlabeled_issues(all_issues, auto_yes):
parser = argparse.ArgumentParser(description="Handle duplicate GitHub issues") print("\nFinding unlabeled issues with paul-gauthier comments...")
parser.add_argument( unlabeled_issues = find_unlabeled_with_paul_comments(all_issues)
"--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()
if not TOKEN: if not unlabeled_issues:
print("Error: Missing GITHUB_TOKEN environment variable. Please check your .env file.") print("No unlabeled issues with paul-gauthier comments found.")
return 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: if not auto_yes:
print("\nFinding unlabeled issues with paul-gauthier comments...") confirm = input("\nDo you want to add the 'question' label to these issues? (y/n): ")
unlabeled_issues = find_unlabeled_with_paul_comments(all_issues) if confirm.lower() != "y":
print("Skipping labeling.")
if not unlabeled_issues:
print("No unlabeled issues with paul-gauthier comments found.")
return return
print(f"\nFound {len(unlabeled_issues)} unlabeled issues with paul-gauthier comments:") print("\nAdding 'question' label to issues...")
for issue in unlabeled_issues: for issue in unlabeled_issues:
print(f" - #{issue['number']}: {issue['title']} {issue['html_url']}") 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...") def handle_duplicate_issues(all_issues, auto_yes):
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
open_issues = [issue for issue in all_issues if issue["state"] == "open"] open_issues = [issue for issue in all_issues if issue["state"] == "open"]
grouped_open_issues = group_issues_by_subject(open_issues) grouped_open_issues = group_issues_by_subject(open_issues)
@ -198,14 +186,12 @@ def main():
f" {oldest_issue['html_url']} ({oldest_issue['state']})" f" {oldest_issue['html_url']} ({oldest_issue['state']})"
) )
if not args.yes: if not auto_yes:
# Confirmation prompt
confirm = input("Do you want to comment and close duplicate issues? (y/n): ") confirm = input("Do you want to comment and close duplicate issues? (y/n): ")
if confirm.lower() != "y": if confirm.lower() != "y":
print("Skipping this group of issues.") print("Skipping this group of issues.")
continue continue
# Comment and close duplicate issues
for issue in issues: for issue in issues:
if issue["number"] != oldest_issue["number"]: if issue["number"] != oldest_issue["number"]:
comment_and_close_duplicate(issue, oldest_issue) comment_and_close_duplicate(issue, oldest_issue)
@ -214,5 +200,22 @@ def main():
print(f"Oldest issue #{oldest_issue['number']} left open") 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__": if __name__ == "__main__":
main() main()

View file

@ -17,6 +17,8 @@ from aider.utils import GitTemporaryDirectory
class TestCoder(unittest.TestCase): class TestCoder(unittest.TestCase):
def setUp(self): def setUp(self):
self.GPT35 = Model("gpt-3.5-turbo") 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): def test_allowed_to_edit(self):
with GitTemporaryDirectory(): with GitTemporaryDirectory():

View file

@ -10,6 +10,7 @@ from aider.coders import editblock_coder as eb
from aider.dump import dump # noqa: F401 from aider.dump import dump # noqa: F401
from aider.io import InputOutput from aider.io import InputOutput
from aider.models import Model from aider.models import Model
from aider.utils import ChdirTemporaryDirectory
class TestUtils(unittest.TestCase): 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) result = eb.replace_most_similar_chunk(whole, part, replace)
self.assertEqual(result, expected_output) 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): def test_full_edit(self):
# Create a few temporary files # Create a few temporary files
_, file1 = tempfile.mkstemp() _, file1 = tempfile.mkstemp()

View file

@ -32,7 +32,7 @@ class TestMain(TestCase):
os.environ["HOME"] = self.homedir_obj.name os.environ["HOME"] = self.homedir_obj.name
self.input_patcher = patch("builtins.input", return_value=None) self.input_patcher = patch("builtins.input", return_value=None)
self.mock_input = self.input_patcher.start() 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() self.mock_webbrowser = self.webbrowser_patcher.start()
def tearDown(self): def tearDown(self):

View file

@ -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" "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.tool_output.assert_any_call("Or run aider --no-git to proceed without using git.")
mock_io.confirm_ask.assert_any_call( mock_io.offer_url.assert_any_call(
"Open documentation url for more info?", subject=urls.git_index_version urls.git_index_version,
"Open documentation url for more info?",
) )

View file

@ -1,10 +1,9 @@
import unittest import unittest
from unittest.mock import MagicMock, patch from unittest.mock import MagicMock, patch
import httpx from aider.exceptions import LiteLLMExceptions
from aider.llm import litellm 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): class PrintCalled(Exception):
@ -12,9 +11,9 @@ class PrintCalled(Exception):
class TestSendChat(unittest.TestCase): class TestSendChat(unittest.TestCase):
def test_retry_exceptions(self): def test_litellm_exceptions(self):
"""Test that retry_exceptions() can be called without raising errors""" litellm_ex = LiteLLMExceptions()
retry_exceptions() # Should not raise any exceptions litellm_ex._load(strict=True)
@patch("litellm.completion") @patch("litellm.completion")
@patch("builtins.print") @patch("builtins.print")
@ -24,7 +23,7 @@ class TestSendChat(unittest.TestCase):
# Set up the mock to raise # Set up the mock to raise
mock_completion.side_effect = [ mock_completion.side_effect = [
litellm.exceptions.RateLimitError( litellm.RateLimitError(
"rate limit exceeded", "rate limit exceeded",
response=mock, response=mock,
llm_provider="llm_provider", llm_provider="llm_provider",
@ -35,17 +34,4 @@ class TestSendChat(unittest.TestCase):
# Call the simple_send_with_retries method # Call the simple_send_with_retries method
simple_send_with_retries("model", ["message"]) simple_send_with_retries("model", ["message"])
assert mock_print.call_count == 2 assert mock_print.call_count == 3
@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