From abbc93678b2d14dd6a7e34bd2861ed9ac743e4ad Mon Sep 17 00:00:00 2001 From: Joshua Vial Date: Wed, 23 Aug 2023 21:26:27 +1200 Subject: [PATCH] finishing openrouter integration --- aider/coders/base_coder.py | 2 +- aider/history.py | 8 ++++---- aider/main.py | 2 +- aider/models/__init__.py | 6 +++--- aider/models/model.py | 35 ++++++++++------------------------- aider/models/openrouter.py | 3 ++- aider/repomap.py | 2 +- aider/sendchat.py | 8 ++++---- tests/test_models.py | 12 ++++++------ 9 files changed, 32 insertions(+), 46 deletions(-) diff --git a/aider/coders/base_coder.py b/aider/coders/base_coder.py index 0f1e2f54b..d103396d9 100755 --- a/aider/coders/base_coder.py +++ b/aider/coders/base_coder.py @@ -190,7 +190,7 @@ class Coder: for fname in self.get_inchat_relative_files(): self.io.tool_output(f"Added {fname} to the chat.") - self.summarizer = ChatSummary() + self.summarizer = ChatSummary(models.Model.weak_model()) self.summarizer_thread = None self.summarized_done_messages = None diff --git a/aider/history.py b/aider/history.py index 44c6edea1..36d148344 100644 --- a/aider/history.py +++ b/aider/history.py @@ -9,8 +9,8 @@ from aider.sendchat import simple_send_with_retries class ChatSummary: - def __init__(self, model=models.GPT35.name, max_tokens=1024): - self.tokenizer = tiktoken.encoding_for_model(model) + def __init__(self, model=models.Model.weak_model(), max_tokens=1024): + self.tokenizer = model.tokenizer self.max_tokens = max_tokens self.model = model @@ -86,7 +86,7 @@ class ChatSummary: dict(role="user", content=content), ] - summary = simple_send_with_retries(model=self.model.weak_model, messages=messages) + summary = simple_send_with_retries(self.model.name, messages) summary = prompts.summary_prefix + summary return [dict(role="user", content=summary)] @@ -124,7 +124,7 @@ def main(): assistant.append(line) - summarizer = ChatSummary(models.GPT35.name) + summarizer = ChatSummary(models.Model.weak_model()) summary = summarizer.summarize(messages[-40:]) dump(summary) diff --git a/aider/main.py b/aider/main.py index 2283d6b5e..755e118bb 100644 --- a/aider/main.py +++ b/aider/main.py @@ -458,7 +458,7 @@ def main(argv=None, input=None, output=None, force_git_root=None): setattr(openai, mod_key, val) io.tool_output(f"Setting openai.{mod_key}={val}") - main_model = models.Model(args.model, openai) + main_model = models.Model.create(args.model) try: coder = Coder.create( diff --git a/aider/models/__init__.py b/aider/models/__init__.py index 4ab348c29..f5a6fa7a8 100644 --- a/aider/models/__init__.py +++ b/aider/models/__init__.py @@ -2,6 +2,6 @@ from .openai import OpenAIModel from .openrouter import OpenRouterModel from .model import Model -GPT4 = Model("gpt-4") -GPT35 = Model("gpt-3.5-turbo") -GPT35_16k = Model("gpt-3.5-turbo-16k") +GPT4 = Model.create('gpt-4') +GPT35 = Model.create('gpt-3.5-turbo') +GPT35_16k = Model.create('gpt-3.5-turbo-16k') diff --git a/aider/models/model.py b/aider/models/model.py index 3781d0770..9f48f4a79 100644 --- a/aider/models/model.py +++ b/aider/models/model.py @@ -1,6 +1,4 @@ -saved_openai = None - - +import openai class Model: name = None edit_format = None @@ -13,40 +11,27 @@ class Model: prompt_price = None completion_price = None + openai=None - def __init__(self, name, openai=None): - global saved_openai - if (openai and "openrouter.ai" in openai.api_base): - saved_openai = openai - + @classmethod + def create(cls, name, **kwargs): from .openai import OpenAIModel from .openrouter import OpenRouterModel - model = None - if saved_openai: - model = OpenRouterModel(name, saved_openai) - else: - model = OpenAIModel(name) - - self.name = model.name - self.edit_format = model.edit_format - self.max_context_tokens = model.max_context_tokens - self.tokenizer = model.tokenizer - self.prompt_price = model.prompt_price - self.completion_price = model.completion_price - self.always_available = model.always_available - self.use_repo_map = model.use_repo_map + if ("openrouter.ai" in openai.api_base): + return OpenRouterModel(name, **kwargs) + return OpenAIModel(name, **kwargs) def __str__(self): return self.name @staticmethod def strong_model(): - return Model('gpt-4') + return Model.create('gpt-4') @staticmethod def weak_model(): - return Model('gpt-3.5-turbo') + return Model.create('gpt-3.5-turbo') @staticmethod def commit_message_models(): - return [Model('gpt-3.5-turbo'), Model('gpt-3.5-turbo-16k')] + return [Model.create('gpt-3.5-turbo'), Model.create('gpt-3.5-turbo-16k')] diff --git a/aider/models/openrouter.py b/aider/models/openrouter.py index 8beb42215..4f6c9e1dc 100644 --- a/aider/models/openrouter.py +++ b/aider/models/openrouter.py @@ -1,3 +1,4 @@ +import openai import tiktoken from .model import Model @@ -5,7 +6,7 @@ cached_model_details = None class OpenRouterModel(Model): - def __init__(self, name, openai): + def __init__(self, name): if name == 'gpt-4': name = 'openai/gpt-4' elif name == 'gpt-3.5-turbo': diff --git a/aider/repomap.py b/aider/repomap.py index d22ef6ba8..1b9f8a005 100644 --- a/aider/repomap.py +++ b/aider/repomap.py @@ -80,7 +80,7 @@ class RepoMap: self, map_tokens=1024, root=None, - main_model=models.GPT4, + main_model=models.Model.strong_model(), io=None, repo_content_prefix=None, verbose=False, diff --git a/aider/sendchat.py b/aider/sendchat.py index 04bcab94f..2269e512c 100644 --- a/aider/sendchat.py +++ b/aider/sendchat.py @@ -34,9 +34,9 @@ CACHE = None f"{details.get('exception','Exception')}\nRetry in {details['wait']:.1f} seconds." ), ) -def send_with_retries(model, messages, functions, stream): +def send_with_retries(model_name, messages, functions, stream): kwargs = dict( - model=model, + model=model_name, messages=messages, temperature=0, stream=stream, @@ -72,10 +72,10 @@ def send_with_retries(model, messages, functions, stream): return hash_object, res -def simple_send_with_retries(model, messages): +def simple_send_with_retries(model_name, messages): try: _hash, response = send_with_retries( - model=model, + model_name=model_name, messages=messages, functions=None, stream=False, diff --git a/tests/test_models.py b/tests/test_models.py index af2a6f8d7..39482dee3 100644 --- a/tests/test_models.py +++ b/tests/test_models.py @@ -5,22 +5,22 @@ from aider.models import Model class TestModels(unittest.TestCase): def test_max_context_tokens(self): - model = Model("gpt-3.5-turbo") + model = Model.create("gpt-3.5-turbo") self.assertEqual(model.max_context_tokens, 4 * 1024) - model = Model("gpt-3.5-turbo-16k") + model = Model.create("gpt-3.5-turbo-16k") self.assertEqual(model.max_context_tokens, 16 * 1024) - model = Model("gpt-4") + model = Model.create("gpt-4") self.assertEqual(model.max_context_tokens, 8 * 1024) - model = Model("gpt-4-32k") + model = Model.create("gpt-4-32k") self.assertEqual(model.max_context_tokens, 32 * 1024) - model = Model("gpt-4-0101") + model = Model.create("gpt-4-0101") self.assertEqual(model.max_context_tokens, 8 * 1024) - model = Model("gpt-4-32k-2123") + model = Model.create("gpt-4-32k-2123") self.assertEqual(model.max_context_tokens, 32 * 1024)