mirror of
https://github.com/Aider-AI/aider.git
synced 2025-05-24 22:34:59 +00:00
announcements
This commit is contained in:
parent
0925c4b8b3
commit
d21de778ff
3 changed files with 85 additions and 160 deletions
|
@ -16,7 +16,7 @@ from jsonschema import Draft7Validator
|
||||||
from rich.console import Console, Text
|
from rich.console import Console, Text
|
||||||
from rich.markdown import Markdown
|
from rich.markdown import Markdown
|
||||||
|
|
||||||
from aider import models, prompts, utils
|
from aider import __version__, models, prompts, utils
|
||||||
from aider.commands import Commands
|
from aider.commands import Commands
|
||||||
from aider.history import ChatSummary
|
from aider.history import ChatSummary
|
||||||
from aider.io import InputOutput
|
from aider.io import InputOutput
|
||||||
|
@ -80,6 +80,54 @@ class Coder:
|
||||||
else:
|
else:
|
||||||
raise ValueError(f"Unknown edit format {edit_format}")
|
raise ValueError(f"Unknown edit format {edit_format}")
|
||||||
|
|
||||||
|
def get_announcements(self):
|
||||||
|
lines = []
|
||||||
|
lines.append(f"Aider v{__version__}")
|
||||||
|
|
||||||
|
# Model
|
||||||
|
main_model = self.main_model
|
||||||
|
weak_model = main_model.weak_model
|
||||||
|
prefix = "Model:"
|
||||||
|
output = f" {main_model.name} with {self.edit_format} edit format"
|
||||||
|
if weak_model is not main_model:
|
||||||
|
prefix = "Models:"
|
||||||
|
output += f", weak model {weak_model.name}"
|
||||||
|
lines.append(prefix + output)
|
||||||
|
|
||||||
|
# Repo
|
||||||
|
if self.repo:
|
||||||
|
rel_repo_dir = self.repo.get_rel_repo_dir()
|
||||||
|
num_files = len(self.repo.get_tracked_files())
|
||||||
|
lines.append(f"Git repo: {rel_repo_dir} with {num_files:,} files")
|
||||||
|
if num_files > 1000:
|
||||||
|
lines.append(
|
||||||
|
"Warning: For large repos, consider using an .aiderignore file to ignore"
|
||||||
|
" irrelevant files/dirs."
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
lines.append("Git repo: none")
|
||||||
|
|
||||||
|
# Repo-map
|
||||||
|
map_tokens = self.repo_map.max_map_tokens if self.repo_map else 0
|
||||||
|
if map_tokens > 0 and self.repo_map:
|
||||||
|
lines.append(f"Repo-map: using {map_tokens} tokens")
|
||||||
|
max_map_tokens = 2048
|
||||||
|
if map_tokens > max_map_tokens:
|
||||||
|
lines.append(
|
||||||
|
f"Warning: map-tokens > {max_map_tokens} is not recommended as too much"
|
||||||
|
" irrelevant code can confuse GPT."
|
||||||
|
)
|
||||||
|
elif not map_tokens:
|
||||||
|
lines.append("Repo-map: disabled because map_tokens == 0")
|
||||||
|
else:
|
||||||
|
lines.append("Repo-map: disabled")
|
||||||
|
|
||||||
|
# Files
|
||||||
|
for fname in self.get_inchat_relative_files():
|
||||||
|
lines.append(f"Added {fname} to the chat.")
|
||||||
|
|
||||||
|
return lines
|
||||||
|
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
main_model,
|
main_model,
|
||||||
|
@ -136,15 +184,6 @@ class Coder:
|
||||||
|
|
||||||
self.main_model = main_model
|
self.main_model = main_model
|
||||||
|
|
||||||
weak_model = main_model.weak_model
|
|
||||||
prefix = "Model:"
|
|
||||||
output = f" {main_model.name} with {self.edit_format} edit format"
|
|
||||||
if weak_model is not main_model:
|
|
||||||
prefix = "Models:"
|
|
||||||
output += f", weak model {weak_model.name}"
|
|
||||||
|
|
||||||
self.io.tool_output(prefix + output)
|
|
||||||
|
|
||||||
self.show_diffs = show_diffs
|
self.show_diffs = show_diffs
|
||||||
|
|
||||||
self.commands = Commands(self.io, self, voice_language)
|
self.commands = Commands(self.io, self, voice_language)
|
||||||
|
@ -181,17 +220,7 @@ class Coder:
|
||||||
self.abs_fnames.add(fname)
|
self.abs_fnames.add(fname)
|
||||||
self.check_added_files()
|
self.check_added_files()
|
||||||
|
|
||||||
if self.repo:
|
if not self.repo:
|
||||||
rel_repo_dir = self.repo.get_rel_repo_dir()
|
|
||||||
num_files = len(self.repo.get_tracked_files())
|
|
||||||
self.io.tool_output(f"Git repo: {rel_repo_dir} with {num_files:,} files")
|
|
||||||
if num_files > 1000:
|
|
||||||
self.io.tool_error(
|
|
||||||
"Warning: For large repos, consider using an .aiderignore file to ignore"
|
|
||||||
" irrelevant files/dirs."
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
self.io.tool_output("Git repo: none")
|
|
||||||
self.find_common_root()
|
self.find_common_root()
|
||||||
|
|
||||||
if main_model.use_repo_map and self.repo and self.gpt_prompts.repo_content_prefix:
|
if main_model.use_repo_map and self.repo and self.gpt_prompts.repo_content_prefix:
|
||||||
|
@ -204,22 +233,6 @@ class Coder:
|
||||||
self.verbose,
|
self.verbose,
|
||||||
)
|
)
|
||||||
|
|
||||||
if map_tokens > 0 and self.repo_map:
|
|
||||||
self.io.tool_output(f"Repo-map: using {map_tokens} tokens")
|
|
||||||
max_map_tokens = 2048
|
|
||||||
if map_tokens > max_map_tokens:
|
|
||||||
self.io.tool_error(
|
|
||||||
f"Warning: map-tokens > {max_map_tokens} is not recommended as too much"
|
|
||||||
" irrelevant code can confuse GPT."
|
|
||||||
)
|
|
||||||
elif not map_tokens:
|
|
||||||
self.io.tool_output("Repo-map: disabled because map_tokens == 0")
|
|
||||||
else:
|
|
||||||
self.io.tool_output("Repo-map: disabled")
|
|
||||||
|
|
||||||
for fname in self.get_inchat_relative_files():
|
|
||||||
self.io.tool_output(f"Added {fname} to the chat.")
|
|
||||||
|
|
||||||
self.summarizer = ChatSummary(
|
self.summarizer = ChatSummary(
|
||||||
self.main_model.weak_model,
|
self.main_model.weak_model,
|
||||||
self.main_model.max_chat_history_tokens,
|
self.main_model.max_chat_history_tokens,
|
||||||
|
@ -237,6 +250,9 @@ class Coder:
|
||||||
self.io.tool_output("JSON Schema:")
|
self.io.tool_output("JSON Schema:")
|
||||||
self.io.tool_output(json.dumps(self.functions, indent=4))
|
self.io.tool_output(json.dumps(self.functions, indent=4))
|
||||||
|
|
||||||
|
for line in self.get_announcements():
|
||||||
|
self.io.tool_output(line)
|
||||||
|
|
||||||
def find_common_root(self):
|
def find_common_root(self):
|
||||||
if len(self.abs_fnames) == 1:
|
if len(self.abs_fnames) == 1:
|
||||||
self.root = os.path.dirname(list(self.abs_fnames)[0])
|
self.root = os.path.dirname(list(self.abs_fnames)[0])
|
||||||
|
|
127
aider/gui.py
127
aider/gui.py
|
@ -8,7 +8,7 @@ import streamlit as st
|
||||||
|
|
||||||
from aider.coders import Coder
|
from aider.coders import Coder
|
||||||
from aider.dump import dump # noqa: F401
|
from aider.dump import dump # noqa: F401
|
||||||
from aider.models import Model
|
from aider.main import main
|
||||||
|
|
||||||
if "recent_msgs_num" not in st.session_state:
|
if "recent_msgs_num" not in st.session_state:
|
||||||
st.session_state.recent_msgs_num = 0
|
st.session_state.recent_msgs_num = 0
|
||||||
|
@ -100,122 +100,25 @@ def search(text=None):
|
||||||
# selected_value = st_searchbox(search)
|
# selected_value = st_searchbox(search)
|
||||||
|
|
||||||
|
|
||||||
model = Model("claude-3-haiku-20240307")
|
@st.cache_resource
|
||||||
fnames = ["greeting.py"]
|
def get_coder():
|
||||||
coder = Coder.create(main_model=model, fnames=fnames, use_git=False, pretty=False)
|
coder = main(return_coder=True)
|
||||||
|
if isinstance(coder, Coder):
|
||||||
lorem_words = [
|
return coder
|
||||||
"lorem",
|
raise ValueError()
|
||||||
"ipsum",
|
|
||||||
"dolor",
|
|
||||||
"sit",
|
|
||||||
"amet",
|
|
||||||
"consectetur",
|
|
||||||
"adipiscing",
|
|
||||||
"elit",
|
|
||||||
"sed",
|
|
||||||
"do",
|
|
||||||
"eiusmod",
|
|
||||||
"tempor",
|
|
||||||
"incididunt",
|
|
||||||
"ut",
|
|
||||||
"labore",
|
|
||||||
"et",
|
|
||||||
"dolore",
|
|
||||||
"magna",
|
|
||||||
"aliqua",
|
|
||||||
"enim",
|
|
||||||
"ad",
|
|
||||||
"minim",
|
|
||||||
"veniam",
|
|
||||||
"quis",
|
|
||||||
"nostrudlorem",
|
|
||||||
"ipsum",
|
|
||||||
"dolor",
|
|
||||||
"sit",
|
|
||||||
"amet",
|
|
||||||
"consectetur",
|
|
||||||
"adipiscing",
|
|
||||||
"elit",
|
|
||||||
"sed",
|
|
||||||
"do",
|
|
||||||
"eiusmod",
|
|
||||||
"tempor",
|
|
||||||
"incididunt",
|
|
||||||
"ut",
|
|
||||||
"labore",
|
|
||||||
"et",
|
|
||||||
"dolore",
|
|
||||||
"magna",
|
|
||||||
"aliqua",
|
|
||||||
"enim",
|
|
||||||
"ad",
|
|
||||||
"minim",
|
|
||||||
"veniam",
|
|
||||||
"quis",
|
|
||||||
"nostrudlorem",
|
|
||||||
"ipsum",
|
|
||||||
"dolor",
|
|
||||||
"sit",
|
|
||||||
"amet",
|
|
||||||
"consectetur",
|
|
||||||
"adipiscing",
|
|
||||||
"elit",
|
|
||||||
"sed",
|
|
||||||
"do",
|
|
||||||
"eiusmod",
|
|
||||||
"tempor",
|
|
||||||
"incididunt",
|
|
||||||
"ut",
|
|
||||||
"labore",
|
|
||||||
"et",
|
|
||||||
"dolore",
|
|
||||||
"magna",
|
|
||||||
"aliqua",
|
|
||||||
"enim",
|
|
||||||
"ad",
|
|
||||||
"minim",
|
|
||||||
"veniam",
|
|
||||||
"quis",
|
|
||||||
"nostrudlorem",
|
|
||||||
"ipsum",
|
|
||||||
"dolor",
|
|
||||||
"sit",
|
|
||||||
"amet",
|
|
||||||
"consectetur",
|
|
||||||
"adipiscing",
|
|
||||||
"elit",
|
|
||||||
"sed",
|
|
||||||
"do",
|
|
||||||
"eiusmod",
|
|
||||||
"tempor",
|
|
||||||
"incididunt",
|
|
||||||
"ut",
|
|
||||||
"labore",
|
|
||||||
"et",
|
|
||||||
"dolore",
|
|
||||||
"magna",
|
|
||||||
"aliqua",
|
|
||||||
"enim",
|
|
||||||
"ad",
|
|
||||||
"minim",
|
|
||||||
"veniam",
|
|
||||||
"quis",
|
|
||||||
"nostrud\n\n",
|
|
||||||
"\n\n",
|
|
||||||
"\n\n",
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
def generate_lorem_text(min_words=10, max_words=50):
|
coder = get_coder()
|
||||||
num_words = random.randint(min_words, max_words)
|
|
||||||
words = random.sample(lorem_words, num_words)
|
|
||||||
return " ".join(words)
|
def announce(coder):
|
||||||
|
lines = coder.get_announcements()
|
||||||
|
lines = " \n".join(lines)
|
||||||
|
st.info(lines)
|
||||||
|
|
||||||
|
|
||||||
with st.sidebar:
|
with st.sidebar:
|
||||||
st.title("Aider")
|
st.title("Aider")
|
||||||
|
|
||||||
cmds_tab, settings_tab = st.tabs(["Commands", "Settings"])
|
cmds_tab, settings_tab = st.tabs(["Commands", "Settings"])
|
||||||
|
|
||||||
with cmds_tab:
|
with cmds_tab:
|
||||||
|
@ -303,6 +206,8 @@ messages = st.container()
|
||||||
# stuff a bunch of vertical whitespace at the top
|
# stuff a bunch of vertical whitespace at the top
|
||||||
# to get all the chat text to the bottom
|
# to get all the chat text to the bottom
|
||||||
messages.container(height=1200, border=False)
|
messages.container(height=1200, border=False)
|
||||||
|
with messages:
|
||||||
|
announce(coder)
|
||||||
|
|
||||||
with recent_msgs_empty:
|
with recent_msgs_empty:
|
||||||
old_prompt = recent_msgs()
|
old_prompt = recent_msgs()
|
||||||
|
|
|
@ -122,7 +122,7 @@ def check_gitignore(git_root, io, ask=True):
|
||||||
io.tool_output(f"Added {pat} to .gitignore")
|
io.tool_output(f"Added {pat} to .gitignore")
|
||||||
|
|
||||||
|
|
||||||
def main(argv=None, input=None, output=None, force_git_root=None):
|
def main(argv=None, input=None, output=None, force_git_root=None, return_coder=False):
|
||||||
if argv is None:
|
if argv is None:
|
||||||
argv = sys.argv[1:]
|
argv = sys.argv[1:]
|
||||||
|
|
||||||
|
@ -554,20 +554,14 @@ def main(argv=None, input=None, output=None, force_git_root=None):
|
||||||
if args.git and not force_git_root:
|
if args.git and not force_git_root:
|
||||||
right_repo_root = guessed_wrong_repo(io, git_root, fnames, git_dname)
|
right_repo_root = guessed_wrong_repo(io, git_root, fnames, git_dname)
|
||||||
if right_repo_root:
|
if right_repo_root:
|
||||||
return main(argv, input, output, right_repo_root)
|
return main(argv, input, output, right_repo_root, return_coder=return_coder)
|
||||||
|
|
||||||
io.tool_output(f"Aider v{__version__}")
|
|
||||||
|
|
||||||
if not args.skip_check_update:
|
if not args.skip_check_update:
|
||||||
check_version(io.tool_error)
|
check_version(io.tool_error)
|
||||||
|
|
||||||
if args.check_update:
|
if args.check_update:
|
||||||
update_available = check_version(lambda msg: None)
|
update_available = check_version(lambda msg: None)
|
||||||
sys.exit(0 if not update_available else 1)
|
return 0 if not update_available else 1
|
||||||
|
|
||||||
if "VSCODE_GIT_IPC_HANDLE" in os.environ:
|
|
||||||
args.pretty = False
|
|
||||||
io.tool_output("VSCode terminal detected, pretty output has been disabled.")
|
|
||||||
|
|
||||||
if args.models:
|
if args.models:
|
||||||
matches = models.fuzzy_match_models(args.models)
|
matches = models.fuzzy_match_models(args.models)
|
||||||
|
@ -652,6 +646,9 @@ def main(argv=None, input=None, output=None, force_git_root=None):
|
||||||
io.tool_error(str(err))
|
io.tool_error(str(err))
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
|
if return_coder:
|
||||||
|
return coder
|
||||||
|
|
||||||
if args.commit:
|
if args.commit:
|
||||||
coder.commands.cmd_commit("")
|
coder.commands.cmd_commit("")
|
||||||
return
|
return
|
||||||
|
@ -670,6 +667,10 @@ def main(argv=None, input=None, output=None, force_git_root=None):
|
||||||
coder.apply_updates()
|
coder.apply_updates()
|
||||||
return
|
return
|
||||||
|
|
||||||
|
if "VSCODE_GIT_IPC_HANDLE" in os.environ:
|
||||||
|
args.pretty = False
|
||||||
|
io.tool_output("VSCode terminal detected, pretty output has been disabled.")
|
||||||
|
|
||||||
io.tool_output("Use /help to see in-chat commands, run with --help to see cmd line args")
|
io.tool_output("Use /help to see in-chat commands, run with --help to see cmd line args")
|
||||||
|
|
||||||
if git_root and Path.cwd().resolve() != Path(git_root).resolve():
|
if git_root and Path.cwd().resolve() != Path(git_root).resolve():
|
||||||
|
@ -685,7 +686,9 @@ def main(argv=None, input=None, output=None, force_git_root=None):
|
||||||
io.add_to_input_history(args.message)
|
io.add_to_input_history(args.message)
|
||||||
io.tool_output()
|
io.tool_output()
|
||||||
coder.run(with_message=args.message)
|
coder.run(with_message=args.message)
|
||||||
elif args.message_file:
|
return
|
||||||
|
|
||||||
|
if args.message_file:
|
||||||
try:
|
try:
|
||||||
message_from_file = io.read_text(args.message_file)
|
message_from_file = io.read_text(args.message_file)
|
||||||
io.tool_output()
|
io.tool_output()
|
||||||
|
@ -696,8 +699,9 @@ def main(argv=None, input=None, output=None, force_git_root=None):
|
||||||
except IOError as e:
|
except IOError as e:
|
||||||
io.tool_error(f"Error reading message file: {e}")
|
io.tool_error(f"Error reading message file: {e}")
|
||||||
return 1
|
return 1
|
||||||
else:
|
return
|
||||||
coder.run()
|
|
||||||
|
coder.run()
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue