From 1cae080eb2886a6d56d807ef94d7a2543610f8de Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Mon, 2 Oct 2023 11:17:44 -0700 Subject: [PATCH] raise exception if optional param is not mapped to model --- litellm/__pycache__/main.cpython-311.pyc | Bin 52158 -> 52775 bytes litellm/__pycache__/utils.cpython-311.pyc | Bin 138591 -> 139442 bytes litellm/llms/huggingface_restapi.py | 10 ++ litellm/main.py | 58 +++++--- litellm/tests/test_bad_params.py | 23 +++ litellm/tests/test_completion.py | 2 - litellm/utils.py | 172 +++++++++++----------- pyproject.toml | 2 +- 8 files changed, 155 insertions(+), 112 deletions(-) diff --git a/litellm/__pycache__/main.cpython-311.pyc b/litellm/__pycache__/main.cpython-311.pyc index 3aecc0cef7d1a02a5845ddf7fa3b8cca6b35fbe9..ee29db1470c862a0691b5f5ae80e587230d2d036 100644 GIT binary patch delta 15111 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 delta 14221 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 bDI-|QQ7#io#*Y7^&BU8FjsC|Em+Sryv`Dkg diff --git a/litellm/__pycache__/utils.cpython-311.pyc b/litellm/__pycache__/utils.cpython-311.pyc index 49bb12921517cfaad0f5bd809a143bc48ed65467..63406a90ec5f4ba623eb96f16df442002b6cdd74 100644 GIT binary patch delta 16678 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 a`(tZrdUvj%Wf|S7AHjKnThi2e?f(U@mCY3Z delta 15425 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 diff --git a/litellm/llms/huggingface_restapi.py b/litellm/llms/huggingface_restapi.py index 4f631c7ab..6c0231312 100644 --- a/litellm/llms/huggingface_restapi.py +++ b/litellm/llms/huggingface_restapi.py @@ -17,6 +17,11 @@ class HuggingfaceError(Exception): self.message ) # Call the base class constructor with the parameters it needs +# contains any default values we need to pass to the provider +HuggingfaceConfig = { + "return_full_text": False # override by setting - completion(..,return_full_text=True) +} + def validate_environment(api_key): headers = { "content-type": "application/json", @@ -101,6 +106,11 @@ def completion( else: completion_url = f"https://api-inference.huggingface.co/models/{model}" + ## Load Config + for k, v in HuggingfaceConfig.items(): + if k not in optional_params: + optional_params[k] = v + ### MAP INPUT PARAMS if task == "conversational": inference_params = copy.deepcopy(optional_params) diff --git a/litellm/main.py b/litellm/main.py index 145390ceb..0e595adf1 100644 --- a/litellm/main.py +++ b/litellm/main.py @@ -154,14 +154,14 @@ def completion( messages: List = [], functions: List = [], function_call: str = "", # optional params - temperature: float = 1, - top_p: float = 1, - n: int = 1, + temperature: Optional[float] = None, + top_p: Optional[float] = None, + n: Optional[int] = None, stream: bool = False, stop=None, max_tokens: float = float("inf"), - presence_penalty: float = 0, - frequency_penalty=0, + presence_penalty: Optional[float] = None, + frequency_penalty: Optional[float]=None, logit_bias: dict = {}, user: str = "", deployment_id = None, @@ -214,14 +214,15 @@ def completion( litellm_logging_obj = kwargs.get('litellm_logging_obj', None) id = kwargs.get('id', None) metadata = kwargs.get('metadata', None) - request_timeout = kwargs.get('request_timeout', 0) fallbacks = kwargs.get('fallbacks', []) ######## end of unpacking kwargs ########### - + args = locals() + openai_params = ["functions", "function_call", "temperature", "temperature", "top_p", "n", "stream", "stop", "max_tokens", "presence_penalty", "frequency_penalty", "logit_bias", "user", "metadata"] + litellm_params = ["return_async", "mock_response", "api_key", "api_version", "api_base", "force_timeout", "logger_fn", "verbose", "custom_llm_provider", "litellm_logging_obj", "litellm_call_id", "id", "metadata", "fallbacks"] + default_params = openai_params + litellm_params + non_default_params = {k: v for k,v in kwargs.items() if k not in default_params} # model-specific params - pass them straight to the model/provider if mock_response: return mock_completion(model, messages, stream=stream, mock_response=mock_response) - - args = locals() try: logging = litellm_logging_obj if fallbacks != []: @@ -260,10 +261,7 @@ def completion( # params to identify the model model=model, custom_llm_provider=custom_llm_provider, - top_k=kwargs.get('top_k', 40), - task=kwargs.get('task', "text-generation-inference"), - remove_input=kwargs.get('remove_input', True), - return_full_text=kwargs.get('return_full_text', False), + **non_default_params ) # For logging - save the values of the litellm-specific params passed in litellm_params = get_litellm_params( @@ -822,8 +820,10 @@ def completion( # vertexai does not use an API key, it looks for credentials.json in the environment prompt = " ".join([message["content"] for message in messages]) - ## LOGGING - logging.pre_call(input=prompt, api_key=None) + # contains any default values we need to pass to the provider + VertexAIConfig = { + "top_k": 40 # override by setting kwarg in completion() - e.g. completion(..., top_k=20) + } if model in litellm.vertex_chat_models: chat_model = ChatModel.from_pretrained(model) else: # vertex_code_chat_models @@ -831,7 +831,16 @@ def completion( chat = chat_model.start_chat() - if stream: + ## Load Config + for k, v in VertexAIConfig.items(): + if k not in optional_params: + optional_params[k] = v + + print(f"optional_params: {optional_params}") + ## LOGGING + logging.pre_call(input=prompt, api_key=None, additional_args={"complete_input_dict": optional_params}) + + if "stream" in optional_params and optional_params["stream"] == True: model_response = chat.send_message_streaming(prompt, **optional_params) response = CustomStreamWrapper( model_response, model, custom_llm_provider="vertex_ai", logging_obj=logging @@ -875,16 +884,27 @@ def completion( ) # vertexai does not use an API key, it looks for credentials.json in the environment + # contains any default values we need to pass to the provider + VertexAIConfig = { + "top_k": 40 # override by setting kwarg in completion() - e.g. completion(..., top_k=20) + } + prompt = " ".join([message["content"] for message in messages]) - ## LOGGING - logging.pre_call(input=prompt, api_key=None) if model in litellm.vertex_text_models: vertex_model = TextGenerationModel.from_pretrained(model) else: vertex_model = CodeGenerationModel.from_pretrained(model) + + ## Load Config + for k, v in VertexAIConfig.items(): + if k not in optional_params: + optional_params[k] = v - if stream: + ## LOGGING + logging.pre_call(input=prompt, api_key=None) + + if "stream" in optional_params and optional_params["stream"] == True: model_response = vertex_model.predict_streaming(prompt, **optional_params) response = CustomStreamWrapper( model_response, model, custom_llm_provider="vertexai", logging_obj=logging diff --git a/litellm/tests/test_bad_params.py b/litellm/tests/test_bad_params.py index 046edb46d..8cd1047af 100644 --- a/litellm/tests/test_bad_params.py +++ b/litellm/tests/test_bad_params.py @@ -31,6 +31,29 @@ def test_completion_with_empty_model(): print(f"error occurred: {e}") pass +def test_completion_return_full_text_hf(): + try: + response = completion(model="dolphin", messages=messages, remove_input=True) + # check if input in response + assert "Hello, how are you?" not in response["choices"][0]["message"]["content"] + except Exception as e: + if "Function calling is not supported by this provider" in str(e): + pass + else: + pytest.fail(f'An error occurred {e}') + +# test_completion_return_full_text_hf() + +def test_completion_invalid_param_cohere(): + try: + response = completion(model="command-nightly", messages=messages, top_p=1) + except Exception as e: + if "Function calling is not supported by this provider" in str(e): + pass + else: + pytest.fail(f'An error occurred {e}') + +# test_completion_invalid_param_cohere() def test_completion_function_call_cohere(): try: diff --git a/litellm/tests/test_completion.py b/litellm/tests/test_completion.py index 9ea1a9e69..6377e8e8b 100644 --- a/litellm/tests/test_completion.py +++ b/litellm/tests/test_completion.py @@ -888,8 +888,6 @@ def test_completion_bedrock_ai21(): # test_completion_custom_api_base() # def test_vertex_ai(): -# litellm.vertex_project = "hardy-device-386718" -# litellm.vertex_location = "us-central1" # test_models = litellm.vertex_chat_models + litellm.vertex_code_chat_models + litellm.vertex_text_models + litellm.vertex_code_text_models # for model in test_models: # try: diff --git a/litellm/utils.py b/litellm/utils.py index a976dfde6..1398d056d 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -931,59 +931,62 @@ def get_optional_params( # use the openai defaults # 12 optional params functions=[], function_call="", - temperature=1, - top_p=1, - n=1, + temperature=None, + top_p=None, + n=None, stream=False, stop=None, - max_tokens=float("inf"), - presence_penalty=0, + max_tokens=None, + presence_penalty=None, frequency_penalty=0, logit_bias={}, - num_beams=1, - remove_input=False, # for nlp_cloud user="", deployment_id=None, model=None, custom_llm_provider="", - top_k=40, - return_full_text=False, - task=None, + **kwargs ): # retrieve all parameters passed to the function passed_params = locals() + special_params = passed_params.pop("kwargs") + for k, v in special_params.items(): + passed_params[k] = v default_params = { "functions":[], "function_call":"", - "temperature":1, - "top_p":1, - "n":1, - "stream":False, + "temperature":None, + "top_p":None, + "n":None, + "stream":None, "stop":None, - "max_tokens":float("inf"), - "presence_penalty":0, - "frequency_penalty":0, + "max_tokens":None, + "presence_penalty":None, + "frequency_penalty":None, "logit_bias":{}, - "num_beams":1, - "remove_input":False, # for nlp_cloud "user":"", "deployment_id":None, "model":None, "custom_llm_provider":"", - "top_k":40, - "return_full_text":False, - "task":None, } # filter out those parameters that were passed with non-default values - non_default_params = {k: v for k, v in passed_params.items() if v != default_params[k]} + non_default_params = {k: v for k, v in passed_params.items() if (k != "model" and k != "custom_llm_provider" and k in default_params and v != default_params[k])} ## raise exception if function calling passed in for a provider that doesn't support it if "functions" in non_default_params or "function_call" in non_default_params: if custom_llm_provider != "openai" and custom_llm_provider != "text-completion-openai" and custom_llm_provider != "azure": raise ValueError("LiteLLM.Exception: Function calling is not supported by this provider") + def _check_valid_arg(supported_params): + unsupported_params = [k for k in non_default_params.keys() if k not in supported_params] + if unsupported_params: + raise ValueError("LiteLLM.Exception: Unsupported parameters passed: {}".format(', '.join(unsupported_params))) + + ## raise exception if provider doesn't support passed in param optional_params = {} if custom_llm_provider == "anthropic": + ## check if unsupported param passed in + supported_params = ["stream", "stop", "temperature", "top_p", "max_tokens"] + _check_valid_arg(supported_params=supported_params) # handle anthropic params if stream: optional_params["stream"] = stream @@ -997,6 +1000,9 @@ def get_optional_params( # use the openai defaults optional_params["max_tokens_to_sample"] = max_tokens return optional_params elif custom_llm_provider == "cohere": + ## check if unsupported param passed in + supported_params = ["stream", "temperature", "max_tokens", "logit_bias"] + _check_valid_arg(supported_params=supported_params) # handle cohere params if stream: optional_params["stream"] = stream @@ -1008,6 +1014,10 @@ def get_optional_params( # use the openai defaults optional_params["logit_bias"] = logit_bias return optional_params elif custom_llm_provider == "replicate": + ## check if unsupported param passed in + supported_params = ["stream", "temperature", "max_tokens", "top_p", "stop"] + _check_valid_arg(supported_params=supported_params) + if stream: optional_params["stream"] = stream return optional_params @@ -1020,11 +1030,13 @@ def get_optional_params( # use the openai defaults optional_params["temperature"] = temperature if top_p != 1: optional_params["top_p"] = top_p - if top_k != 40: - optional_params["top_k"] = top_k if stop != None: optional_params["stop_sequences"] = stop elif custom_llm_provider == "huggingface": + ## check if unsupported param passed in + supported_params = ["stream", "temperature", "max_tokens", "top_p", "stop", "return_full_text", "details"] + _check_valid_arg(supported_params=supported_params) + if temperature != 1: optional_params["temperature"] = temperature if top_p != 1: @@ -1042,16 +1054,17 @@ def get_optional_params( # use the openai defaults optional_params["repetition_penalty"] = presence_penalty optional_params["return_full_text"] = return_full_text optional_params["details"] = True - optional_params["task"] = task elif custom_llm_provider == "together_ai": + ## check if unsupported param passed in + supported_params = ["stream", "temperature", "max_tokens", "top_p", "stop", "frequency_penalty"] + _check_valid_arg(supported_params=supported_params) + if stream: optional_params["stream_tokens"] = stream if temperature != 1: optional_params["temperature"] = temperature if top_p != 1: optional_params["top_p"] = top_p - if top_k != 40: - optional_params["top_k"] = top_k if max_tokens != float("inf"): optional_params["max_tokens"] = max_tokens if frequency_penalty != 0: @@ -1059,41 +1072,29 @@ def get_optional_params( # use the openai defaults if stop != None: optional_params["stop"] = stop #TG AI expects a list, example ["\n\n\n\n","<|endoftext|>"] elif custom_llm_provider == "palm": + ## check if unsupported param passed in + supported_params = ["temperature", "top_p"] + _check_valid_arg(supported_params=supported_params) + if temperature != 1: optional_params["temperature"] = temperature if top_p != 1: optional_params["top_p"] = top_p elif ( - model in litellm.vertex_chat_models or model in litellm.vertex_code_chat_models - ): # chat-bison has diff args from chat-bison@001, ty Google :) + custom_llm_provider == "vertex_ai" + ): + ## check if unsupported param passed in + supported_params = ["temperature", "top_p", "max_tokens", "stream"] + _check_valid_arg(supported_params=supported_params) + if temperature != 1: optional_params["temperature"] = temperature if top_p != 1: optional_params["top_p"] = top_p + if stream: + optional_params["stream"] = stream if max_tokens != float("inf"): optional_params["max_output_tokens"] = max_tokens - elif model in litellm.vertex_text_models: - # required params for all text vertex calls - # temperature=0.2, top_p=0.1, top_k=20 - # always set temperature, top_p, top_k else, text bison fails - optional_params["temperature"] = temperature - optional_params["top_p"] = top_p - optional_params["top_k"] = top_k - if max_tokens != float("inf"): - optional_params["max_output_tokens"] = max_tokens - elif model in model in litellm.vertex_code_text_models: - optional_params["temperature"] = temperature - if max_tokens != float("inf"): - optional_params["max_output_tokens"] = max_tokens - elif custom_llm_provider == "baseten": - optional_params["temperature"] = temperature - optional_params["stream"] = stream - if top_p != 1: - optional_params["top_p"] = top_p - optional_params["top_k"] = top_k - optional_params["num_beams"] = num_beams - if max_tokens != float("inf"): - optional_params["max_new_tokens"] = max_tokens elif custom_llm_provider == "sagemaker": if "llama-2" in model: # llama-2 models on sagemaker support the following args @@ -1103,14 +1104,24 @@ def get_optional_params( # use the openai defaults top_p: In each step of text generation, sample from the smallest possible set of words with cumulative probability top_p. If specified, it must be a float between 0 and 1. return_full_text: If True, input text will be part of the output generated text. If specified, it must be boolean. The default value for it is False. """ + ## check if unsupported param passed in + supported_params = ["temperature", "max_tokens"] + _check_valid_arg(supported_params=supported_params) + if max_tokens != float("inf"): optional_params["max_new_tokens"] = max_tokens if temperature != 1: optional_params["temperature"] = temperature if top_p != 1: optional_params["top_p"] = top_p + else: + ## check if unsupported param passed in + supported_params = [] + _check_valid_arg(supported_params=supported_params) elif custom_llm_provider == "bedrock": if "ai21" in model: + supported_params = ["max_tokens", "temperature", "stop", "top_p"] + _check_valid_arg(supported_params=supported_params) # params "maxTokens":200,"temperature":0,"topP":250,"stop_sequences":[], # https://us-west-2.console.aws.amazon.com/bedrock/home?region=us-west-2#/providers?model=j2-ultra if max_tokens != float("inf"): @@ -1122,8 +1133,10 @@ def get_optional_params( # use the openai defaults if top_p != 1: optional_params["topP"] = top_p elif "anthropic" in model: + supported_params = ["max_tokens", "temperature", "stop", "top_p"] + _check_valid_arg(supported_params=supported_params) # anthropic params on bedrock - # \"max_tokens_to_sample\":300,\"temperature\":0.5,\"top_k\":250,\"top_p\":1,\"stop_sequences\":[\"\\\\n\\\\nHuman:\"]}" + # \"max_tokens_to_sample\":300,\"temperature\":0.5,\"top_p\":1,\"stop_sequences\":[\"\\\\n\\\\nHuman:\"]}" if max_tokens != float("inf"): optional_params["max_tokens_to_sample"] = max_tokens else: @@ -1132,11 +1145,11 @@ def get_optional_params( # use the openai defaults optional_params["temperature"] = temperature if top_p != 1: optional_params["top_p"] = top_p - if top_k != 40: - optional_params["top_k"] = top_k if stop != None: optional_params["stop_sequences"] = stop elif "amazon" in model: # amazon titan llms + supported_params = ["max_tokens", "temperature", "stop", "top_p"] + _check_valid_arg(supported_params=supported_params) # see https://us-west-2.console.aws.amazon.com/bedrock/home?region=us-west-2#/providers?model=titan-large if max_tokens != float("inf"): optional_params["maxTokenCount"] = max_tokens @@ -1148,14 +1161,14 @@ def get_optional_params( # use the openai defaults optional_params["topP"] = top_p elif model in litellm.aleph_alpha_models: + supported_params = ["max_tokens", "stream", "top_p", "temperature", "presence_penalty", "frequency_penalty", "n", "stop"] + _check_valid_arg(supported_params=supported_params) if max_tokens != float("inf"): optional_params["maximum_tokens"] = max_tokens if stream: optional_params["stream"] = stream if temperature != 1: optional_params["temperature"] = temperature - if top_k != 40: - optional_params["top_k"] = top_k if top_p != 1: optional_params["top_p"] = top_p if presence_penalty != 0: @@ -1167,29 +1180,28 @@ def get_optional_params( # use the openai defaults if stop != None: optional_params["stop_sequences"] = stop elif model in litellm.nlp_cloud_models or custom_llm_provider == "nlp_cloud": + supported_params = ["max_tokens", "stream", "temperature", "top_p", "presence_penalty", "frequency_penalty", "n", "stop"] + _check_valid_arg(supported_params=supported_params) + if max_tokens != float("inf"): optional_params["max_length"] = max_tokens if stream: optional_params["stream"] = stream if temperature != 1: optional_params["temperature"] = temperature - if top_k != 40: - optional_params["top_k"] = top_k if top_p != 1: optional_params["top_p"] = top_p if presence_penalty != 0: optional_params["presence_penalty"] = presence_penalty if frequency_penalty != 0: optional_params["frequency_penalty"] = frequency_penalty - if num_beams != 1: - optional_params["num_beams"] = num_beams if n != 1: optional_params["num_return_sequences"] = n - if remove_input == True: - optional_params["remove_input"] = True if stop != None: optional_params["stop_sequences"] = stop elif model in litellm.petals_models or custom_llm_provider == "petals": + supported_params = ["max_tokens", "temperature", "top_p"] + _check_valid_arg(supported_params=supported_params) # max_new_tokens=1,temperature=0.9, top_p=0.6 if max_tokens != float("inf"): optional_params["max_new_tokens"] = max_tokens @@ -1200,33 +1212,13 @@ def get_optional_params( # use the openai defaults if top_p != 1: optional_params["top_p"] = top_p else: # assume passing in params for openai/azure openai - if functions != []: - optional_params["functions"] = functions - if function_call != "": - optional_params["function_call"] = function_call - if temperature != 1: - optional_params["temperature"] = temperature - if top_p != 1: - optional_params["top_p"] = top_p - if n != 1: - optional_params["n"] = n - if stream: - optional_params["stream"] = stream - if stop != None: - optional_params["stop"] = stop - if max_tokens != float("inf"): - optional_params["max_tokens"] = max_tokens - if presence_penalty != 0: - optional_params["presence_penalty"] = presence_penalty - if frequency_penalty != 0: - optional_params["frequency_penalty"] = frequency_penalty - if logit_bias != {}: - optional_params["logit_bias"] = logit_bias - if user != "": - optional_params["user"] = user - if deployment_id != None: - optional_params["deployment_id"] = deployment_id - return optional_params + supported_params = ["functions", "function_call", "temperature", "top_p", "n", "stream", "stop", "max_tokens", "presence_penalty", "logit_bias", "user", "deployment_id"] + _check_valid_arg(supported_params=supported_params) + optional_params = non_default_params + # if user passed in non-default kwargs for specific providers/models, pass them along + for k in passed_params.keys(): + if k not in default_params.keys(): + optional_params[k] = passed_params[k] return optional_params def get_llm_provider(model: str, custom_llm_provider: Optional[str] = None): diff --git a/pyproject.toml b/pyproject.toml index 033878ba7..129acb1c2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "litellm" -version = "0.1.808" +version = "0.1.809" description = "Library to easily interface with LLM API providers" authors = ["BerriAI"] license = "MIT License"