mirror of
https://github.com/Aider-AI/aider.git
synced 2025-05-24 14:25:00 +00:00
Merge pull request #379 from joshuavial/gpt4-vision
add support for gpt-4-vision
This commit is contained in:
commit
2824acb5c2
13 changed files with 197 additions and 37 deletions
|
@ -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
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue