From 704be9dcd11d19235cde3cc18bb3abe7905c1a44 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Mon, 9 Oct 2023 09:53:31 -0700 Subject: [PATCH] feat(factory.py): option to add function details to prompt, if model doesn't support functions param --- litellm/__init__.py | 1 + litellm/__pycache__/__init__.cpython-311.pyc | Bin 13216 -> 13276 bytes litellm/__pycache__/main.cpython-311.pyc | Bin 50535 -> 50880 bytes litellm/__pycache__/utils.cpython-311.pyc | Bin 158894 -> 159033 bytes litellm/llms/prompt_templates/factory.py | 21 +++++- litellm/main.py | 48 ++++++------ litellm/tests/test_add_function_to_prompt.py | 75 +++++++++++++++++++ litellm/utils.py | 12 +-- 8 files changed, 130 insertions(+), 27 deletions(-) create mode 100644 litellm/tests/test_add_function_to_prompt.py diff --git a/litellm/__init__.py b/litellm/__init__.py index 84520af95..dcdf2f96a 100644 --- a/litellm/__init__.py +++ b/litellm/__init__.py @@ -41,6 +41,7 @@ model_alias_map: Dict[str, str] = {} max_budget: float = 0.0 # set the max budget across all providers _current_cost = 0 # private variable, used if max budget is set error_logs: Dict = {} +add_function_to_prompt: bool = False # if function calling not supported by api, append function call details to system prompt ############################################# def get_model_cost_map(): diff --git a/litellm/__pycache__/__init__.cpython-311.pyc b/litellm/__pycache__/__init__.cpython-311.pyc index 56dc8017c9795b38a44a3e9c308261c3eb370513..32ca5104125a1573542044b98b0aef2fdcb6a221 100644 GIT binary patch delta 2625 zcmaJ@TT>KA6rNdjQSL$rh#D~w5K;yMD540+ML>iocWf`~xZNxx-8-A!SuSF-8Z|~m z1xG~@5mB+CNu^Tz2dpH|DN~h)WXp%7Dld6U@|a4c(x(@eB<1c*^*5)#bIx~8chl6) zxnH_dpQNNDD&iU2m`CX5$<)>AA75_z%NAIH-X#Sj8RzX1PMm*EK_xbYlq`tZGl-WD zD%BNKM&d~l+1hW*S)vt@R{(i7rAfh?&MCN%C?~cpxfkMuh8W=ol?&bS|LJaDkBdaf z3ap|XV(b*7QjA?V*hQ^vP>Yn#?X!Njzh)gtO|wqhlN_z6jkH-C z99ipe`GP7+iV=SB_CXt1Jd4!K?T4gng|z-RMpeeQMN6-Ur0whNq0QLd3llri@Lm}P5k9(il$3dBxUEsN>bqI;x2XG{qF~L=)H@5om}hFdI#vHX^Vmrogw+1nMFJ z%`pZ3jwVna5!f3;z&2hSO`u^>;C0dx76`oR6l~*1-3s0_uc8ilPa5H#2&PFeoswx@ zWcCWCOEN8s%s#<%OQsbV+~!tM4}K5tciT{}OJcXg7KwW$_5q@UqS+472$BUmp&+SQszmBY2k9hTq?^=}Km%EnCB3AF z^x>|V6m*De75^Q&WuHB`7x&?V7~wQId&eMm$r|7 z%r2k{!VXknlYYW3qKneur*%`VN2tYa zpd0Kay2);#Tap`~Q*wa=^tSwt(mQM#O|!e`E}KC!>>j$uX3;FWkM6U%x6qtSI!Pa} zc{DHWG5U}_LXU*4b}B`uf~%6hQCEkuG>o17evix44Uf|_oL+7)uNnM4CCTO}6I;I} z_)A)|s+L;sr01$NR$F@A+MR;_RNAg7>!c$}mr8&(3 zPBiRv86K02n7qPj%~+cW$)S}xCLUAoALaF8+Gvesl&F=#&ohoEB(;NX2SBH_W?fNs z7sMwF5iT^GnjW%yHOhFeh1M0v_d(d8b#+~R)xXk!bOB%h0x$poO1vMS7hn*80T{v5 zH%j7DABPgc9qS%9FATPAEK$n}zzaLoP%5R& zSFCx&It{Px;^WICC!!CRW)gk{$Rru*G6o1I{3&?Q<;FiLtw)7uz^Ij-fx9u+!@y+{A$qWAY_SY-zpz{xa CwW*E( delta 2574 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 Lx3e@lx~9m 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 delta 8740 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 diff --git a/litellm/llms/prompt_templates/factory.py b/litellm/llms/prompt_templates/factory.py index 091f8aa95..e26a846fb 100644 --- a/litellm/llms/prompt_templates/factory.py +++ b/litellm/llms/prompt_templates/factory.py @@ -200,6 +200,24 @@ def hf_chat_template(model: str, messages: list): except: raise Exception("Error rendering template") +# Function call template +def function_call_prompt(messages: list, functions: list): + function_prompt = "The following functions are available to you:" + for function in functions: + function_prompt += f"""\n{function}\n""" + + function_added_to_prompt = False + for message in messages: + if "system" in message["role"]: + message['content'] += f"""{function_prompt}""" + function_added_to_prompt = True + + if function_added_to_prompt == False: + messages.append({'role': 'system', 'content': f"""{function_prompt}"""}) + + return messages + + # Custom prompt template def custom_prompt(role_dict: dict, messages: list, initial_prompt_value: str="", final_prompt_value: str=""): prompt = initial_prompt_value @@ -243,4 +261,5 @@ def prompt_factory(model: str, messages: list, custom_llm_provider: Optional[str else: return hf_chat_template(original_model_name, messages) except: - return default_pt(messages=messages) # default that covers Bloom, T-5, any non-chat tuned model (e.g. base Llama2) \ No newline at end of file + return default_pt(messages=messages) # default that covers Bloom, T-5, any non-chat tuned model (e.g. base Llama2) + \ No newline at end of file diff --git a/litellm/main.py b/litellm/main.py index 35f3d7f17..8d8930ca4 100644 --- a/litellm/main.py +++ b/litellm/main.py @@ -28,7 +28,7 @@ from litellm.utils import ( completion_with_fallbacks, get_llm_provider, get_api_key, - mock_completion_streaming_obj, + mock_completion_streaming_obj ) from .llms import ( anthropic, @@ -48,7 +48,7 @@ from .llms import ( oobabooga, palm, vertex_ai) -from .llms.prompt_templates.factory import prompt_factory, custom_prompt +from .llms.prompt_templates.factory import prompt_factory, custom_prompt, function_call_prompt import tiktoken from concurrent.futures import ThreadPoolExecutor from typing import Callable, List, Optional, Dict @@ -259,27 +259,33 @@ def completion( api_base = "https://proxy.litellm.ai" custom_llm_provider = "openai" api_key = model_api_key + # check if user passed in any of the OpenAI optional params optional_params = get_optional_params( - functions=functions, - function_call=function_call, - temperature=temperature, - top_p=top_p, - n=n, - stream=stream, - stop=stop, - max_tokens=max_tokens, - presence_penalty=presence_penalty, - frequency_penalty=frequency_penalty, - logit_bias=logit_bias, - user=user, - request_timeout=request_timeout, - deployment_id=deployment_id, - # params to identify the model - model=model, - custom_llm_provider=custom_llm_provider, - **non_default_params - ) + functions=functions, + function_call=function_call, + temperature=temperature, + top_p=top_p, + n=n, + stream=stream, + stop=stop, + max_tokens=max_tokens, + presence_penalty=presence_penalty, + frequency_penalty=frequency_penalty, + logit_bias=logit_bias, + user=user, + request_timeout=request_timeout, + deployment_id=deployment_id, + # params to identify the model + model=model, + custom_llm_provider=custom_llm_provider, + **non_default_params + ) + + if litellm.add_function_to_prompt and optional_params.get("functions_unsupported_model", None): # if user opts to add it to prompt, when API doesn't support function calling + functions_unsupported_model = optional_params.pop("functions_unsupported_model") + messages = function_call_prompt(messages=messages, functions=functions_unsupported_model) + # For logging - save the values of the litellm-specific params passed in litellm_params = get_litellm_params( return_async=return_async, diff --git a/litellm/tests/test_add_function_to_prompt.py b/litellm/tests/test_add_function_to_prompt.py new file mode 100644 index 000000000..33d2ac2a9 --- /dev/null +++ b/litellm/tests/test_add_function_to_prompt.py @@ -0,0 +1,75 @@ +#### What this tests #### +# Allow the user to map the function to the prompt, if the model doesn't support function calling + +import sys, os, pytest +import traceback + +sys.path.insert( + 0, os.path.abspath("../..") +) # Adds the parent directory to the system path +import litellm + +## case 1: set_function_to_prompt not set +def test_function_call_non_openai_model(): + try: + model = "claude-instant-1" + messages=[{"role": "user", "content": "what's the weather in sf?"}] + functions = [ + { + "name": "get_current_weather", + "description": "Get the current weather in a given location", + "parameters": { + "type": "object", + "properties": { + "location": { + "type": "string", + "description": "The city and state, e.g. San Francisco, CA" + }, + "unit": { + "type": "string", + "enum": ["celsius", "fahrenheit"] + } + }, + "required": ["location"] + } + } + ] + response = litellm.completion(model=model, messages=messages, functions=functions) + pytest.fail(f'An error occurred') + except Exception as e: + pass + +test_function_call_non_openai_model() + +## case 2: add_function_to_prompt set +def test_function_call_non_openai_model_litellm_mod_set(): + litellm.add_function_to_prompt = True + try: + model = "claude-instant-1" + messages=[{"role": "user", "content": "what's the weather in sf?"}] + functions = [ + { + "name": "get_current_weather", + "description": "Get the current weather in a given location", + "parameters": { + "type": "object", + "properties": { + "location": { + "type": "string", + "description": "The city and state, e.g. San Francisco, CA" + }, + "unit": { + "type": "string", + "enum": ["celsius", "fahrenheit"] + } + }, + "required": ["location"] + } + } + ] + response = litellm.completion(model=model, messages=messages, functions=functions) + print(f'response: {response}') + except Exception as e: + pytest.fail(f'An error occurred {e}') + +# test_function_call_non_openai_model_litellm_mod_set() \ No newline at end of file diff --git a/litellm/utils.py b/litellm/utils.py index 9b0c6c735..92d2f38fb 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -1001,17 +1001,20 @@ def get_optional_params( # use the openai defaults } # filter out those parameters that were passed with non-default values 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])} - + optional_params = {} ## 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") + if litellm.add_function_to_prompt: # if user opts to add it to prompt instead + optional_params["functions_unsupported_model"] = non_default_params.pop("functions") + else: + raise ValueError("LiteLLM.Exception: Function calling is not supported by this provider") def _check_valid_arg(supported_params): print_verbose(f"checking params for {model}") print_verbose(f"params passed in {passed_params}") print_verbose(f"non-default params passed in {non_default_params}") - unsupported_params = [] + unsupported_params = {} for k in non_default_params.keys(): if k not in supported_params: if k == "n" and n == 1: # langchain sends n=1 as a default value @@ -1020,12 +1023,11 @@ def get_optional_params( # use the openai defaults elif k == "request_timeout": # litellm handles request time outs pass else: - unsupported_params.append(k) + unsupported_params[k] = non_default_params[k] if unsupported_params and not litellm.drop_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"]