From fd2eeaa6bc22dfd1daddb945d5c870d5118b55da Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Tue, 22 Aug 2023 07:11:49 -0700 Subject: [PATCH] adding hosted get model list --- litellm/__init__.py | 5 +++-- litellm/__pycache__/__init__.cpython-311.pyc | Bin 6762 -> 6778 bytes litellm/__pycache__/utils.cpython-311.pyc | Bin 56783 -> 57955 bytes litellm/tests/test_get_model_list.py | 8 ++++++++ litellm/utils.py | 20 ++++++++++++++++++- pyproject.toml | 2 +- 6 files changed, 31 insertions(+), 4 deletions(-) create mode 100644 litellm/tests/test_get_model_list.py diff --git a/litellm/__init__.py b/litellm/__init__.py index 2e9a77496d..a9fd326347 100644 --- a/litellm/__init__.py +++ b/litellm/__init__.py @@ -4,7 +4,7 @@ input_callback: List[str] = [] success_callback: List[str] = [] failure_callback: List[str] = [] set_verbose = False -debugger_email = None # for debugging dashboard. Learn more - https://docs.litellm.ai/docs/debugging/hosted_debugging +email = None # for hosted dashboard. Learn more - https://docs.litellm.ai/docs/debugging/hosted_debugging telemetry = True max_tokens = 256 # OpenAI Defaults retry = True @@ -263,7 +263,8 @@ from .utils import ( completion_cost, get_litellm_params, Logging, - acreate + acreate, + get_model_list ) from .main import * # type: ignore from .integrations import * diff --git a/litellm/__pycache__/__init__.cpython-311.pyc b/litellm/__pycache__/__init__.cpython-311.pyc index a833b03a98c989cdc579137be4fec83068363894..e1fe4f2c93e44729df6fd75ad3b01b87b45bb624 100644 GIT binary patch delta 782 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
    NpLybK!-_XjZ2!pF(SFwrC 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 diff --git a/litellm/tests/test_get_model_list.py b/litellm/tests/test_get_model_list.py new file mode 100644 index 0000000000..570a0e207e --- /dev/null +++ b/litellm/tests/test_get_model_list.py @@ -0,0 +1,8 @@ +import os, sys, traceback + +sys.path.insert( + 0, os.path.abspath("../..") +) # Adds the parent directory to the system path +from litellm import get_model_list + +print(get_model_list()) \ No newline at end of file diff --git a/litellm/utils.py b/litellm/utils.py index 4c4ec2abae..ad6af63c45 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -41,7 +41,7 @@ callback_list: Optional[List[str]] = [] user_logger_fn = None additional_details: Optional[Dict[str, str]] = {} local_cache: Optional[Dict[str, str]] = {} - +last_fetched_at = None ######## Model Response ######################### # All liteLLM Model responses will be in this format, Follows the OpenAI Format # https://docs.litellm.ai/docs/completion/output @@ -1007,6 +1007,24 @@ def handle_success(args, kwargs, result, start_time, end_time): ) pass +def get_model_list(): + global last_fetched_at + # if user is using hosted product -> get their updated model list - refresh every 5 minutes + user_email = (os.getenv("LITELLM_EMAIL") or litellm.email) + if user_email: + time_delta = 0 + if last_fetched_at != None: + current_time = time.time() + time_delta = current_time - last_fetched_at + if time_delta > 300 or last_fetched_at == None: + # make the api call + last_fetched_at = time.time() + response = requests.get(url="http://api.litellm.ai/get_model_list", headers={"content-type": "application/json"}, data=json.dumps({"user_email": user_email})) + print_verbose(f"get_model_list response: {response.text}") + model_list = response.json()["model_list"] + return model_list + # return litellm model list by default + return litellm.model_list def acreate(*args, **kwargs): ## Thin client to handle the acreate langchain call return litellm.acompletion(*args, **kwargs) diff --git a/pyproject.toml b/pyproject.toml index 857b07b2f6..43d85c9600 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "litellm" -version = "0.1.448" +version = "0.1.449" description = "Library to easily interface with LLM API providers" authors = ["BerriAI"] license = "MIT License"