From d91707f73ee5345aa4c5e5e667612363632d6870 Mon Sep 17 00:00:00 2001 From: Krazer Date: Tue, 11 Jun 2024 13:07:19 -0500 Subject: [PATCH 01/10] all models to be registered with litellm --- aider/args.py | 17 +++++++++++++++++ aider/main.py | 10 ++++++++++ aider/models.py | 12 ++++++++++++ 3 files changed, 39 insertions(+) diff --git a/aider/args.py b/aider/args.py index 35e49b1e8..ba931f42d 100644 --- a/aider/args.py +++ b/aider/args.py @@ -135,6 +135,23 @@ def get_parser(default_config_files, git_root): env_var="OPENAI_ORGANIZATION_ID", help="Specify the OpenAI organization ID", ) + group.add_argument( + "--model_file", + metavar="MODEL_FILE", + default=None, + help={ + "File with model definitions to be registered for info/cost, json formated", + " {" + " \"gpt-4\": {", + " \"max_tokens\": 8192,", + " \"input_cost_per_token\": 0.00003,", + " \"output_cost_per_token\": 0.00006,", + " \"litellm_provider\": \"openai\",", + " \"mode\": \"chat\"", + " },", + " }" + } + ) group.add_argument( "--edit-format", metavar="EDIT_FORMAT", diff --git a/aider/main.py b/aider/main.py index 9cf0dda10..12ea6d6df 100644 --- a/aider/main.py +++ b/aider/main.py @@ -332,6 +332,16 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F if args.openai_organization_id: os.environ["OPENAI_ORGANIZATION"] = args.openai_organization_id + model_def_files = [] + model_def_fname = Path(".aider.models.json") + model_def_files.append(Path.home() / model_def_fname) # homedir + if git_root: + model_def_files.append(Path(git_root) / model_def_fname) # git root + if args.models: + model_def_files.append(args.models) + model_def_files = list(map(str, model_def_files)) + models.register_models(model_def_files) + main_model = models.Model(args.model, weak_model=args.weak_model) lint_cmds = parse_lint_cmds(args.lint_cmd, io) diff --git a/aider/models.py b/aider/models.py index 1d51c10c7..1a96bb5b3 100644 --- a/aider/models.py +++ b/aider/models.py @@ -426,6 +426,18 @@ class Model: return res +def register_models(model_def_fnames): + for model_def_fname in model_def_fnames: + if not os.path.exists(model_def_fname): + continue + print(f"Registering model definition from {model_def_fname}") + try: + with open(model_def_fname, "r") as model_def_file: + model_def = json.load(model_def_file) + except json.JSONDecodeError as e: + print(f"Error opening/decoding model definition: {e}") + + litellm.register_model(model_def) def validate_variables(vars): missing = [] From acccbb15129e44e36186251023ba12d3c3f3044f Mon Sep 17 00:00:00 2001 From: Krazer Date: Tue, 11 Jun 2024 13:14:22 -0500 Subject: [PATCH 02/10] update command line arg --- aider/args.py | 2 +- aider/main.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/aider/args.py b/aider/args.py index ba931f42d..6b97ea13f 100644 --- a/aider/args.py +++ b/aider/args.py @@ -136,7 +136,7 @@ def get_parser(default_config_files, git_root): help="Specify the OpenAI organization ID", ) group.add_argument( - "--model_file", + "--model-file", metavar="MODEL_FILE", default=None, help={ diff --git a/aider/main.py b/aider/main.py index 12ea6d6df..d177381f3 100644 --- a/aider/main.py +++ b/aider/main.py @@ -337,8 +337,8 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F model_def_files.append(Path.home() / model_def_fname) # homedir if git_root: model_def_files.append(Path(git_root) / model_def_fname) # git root - if args.models: - model_def_files.append(args.models) + if args.model_file: + model_def_files.append(args.model_file) model_def_files = list(map(str, model_def_files)) models.register_models(model_def_files) From d819d52f8216a86631b96edc9cfd3c6407ce7224 Mon Sep 17 00:00:00 2001 From: Krazer Date: Tue, 11 Jun 2024 13:18:43 -0500 Subject: [PATCH 03/10] add current directory --- aider/main.py | 1 + 1 file changed, 1 insertion(+) diff --git a/aider/main.py b/aider/main.py index d177381f3..f80103b78 100644 --- a/aider/main.py +++ b/aider/main.py @@ -339,6 +339,7 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F model_def_files.append(Path(git_root) / model_def_fname) # git root if args.model_file: model_def_files.append(args.model_file) + model_def_files.append(model_def_fname.resolve()) model_def_files = list(map(str, model_def_files)) models.register_models(model_def_files) From f3b5eae77896d09d1fc5b365ffa6ed259d307801 Mon Sep 17 00:00:00 2001 From: Krazer Date: Tue, 11 Jun 2024 13:30:18 -0500 Subject: [PATCH 04/10] remove duplicates --- aider/main.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/aider/main.py b/aider/main.py index f80103b78..25b023fc9 100644 --- a/aider/main.py +++ b/aider/main.py @@ -341,6 +341,8 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F model_def_files.append(args.model_file) model_def_files.append(model_def_fname.resolve()) model_def_files = list(map(str, model_def_files)) + model_def_files = list(dict.fromkeys(model_def_files)) + print(f"model_def_files: {model_def_files}") models.register_models(model_def_files) main_model = models.Model(args.model, weak_model=args.weak_model) From a090de6a0044f46ff77b3a984b638d35e3674f5b Mon Sep 17 00:00:00 2001 From: Krazer Date: Tue, 11 Jun 2024 13:39:55 -0500 Subject: [PATCH 05/10] add change requests --- aider/main.py | 10 +++++++++- aider/models.py | 7 +++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/aider/main.py b/aider/main.py index 25b023fc9..9d843644d 100644 --- a/aider/main.py +++ b/aider/main.py @@ -343,7 +343,15 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F model_def_files = list(map(str, model_def_files)) model_def_files = list(dict.fromkeys(model_def_files)) print(f"model_def_files: {model_def_files}") - models.register_models(model_def_files) + try: + model_files_loaded=models.register_models(model_def_files) + if len(model_files_loaded) > 0: + io.tool_output(f"Loaded {len(model_files_loaded)} model files") + for model_file in model_files_loaded: + io.tool_output(f" - {model_file}") + except Exception as e: + io.tool_error(f"Error loading model info/cost: {e}") + return 1 main_model = models.Model(args.model, weak_model=args.weak_model) diff --git a/aider/models.py b/aider/models.py index 1a96bb5b3..852aac7ba 100644 --- a/aider/models.py +++ b/aider/models.py @@ -427,18 +427,21 @@ class Model: return res def register_models(model_def_fnames): + model_files_loaded = [] for model_def_fname in model_def_fnames: if not os.path.exists(model_def_fname): continue - print(f"Registering model definition from {model_def_fname}") + model_files_loaded.append(model_def_fname) try: with open(model_def_fname, "r") as model_def_file: model_def = json.load(model_def_file) except json.JSONDecodeError as e: - print(f"Error opening/decoding model definition: {e}") + raise Exception(f"Error loading model definition from {model_def_fname}: {e}") litellm.register_model(model_def) + return model_files_loaded + def validate_variables(vars): missing = [] for var in vars: From a1b5f98d022433f9db3ec6db9007f3bea9732570 Mon Sep 17 00:00:00 2001 From: Krazer Date: Tue, 11 Jun 2024 13:41:29 -0500 Subject: [PATCH 06/10] remove print --- aider/main.py | 1 - 1 file changed, 1 deletion(-) diff --git a/aider/main.py b/aider/main.py index 9d843644d..984a64bce 100644 --- a/aider/main.py +++ b/aider/main.py @@ -342,7 +342,6 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F model_def_files.append(model_def_fname.resolve()) model_def_files = list(map(str, model_def_files)) model_def_files = list(dict.fromkeys(model_def_files)) - print(f"model_def_files: {model_def_files}") try: model_files_loaded=models.register_models(model_def_files) if len(model_files_loaded) > 0: From 58965a9cff8e8191a49ea90970d95e6d2db8881d Mon Sep 17 00:00:00 2001 From: Krazer Date: Tue, 11 Jun 2024 13:48:50 -0500 Subject: [PATCH 07/10] minor output change --- aider/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aider/main.py b/aider/main.py index 984a64bce..629ccd013 100644 --- a/aider/main.py +++ b/aider/main.py @@ -345,7 +345,7 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F try: model_files_loaded=models.register_models(model_def_files) if len(model_files_loaded) > 0: - io.tool_output(f"Loaded {len(model_files_loaded)} model files") + io.tool_output(f"Loaded {len(model_files_loaded)} model file(s)") for model_file in model_files_loaded: io.tool_output(f" - {model_file}") except Exception as e: From 568d72ebe882cb43c6070d66d6589710ee3ab6a6 Mon Sep 17 00:00:00 2001 From: Krazer Date: Tue, 11 Jun 2024 14:09:45 -0500 Subject: [PATCH 08/10] update docs --- aider/args.py | 2 +- website/docs/install/optional.md | 21 +++++++++++++++++++++ website/docs/options.md | 4 ++++ 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/aider/args.py b/aider/args.py index 6b97ea13f..bc3e36ff0 100644 --- a/aider/args.py +++ b/aider/args.py @@ -140,7 +140,7 @@ def get_parser(default_config_files, git_root): metavar="MODEL_FILE", default=None, help={ - "File with model definitions to be registered for info/cost, json formated", + "Specify a file with model definitions (info and cost) to be registered with litellm, json formated", " {" " \"gpt-4\": {", " \"max_tokens\": 8192,", diff --git a/website/docs/install/optional.md b/website/docs/install/optional.md index c33a8980e..f79ac856b 100644 --- a/website/docs/install/optional.md +++ b/website/docs/install/optional.md @@ -26,6 +26,27 @@ Put a line in it like this to specify your api key: openai-api-key: sk-... ``` +## Registering Models not in litellm + +You can register models info and cost with litellm by adding one or more of the following files +* {HomeDir}/.aider.models.json +* {GitRoot}/.aider.models.json +* {CWD}/.aider.models.json +* or via the command line argument `model-file` +If the files above exists, they will be loaded in that order. Files loaded last will take priority. +The json file should be formated as follows +``` +{ + "gpt-4": { + "max_tokens": 8192, + "input_cost_per_token": 0.00003, + "output_cost_per_token": 0.00006, + "litellm_provider": "openai", + "mode": "chat", + }, +} +``` + ## Enable Playwright Aider supports adding web pages to the chat with the `/web ` command. diff --git a/website/docs/options.md b/website/docs/options.md index 27d2df7c2..7d70e58d2 100644 --- a/website/docs/options.md +++ b/website/docs/options.md @@ -103,6 +103,10 @@ Aliases: List known models which match the (partial) MODEL name Environment variable: `AIDER_MODELS` +### `--model-file FILE` +Specify a file with model definitions (info and cost) to be registered with litellm, json formated. See [Registering Models not in litellm](install/optional.md#registering_models_not_in_litellm) for the format +Environment variable: `AIDER_MODEL_FILE` + ### `--openai-api-base OPENAI_API_BASE` Specify the api base url Environment variable: `OPENAI_API_BASE` From 0984e5464fd7586aa1f3ee45aa1fe619996bbbf0 Mon Sep 17 00:00:00 2001 From: Krazer Date: Tue, 11 Jun 2024 14:12:52 -0500 Subject: [PATCH 09/10] link to litellm models def --- website/docs/install/optional.md | 1 + 1 file changed, 1 insertion(+) diff --git a/website/docs/install/optional.md b/website/docs/install/optional.md index f79ac856b..0fb3cdea1 100644 --- a/website/docs/install/optional.md +++ b/website/docs/install/optional.md @@ -46,6 +46,7 @@ The json file should be formated as follows }, } ``` +see [litellm's model definitions](https://github.com/BerriAI/litellm/blob/main/model_prices_and_context_window.json) for examples ## Enable Playwright From a44119bbbe3116df27020f3e33aa05330c7adc01 Mon Sep 17 00:00:00 2001 From: Krazer Date: Tue, 11 Jun 2024 14:14:01 -0500 Subject: [PATCH 10/10] fix wording --- website/docs/install/optional.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/install/optional.md b/website/docs/install/optional.md index 0fb3cdea1..acf043209 100644 --- a/website/docs/install/optional.md +++ b/website/docs/install/optional.md @@ -28,7 +28,7 @@ openai-api-key: sk-... ## Registering Models not in litellm -You can register models info and cost with litellm by adding one or more of the following files +You can register model info and costs with litellm by adding one or more of the following files * {HomeDir}/.aider.models.json * {GitRoot}/.aider.models.json * {CWD}/.aider.models.json