Merge pull request #379 from joshuavial/gpt4-vision

add support for gpt-4-vision
This commit is contained in:
paul-gauthier 2024-01-02 13:37:17 -04:00 committed by GitHub
commit 2824acb5c2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
13 changed files with 197 additions and 37 deletions

View file

@ -24,6 +24,7 @@ from aider.repo import GitRepo
from aider.repomap import RepoMap
from aider.sendchat import send_with_retries
from aider.utils import is_image_file
from ..dump import dump # noqa: F401
@ -298,18 +299,19 @@ class Coder:
prompt = ""
for fname, content in self.get_abs_fnames_content():
relative_fname = self.get_rel_fname(fname)
prompt += "\n"
prompt += relative_fname
prompt += f"\n{self.fence[0]}\n"
if not is_image_file(fname):
relative_fname = self.get_rel_fname(fname)
prompt += "\n"
prompt += relative_fname
prompt += f"\n{self.fence[0]}\n"
prompt += content
prompt += content
# lines = content.splitlines(keepends=True)
# lines = [f"{i+1:03}:{line}" for i, line in enumerate(lines)]
# prompt += "".join(lines)
# lines = content.splitlines(keepends=True)
# lines = [f"{i+1:03}:{line}" for i, line in enumerate(lines)]
# prompt += "".join(lines)
prompt += f"{self.fence[1]}\n"
prompt += f"{self.fence[1]}\n"
return prompt
@ -343,8 +345,36 @@ class Coder:
dict(role="assistant", content="Ok."),
]
images_message = self.get_images_message()
if images_message is not None:
files_messages.append(images_message)
return files_messages
def get_images_message(self):
if not utils.is_gpt4_with_openai_base_url(self.main_model.name, self.client):
return None
image_messages = []
for fname, content in self.get_abs_fnames_content():
if is_image_file(fname):
image_url = f"data:image/{Path(fname).suffix.lstrip('.')};base64,{content}"
image_messages.append({
"type": "image_url",
"image_url": {
"url": image_url,
"detail": "high"
}
})
if not image_messages:
return None
return {
"role": "user",
"content": image_messages
}
def run(self, with_message=None):
while True:
try:
@ -412,6 +442,7 @@ class Coder:
self.done_messages += self.cur_messages
self.summarize_start()
#TODO check for impact on image messages
if message:
self.done_messages += [
dict(role="user", content=message),
@ -458,6 +489,7 @@ class Coder:
dict(role="system", content=self.fmt_system_prompt(self.gpt_prompts.system_reminder)),
]
#TODO review impact of token count on image messages
messages_tokens = self.main_model.token_count(messages)
reminder_tokens = self.main_model.token_count(reminder_message)
cur_tokens = self.main_model.token_count(self.cur_messages)
@ -661,7 +693,7 @@ class Coder:
raise Exception("No data found in openai response!")
tokens = None
if hasattr(completion, "usage"):
if hasattr(completion, "usage") and completion.usage is not None:
prompt_tokens = completion.usage.prompt_tokens
completion_tokens = completion.usage.completion_tokens