mirror of
https://github.com/Aider-AI/aider.git
synced 2025-05-24 22:34:59 +00:00
148 lines
3.1 KiB
Python
148 lines
3.1 KiB
Python
from dataclasses import dataclass, fields
|
|
|
|
import tiktoken
|
|
|
|
from aider.dump import dump
|
|
|
|
from .model import Model
|
|
|
|
|
|
@dataclass
|
|
class ModelInfo:
|
|
name: str
|
|
max_context_tokens: int
|
|
prompt_price: float
|
|
completions_price: float
|
|
edit_format: str
|
|
always_available: bool = False
|
|
use_repo_map: bool = False
|
|
send_undo_reply: bool = False
|
|
|
|
|
|
openai_models = [
|
|
# gpt-3.5
|
|
ModelInfo(
|
|
"gpt-3.5-turbo-0125",
|
|
16385,
|
|
0.0005,
|
|
0.0015,
|
|
"whole",
|
|
always_available=True,
|
|
),
|
|
ModelInfo(
|
|
"gpt-3.5-turbo-1106",
|
|
16385,
|
|
0.0010,
|
|
0.0020,
|
|
"whole",
|
|
always_available=True,
|
|
),
|
|
ModelInfo(
|
|
"gpt-3.5-turbo-0613",
|
|
4096,
|
|
0.0015,
|
|
0.0020,
|
|
"whole",
|
|
always_available=True,
|
|
),
|
|
ModelInfo(
|
|
"gpt-3.5-turbo-16k-0613",
|
|
16385,
|
|
0.0030,
|
|
0.0040,
|
|
"whole",
|
|
always_available=True,
|
|
),
|
|
# gpt-4
|
|
ModelInfo(
|
|
"gpt-4-0125-preview",
|
|
128000,
|
|
0.01,
|
|
0.03,
|
|
"udiff",
|
|
use_repo_map=True,
|
|
send_undo_reply=True,
|
|
),
|
|
ModelInfo(
|
|
"gpt-4-1106-preview",
|
|
128000,
|
|
0.01,
|
|
0.03,
|
|
"udiff",
|
|
use_repo_map=True,
|
|
send_undo_reply=True,
|
|
),
|
|
ModelInfo(
|
|
"gpt-4-vision-preview",
|
|
128000,
|
|
0.01,
|
|
0.03,
|
|
"diff",
|
|
use_repo_map=True,
|
|
send_undo_reply=True,
|
|
),
|
|
ModelInfo(
|
|
"gpt-4-0613",
|
|
8192,
|
|
0.03,
|
|
0.06,
|
|
"diff",
|
|
use_repo_map=True,
|
|
send_undo_reply=True,
|
|
),
|
|
ModelInfo(
|
|
"gpt-4-32k-0613",
|
|
32768,
|
|
0.06,
|
|
0.12,
|
|
"diff",
|
|
use_repo_map=True,
|
|
send_undo_reply=True,
|
|
),
|
|
]
|
|
|
|
openai_aliases = {
|
|
# gpt-3.5
|
|
"gpt-3.5-turbo": "gpt-3.5-turbo-0613",
|
|
"gpt-3.5-turbo-16k": "gpt-3.5-turbo-16k-0613",
|
|
# gpt-4
|
|
"gpt-4-turbo-preview": "gpt-4-0125-preview",
|
|
"gpt-4": "gpt-4-0613",
|
|
"gpt-4-32k": "gpt-4-32k-0613",
|
|
}
|
|
|
|
|
|
class OpenAIModel(Model):
|
|
def __init__(self, name):
|
|
true_name = openai_aliases.get(name, name)
|
|
|
|
try:
|
|
self.tokenizer = tiktoken.encoding_for_model(true_name)
|
|
except KeyError:
|
|
raise ValueError(f"No known tokenizer for model: {name}")
|
|
|
|
model_info = self.lookup_model_info(true_name)
|
|
if not model_info:
|
|
raise ValueError(f"Unsupported model: {name}")
|
|
|
|
print()
|
|
dump(name)
|
|
dump(true_name)
|
|
for field in fields(ModelInfo):
|
|
val = getattr(model_info, field.name)
|
|
setattr(self, field.name, val)
|
|
dump(field.name, val)
|
|
|
|
# restore the caller's specified name
|
|
self.name = name
|
|
|
|
# set the history token limit
|
|
if self.max_context_tokens < 32 * 1024:
|
|
self.max_chat_history_tokens = 1024
|
|
else:
|
|
self.max_chat_history_tokens = 2 * 1024
|
|
|
|
def lookup_model_info(self, name):
|
|
for mi in openai_models:
|
|
if mi.name == name:
|
|
return mi
|