diff --git a/aider/coders/base_coder.py b/aider/coders/base_coder.py index 52b274ab7..e64971f47 100755 --- a/aider/coders/base_coder.py +++ b/aider/coders/base_coder.py @@ -360,7 +360,9 @@ class Coder: def move_back_cur_messages(self, message): self.done_messages += self.cur_messages - self.done_messages = self.summarizer.summarize(self.done_messages) + if self.summarizer.too_big(self.done_messages): + self.io.tool_output("Summarizing chat history...") + self.done_messages = self.summarizer.summarize(self.done_messages) if message: self.done_messages += [ diff --git a/aider/history.py b/aider/history.py index ca45feab8..d342530a7 100644 --- a/aider/history.py +++ b/aider/history.py @@ -13,20 +13,27 @@ class ChatSummary: self.tokenizer = tiktoken.encoding_for_model(model) self.max_tokens = max_tokens + def too_big(self, messages): + sized = self.tokenize(messages) + total = sum(tokens for tokens, _msg in sized) + dump(total, self.max_tokens) + return total > self.max_tokens + + def tokenize(self, messages): + sized = [] + for msg in messages: + tokens = len(self.tokenizer.encode(json.dumps(msg))) + sized.append((tokens, msg)) + return sized + def summarize(self, messages): num = len(messages) dump(num) if num < 2: return messages - total = 0 - sized = [] - for msg in messages: - tokens = len(self.tokenizer.encode(json.dumps(msg))) - sized.append((tokens, msg)) - total += tokens - - dump(total, self.max_tokens) + sized = self.tokenize(messages) + total = sum(tokens for tokens, _msg in sized) if total <= self.max_tokens: return messages