This commit is contained in:
Paul Gauthier 2023-07-22 08:45:40 -03:00
parent 661a521693
commit 78e7b5c3db
2 changed files with 72 additions and 0 deletions

View file

@ -353,6 +353,8 @@ class Coder:
def move_back_cur_messages(self, message):
self.done_messages += self.cur_messages
self.done_messages = summarize_chat_history(self.done_messages)
if message:
self.done_messages += [
dict(role="user", content=message),

70
aider/history.py Normal file
View file

@ -0,0 +1,70 @@
import json
import tiktoken
from prompt_toolkit.completion import Completion
from aider import prompts
from .dump import dump # noqa: F401
class ChatSummary:
def __init__(self, model, max_tokens=1024):
self.tokenizer = tiktoken.encoding_for_model(model)
self.max_tokens = max_tokens
def summarize(self, messages):
num = len(messages)
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
if total <= self.max_tokens:
return messages
num = num // 2
# we want the head to end with an assistant msg
if messages[num]["role"] == "assistant":
num += 1
head = messages[:num]
tail = messages[num:]
summary = self.summarize_all(head)
tail_tokens = sum(tokens for tokens, msg in sized[num:])
summary_tokens = len(self.tokenizer.encode(json.dumps(summary)))
result = summary + tail
if summary_tokens + tail_tokens < self.max_tokens:
return result
return self.summarize(result)
def summarize_all(self, messages):
content = ""
for msg in messages:
role = msg["role"].upper()
if role not in ("USER", "ASSISTANT"):
continue
content += f"# {role}\n"
content += msg["content"]
if not content.endswith("\n"):
content += "\n"
dump(content)
messages = [
dict(role="system", content=prompts.summarize),
dict(role="user", content=content),
]
summary = simple_send_with_retries(model=models.GPT35.name, messages=messages)
dump(summary)