From 13eb40e7bd141b416eac2e3cc64101aee534c213 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Sat, 20 Jan 2024 08:39:52 -0800 Subject: [PATCH 01/18] v0 using custom_key_generate --- .../proxy/example_config_yaml/custom_auth.py | 39 ++++++++++++++++++- litellm/proxy/proxy_config.yaml | 5 ++- litellm/proxy/proxy_server.py | 23 +++++++++-- 3 files changed, 61 insertions(+), 6 deletions(-) diff --git a/litellm/proxy/example_config_yaml/custom_auth.py b/litellm/proxy/example_config_yaml/custom_auth.py index 416b66682..a764a647a 100644 --- a/litellm/proxy/example_config_yaml/custom_auth.py +++ b/litellm/proxy/example_config_yaml/custom_auth.py @@ -1,4 +1,4 @@ -from litellm.proxy._types import UserAPIKeyAuth +from litellm.proxy._types import UserAPIKeyAuth, GenerateKeyRequest from fastapi import Request from dotenv import load_dotenv import os @@ -14,3 +14,40 @@ async def user_api_key_auth(request: Request, api_key: str) -> UserAPIKeyAuth: raise Exception except: raise Exception + + +async def generate_key_fn(data: GenerateKeyRequest): + """ + Asynchronously decides if a key should be generated or not based on the provided data. + + Args: + data (GenerateKeyRequest): The data to be used for decision making. + + Returns: + bool: True if a key should be generated, False otherwise. + """ + # decide if a key should be generated or not + data_json = data.json() # type: ignore + + # Unpacking variables + team_id = data_json.get("team_id") + duration = data_json.get("duration") + models = data_json.get("models") + aliases = data_json.get("aliases") + config = data_json.get("config") + spend = data_json.get("spend") + user_id = data_json.get("user_id") + max_parallel_requests = data_json.get("max_parallel_requests") + metadata = data_json.get("metadata") + tpm_limit = data_json.get("tpm_limit") + rpm_limit = data_json.get("rpm_limit") + + if team_id is not None and len(team_id) > 0: + return { + "decision": True, + } + else: + return { + "decision": True, + "message": "This violates LiteLLM Proxy Rules. No team id provided.", + } diff --git a/litellm/proxy/proxy_config.yaml b/litellm/proxy/proxy_config.yaml index 417b4c6f1..29aa3cf4f 100644 --- a/litellm/proxy/proxy_config.yaml +++ b/litellm/proxy/proxy_config.yaml @@ -62,8 +62,9 @@ litellm_settings: # setting callback class # callbacks: custom_callbacks.proxy_handler_instance # sets litellm.callbacks = [proxy_handler_instance] -# general_settings: -# master_key: sk-1234 +general_settings: + master_key: sk-1234 + custom_key_generate: custom_auth.generate_key_fn # database_type: "dynamo_db" # database_args: { # 👈 all args - https://github.com/BerriAI/litellm/blob/befbcbb7ac8f59835ce47415c128decf37aac328/litellm/proxy/_types.py#L190 # "billing_mode": "PAY_PER_REQUEST", diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index fafc41457..f032c5ec2 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -187,6 +187,7 @@ prisma_client: Optional[PrismaClient] = None custom_db_client: Optional[DBClient] = None user_api_key_cache = DualCache() user_custom_auth = None +user_custom_key_generate = None use_background_health_checks = None use_queue = False health_check_interval = None @@ -874,7 +875,7 @@ class ProxyConfig: """ Load config values into proxy global state """ - global master_key, user_config_file_path, otel_logging, user_custom_auth, user_custom_auth_path, use_background_health_checks, health_check_interval, use_queue, custom_db_client + global master_key, user_config_file_path, otel_logging, user_custom_auth, user_custom_auth_path, user_custom_key_generate, use_background_health_checks, health_check_interval, use_queue, custom_db_client # Load existing config config = await self.get_config(config_file_path=config_file_path) @@ -1052,6 +1053,12 @@ class ProxyConfig: user_custom_auth = get_instance_fn( value=custom_auth, config_file_path=config_file_path ) + + custom_key_generate = general_settings.get("custom_key_generate", None) + if custom_key_generate is not None: + user_custom_key_generate = get_instance_fn( + value=custom_key_generate, config_file_path=config_file_path + ) ## dynamodb database_type = general_settings.get("database_type", None) if database_type is not None and ( @@ -2156,7 +2163,16 @@ async def generate_key_fn( - expires: (datetime) Datetime object for when key expires. - user_id: (str) Unique user id - used for tracking spend across multiple keys for same user id. """ + global user_custom_key_generate verbose_proxy_logger.debug("entered /key/generate") + + if user_custom_key_generate is not None: + result = await user_custom_key_generate(data) + decision = result.get("decision", True) + message = result.get("message", "Authentication Failed - Custom Auth Rule") + if not decision: + raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=message) + data_json = data.json() # type: ignore response = await generate_key_helper_fn(**data_json) return GenerateKeyResponse( @@ -2924,7 +2940,7 @@ async def get_routes(): @router.on_event("shutdown") async def shutdown_event(): - global prisma_client, master_key, user_custom_auth + global prisma_client, master_key, user_custom_auth, user_custom_key_generate if prisma_client: verbose_proxy_logger.debug("Disconnecting from Prisma") await prisma_client.disconnect() @@ -2934,7 +2950,7 @@ async def shutdown_event(): def cleanup_router_config_variables(): - global master_key, user_config_file_path, otel_logging, user_custom_auth, user_custom_auth_path, use_background_health_checks, health_check_interval, prisma_client, custom_db_client + global master_key, user_config_file_path, otel_logging, user_custom_auth, user_custom_auth_path, user_custom_key_generate, use_background_health_checks, health_check_interval, prisma_client, custom_db_client # Set all variables to None master_key = None @@ -2942,6 +2958,7 @@ def cleanup_router_config_variables(): otel_logging = None user_custom_auth = None user_custom_auth_path = None + user_custom_key_generate = None use_background_health_checks = None health_check_interval = None prisma_client = None From 480f237fb5b91d90331af259425d5cfeab16aa2a Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Sat, 20 Jan 2024 09:59:04 -0800 Subject: [PATCH 02/18] (test) add custom_key_generate test --- litellm/tests/test_key_generate_prisma.py | 81 +++++++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/litellm/tests/test_key_generate_prisma.py b/litellm/tests/test_key_generate_prisma.py index 004aef63a..3f844335b 100644 --- a/litellm/tests/test_key_generate_prisma.py +++ b/litellm/tests/test_key_generate_prisma.py @@ -33,6 +33,7 @@ import pytest, logging, asyncio import litellm, asyncio from litellm.proxy.proxy_server import ( new_user, + generate_key_fn, user_api_key_auth, user_update, delete_key_fn, @@ -49,6 +50,7 @@ from litellm.proxy._types import ( DynamoDBArgs, DeleteKeyRequest, UpdateKeyRequest, + GenerateKeyRequest, ) from litellm.proxy.utils import DBClient from starlette.datastructures import URL @@ -593,3 +595,82 @@ def test_generate_and_update_key(prisma_client): print("Got Exception", e) print(e.detail) pytest.fail(f"An exception occurred - {str(e)}") + + +def test_key_generate_with_custom_auth(prisma_client): + # custom - generate key function + async def custom_generate_key_fn(data: GenerateKeyRequest): + """ + Asynchronously decides if a key should be generated or not based on the provided data. + + Args: + data (GenerateKeyRequest): The data to be used for decision making. + + Returns: + bool: True if a key should be generated, False otherwise. + """ + # decide if a key should be generated or not + print("using custom auth function!") + data_json = data.json() # type: ignore + + # Unpacking variables + team_id = data_json.get("team_id") + duration = data_json.get("duration") + models = data_json.get("models") + aliases = data_json.get("aliases") + config = data_json.get("config") + spend = data_json.get("spend") + user_id = data_json.get("user_id") + max_parallel_requests = data_json.get("max_parallel_requests") + metadata = data_json.get("metadata") + tpm_limit = data_json.get("tpm_limit") + rpm_limit = data_json.get("rpm_limit") + + if team_id is not None and team_id == "litellm-core-infra@gmail.com": + # only team_id="litellm-core-infra@gmail.com" can make keys + return { + "decision": True, + } + else: + print("Failed custom auth") + return { + "decision": False, + "message": "This violates LiteLLM Proxy Rules. No team id provided.", + } + + setattr(litellm.proxy.proxy_server, "prisma_client", prisma_client) + setattr(litellm.proxy.proxy_server, "master_key", "sk-1234") + setattr( + litellm.proxy.proxy_server, "user_custom_key_generate", custom_generate_key_fn + ) + try: + + async def test(): + await litellm.proxy.proxy_server.prisma_client.connect() + try: + request = GenerateKeyRequest() + key = await generate_key_fn(request) + pytest.fail(f"Expected an exception. Got {key}") + except Exception as e: + # this should fail + print("Got Exception", e) + print(e.detail) + print("First request failed!. This is expected") + assert ( + "This violates LiteLLM Proxy Rules. No team id provided." + in e.detail + ) + + request_2 = GenerateKeyRequest( + team_id="litellm-core-infra@gmail.com", + ) + + key = await generate_key_fn(request_2) + print(key) + generated_key = key.key + + asyncio.run(test()) + except Exception as e: + print("Got Exception", e) + print(e.detail) + pytest.fail(f"An exception occurred - {str(e)}") From 6b7fd172a3970c78bc275a89ee049aa94a574e59 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Sat, 20 Jan 2024 10:12:47 -0800 Subject: [PATCH 03/18] (docs) Custom /key/generate --- docs/my-website/docs/proxy/virtual_keys.md | 91 ++++++++++++++++++++++ 1 file changed, 91 insertions(+) diff --git a/docs/my-website/docs/proxy/virtual_keys.md b/docs/my-website/docs/proxy/virtual_keys.md index 1cb28a2e3..c20bbef11 100644 --- a/docs/my-website/docs/proxy/virtual_keys.md +++ b/docs/my-website/docs/proxy/virtual_keys.md @@ -392,6 +392,97 @@ general_settings: $ litellm --config /path/to/config.yaml ``` +## Custom /key/generate + +If you need to add custom logic before generating a Proxy API Key (Example Validating `team_id`) + +### 1. Write a custom `custom_generate_key_fn` + + +The input to the custom_generate_key_fn function is a single parameter: `data` [(Type: GenerateKeyRequest)](https://github.com/BerriAI/litellm/blob/main/litellm/proxy/_types.py#L125) + +The output of your `custom_generate_key_fn` should be a dictionary with the following structure +```python +{ + "decision": False, + "message": "This violates LiteLLM Proxy Rules. No team id provided.", +} + +``` + +- decision (Type: bool): A boolean value indicating whether the key generation is allowed (True) or not (False). + +- message (Type: str, Optional): An optional message providing additional information about the decision. This field is included when the decision is False. + + +```python +async def custom_generate_key_fn(data: GenerateKeyRequest)-> dict: + """ + Asynchronous function for generating a key based on the input data. + + Args: + data (GenerateKeyRequest): The input data for key generation. + + Returns: + dict: A dictionary containing the decision and an optional message. + { + "decision": False, + "message": "This violates LiteLLM Proxy Rules. No team id provided.", + } + """ + + # decide if a key should be generated or not + print("using custom auth function!") + data_json = data.json() # type: ignore + + # Unpacking variables + team_id = data_json.get("team_id") + duration = data_json.get("duration") + models = data_json.get("models") + aliases = data_json.get("aliases") + config = data_json.get("config") + spend = data_json.get("spend") + user_id = data_json.get("user_id") + max_parallel_requests = data_json.get("max_parallel_requests") + metadata = data_json.get("metadata") + tpm_limit = data_json.get("tpm_limit") + rpm_limit = data_json.get("rpm_limit") + + if team_id is not None and team_id == "litellm-core-infra@gmail.com": + # only team_id="litellm-core-infra@gmail.com" can make keys + return { + "decision": True, + } + else: + print("Failed custom auth") + return { + "decision": False, + "message": "This violates LiteLLM Proxy Rules. No team id provided.", + } +``` + + +### 2. Pass the filepath (relative to the config.yaml) + +Pass the filepath to the config.yaml + +e.g. if they're both in the same dir - `./config.yaml` and `./custom_auth.py`, this is what it looks like: +```yaml +model_list: + - model_name: "openai-model" + litellm_params: + model: "gpt-3.5-turbo" + +litellm_settings: + drop_params: True + set_verbose: True + +general_settings: + custom_key_generate: custom_auth.custom_generate_key_fn +``` + + + ## [BETA] Dynamo DB From ccfcc39681e74e71883301be17990933b26e40d3 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Sat, 20 Jan 2024 10:13:32 -0800 Subject: [PATCH 04/18] (test) custom key/generate --- litellm/tests/test_key_generate_prisma.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/litellm/tests/test_key_generate_prisma.py b/litellm/tests/test_key_generate_prisma.py index 3f844335b..5ecfc89d7 100644 --- a/litellm/tests/test_key_generate_prisma.py +++ b/litellm/tests/test_key_generate_prisma.py @@ -599,16 +599,21 @@ def test_generate_and_update_key(prisma_client): def test_key_generate_with_custom_auth(prisma_client): # custom - generate key function - async def custom_generate_key_fn(data: GenerateKeyRequest): + async def custom_generate_key_fn(data: GenerateKeyRequest) -> dict: """ - Asynchronously decides if a key should be generated or not based on the provided data. + Asynchronous function for generating a key based on the input data. Args: - data (GenerateKeyRequest): The data to be used for decision making. + data (GenerateKeyRequest): The input data for key generation. Returns: - bool: True if a key should be generated, False otherwise. + dict: A dictionary containing the decision and an optional message. + { + "decision": False, + "message": "This violates LiteLLM Proxy Rules. No team id provided.", + } """ + # decide if a key should be generated or not print("using custom auth function!") data_json = data.json() # type: ignore From 29800d1e01eb90eb5a178451dcacf13d497cf6ce Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Mon, 22 Jan 2024 12:02:02 -0800 Subject: [PATCH 05/18] fix(azure_dall_e_2.py): handle azure not returning a 'retry-after' param --- litellm/llms/azure.py | 19 +++++++++++++++---- litellm/llms/custom_httpx/azure_dall_e_2.py | 7 ++----- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/litellm/llms/azure.py b/litellm/llms/azure.py index 0eb70c86f..f20a2e939 100644 --- a/litellm/llms/azure.py +++ b/litellm/llms/azure.py @@ -629,12 +629,23 @@ class AzureChatCompletion(BaseLLM): client_session = litellm.aclient_session or httpx.AsyncClient( transport=AsyncCustomHTTPTransport(), ) - openai_aclient = AsyncAzureOpenAI( + azure_client = AsyncAzureOpenAI( http_client=client_session, **azure_client_params ) else: - openai_aclient = client - response = await openai_aclient.images.generate(**data, timeout=timeout) + azure_client = client + ## LOGGING + logging_obj.pre_call( + input=data["prompt"], + api_key=azure_client.api_key, + additional_args={ + "headers": {"api_key": azure_client.api_key}, + "api_base": azure_client._base_url._uri_reference, + "acompletion": True, + "complete_input_dict": data, + }, + ) + response = await azure_client.images.generate(**data, timeout=timeout) stringified_response = response.model_dump() ## LOGGING logging_obj.post_call( @@ -719,7 +730,7 @@ class AzureChatCompletion(BaseLLM): input=prompt, api_key=azure_client.api_key, additional_args={ - "headers": {"Authorization": f"Bearer {azure_client.api_key}"}, + "headers": {"api_key": azure_client.api_key}, "api_base": azure_client._base_url._uri_reference, "acompletion": False, "complete_input_dict": data, diff --git a/litellm/llms/custom_httpx/azure_dall_e_2.py b/litellm/llms/custom_httpx/azure_dall_e_2.py index a62e1d666..f361ede5b 100644 --- a/litellm/llms/custom_httpx/azure_dall_e_2.py +++ b/litellm/llms/custom_httpx/azure_dall_e_2.py @@ -43,7 +43,7 @@ class AsyncCustomHTTPTransport(httpx.AsyncHTTPTransport): request=request, ) - time.sleep(int(response.headers.get("retry-after")) or 10) + await asyncio.sleep(int(response.headers.get("retry-after") or 10)) response = await super().handle_async_request(request) await response.aread() @@ -95,7 +95,6 @@ class CustomHTTPTransport(httpx.HTTPTransport): request.method = "GET" response = super().handle_request(request) response.read() - timeout_secs: int = 120 start_time = time.time() while response.json()["status"] not in ["succeeded", "failed"]: @@ -112,11 +111,9 @@ class CustomHTTPTransport(httpx.HTTPTransport): content=json.dumps(timeout).encode("utf-8"), request=request, ) - - time.sleep(int(response.headers.get("retry-after")) or 10) + time.sleep(int(response.headers.get("retry-after", None) or 10)) response = super().handle_request(request) response.read() - if response.json()["status"] == "failed": error_data = response.json() return httpx.Response( From 6c39b2855fc897facbe7de83432bfcc71c413040 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Mon, 22 Jan 2024 13:54:51 -0800 Subject: [PATCH 06/18] fix(utils.py): fix async/sync streaming logging --- litellm/utils.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/litellm/utils.py b/litellm/utils.py index c690f7cc4..1fea89996 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -765,6 +765,7 @@ class Logging: self.litellm_call_id = litellm_call_id self.function_id = function_id self.streaming_chunks = [] # for generating complete stream response + self.sync_streaming_chunks = [] # for generating complete stream response self.model_call_details = {} def update_environment_variables( @@ -1094,17 +1095,17 @@ class Logging: if ( result.choices[0].finish_reason is not None ): # if it's the last chunk - self.streaming_chunks.append(result) - # print_verbose(f"final set of received chunks: {self.streaming_chunks}") + self.sync_streaming_chunks.append(result) + # print_verbose(f"final set of received chunks: {self.sync_streaming_chunks}") try: complete_streaming_response = litellm.stream_chunk_builder( - self.streaming_chunks, + self.sync_streaming_chunks, messages=self.model_call_details.get("messages", None), ) except: complete_streaming_response = None else: - self.streaming_chunks.append(result) + self.sync_streaming_chunks.append(result) if complete_streaming_response: verbose_logger.info( From 5807718a6992b7a6e1d55a76a83b7362b7c6d837 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Mon, 22 Jan 2024 14:21:30 -0800 Subject: [PATCH 07/18] (test) usage based routing with fallbacks --- litellm/tests/test_router_fallbacks.py | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/litellm/tests/test_router_fallbacks.py b/litellm/tests/test_router_fallbacks.py index 29bc0d7bf..5d17d36c9 100644 --- a/litellm/tests/test_router_fallbacks.py +++ b/litellm/tests/test_router_fallbacks.py @@ -716,7 +716,7 @@ def test_usage_based_routing_fallbacks(): # Constants for TPM and RPM allocation AZURE_FAST_TPM = 3 AZURE_BASIC_TPM = 4 - OPENAI_TPM = 2000 + OPENAI_TPM = 400 ANTHROPIC_TPM = 100000 def get_azure_params(deployment_name: str): @@ -775,6 +775,7 @@ def test_usage_based_routing_fallbacks(): model_list=model_list, fallbacks=fallbacks_list, set_verbose=True, + debug_level="DEBUG", routing_strategy="usage-based-routing", redis_host=os.environ["REDIS_HOST"], redis_port=os.environ["REDIS_PORT"], @@ -783,17 +784,32 @@ def test_usage_based_routing_fallbacks(): messages = [ {"content": "Tell me a joke.", "role": "user"}, ] - response = router.completion( - model="azure/gpt-4-fast", messages=messages, timeout=5 + model="azure/gpt-4-fast", + messages=messages, + timeout=5, + mock_response="very nice to meet you", ) print("response: ", response) print("response._hidden_params: ", response._hidden_params) - # in this test, we expect azure/gpt-4 fast to fail, then azure-gpt-4 basic to fail and then openai-gpt-4 to pass # the token count of this message is > AZURE_FAST_TPM, > AZURE_BASIC_TPM assert response._hidden_params["custom_llm_provider"] == "openai" + # now make 100 mock requests to OpenAI - expect it to fallback to anthropic-claude-instant-1.2 + for i in range(20): + response = router.completion( + model="azure/gpt-4-fast", + messages=messages, + timeout=5, + mock_response="very nice to meet you", + ) + print("response: ", response) + print("response._hidden_params: ", response._hidden_params) + if i == 19: + # by the 19th call we should have hit TPM LIMIT for OpenAI, it should fallback to anthropic-claude-instant-1.2 + assert response._hidden_params["custom_llm_provider"] == "anthropic" + except Exception as e: pytest.fail(f"An exception occurred {e}") From 982cb047645deb93b61896c54b789a77755acbf2 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Mon, 22 Jan 2024 14:22:16 -0800 Subject: [PATCH 08/18] (feat) mock_response set custom_llm_provider in hidden param --- litellm/main.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/litellm/main.py b/litellm/main.py index 271c54e51..69c912189 100644 --- a/litellm/main.py +++ b/litellm/main.py @@ -348,6 +348,13 @@ def mock_completion( prompt_tokens=10, completion_tokens=20, total_tokens=30 ) + try: + _, custom_llm_provider, _, _ = litellm.utils.get_llm_provider(model=model) + model_response._hidden_params["custom_llm_provider"] = custom_llm_provider + except: + # dont let setting a hidden param block a mock_respose + pass + return model_response except: From 14585c996602a1fd63bfcdbe5b47ee04bbc9294e Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Mon, 22 Jan 2024 14:41:55 -0800 Subject: [PATCH 09/18] (fix) router - update model_group on fallback --- litellm/router.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/litellm/router.py b/litellm/router.py index b15687f67..38ebcc1c9 100644 --- a/litellm/router.py +++ b/litellm/router.py @@ -997,6 +997,9 @@ class Router: """ try: kwargs["model"] = mg + kwargs.setdefault("metadata", {}).update( + {"model_group": mg} + ) # update model_group used, if fallbacks are done response = await self.async_function_with_retries( *args, **kwargs ) @@ -1025,8 +1028,10 @@ class Router: f"Falling back to model_group = {mg}" ) kwargs["model"] = mg - kwargs["metadata"]["model_group"] = mg - response = await self.async_function_with_retries( + kwargs.setdefault("metadata", {}).update( + {"model_group": mg} + ) # update model_group used, if fallbacks are done + response = await self.async_function_with_fallbacks( *args, **kwargs ) return response @@ -1191,6 +1196,9 @@ class Router: ## LOGGING kwargs = self.log_retry(kwargs=kwargs, e=original_exception) kwargs["model"] = mg + kwargs.setdefault("metadata", {}).update( + {"model_group": mg} + ) # update model_group used, if fallbacks are done response = self.function_with_fallbacks(*args, **kwargs) return response except Exception as e: @@ -1214,6 +1222,9 @@ class Router: ## LOGGING kwargs = self.log_retry(kwargs=kwargs, e=original_exception) kwargs["model"] = mg + kwargs.setdefault("metadata", {}).update( + {"model_group": mg} + ) # update model_group used, if fallbacks are done response = self.function_with_fallbacks(*args, **kwargs) return response except Exception as e: From 44f756efb5b46c55c3b68b39ec68f95783c5ebd7 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Mon, 22 Jan 2024 14:58:57 -0800 Subject: [PATCH 10/18] =?UTF-8?q?bump:=20version=201.18.8=20=E2=86=92=201.?= =?UTF-8?q?18.9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index d8638bd4b..de6107b67 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "litellm" -version = "1.18.8" +version = "1.18.9" description = "Library to easily interface with LLM API providers" authors = ["BerriAI"] license = "MIT" @@ -61,7 +61,7 @@ requires = ["poetry-core", "wheel"] build-backend = "poetry.core.masonry.api" [tool.commitizen] -version = "1.18.8" +version = "1.18.9" version_files = [ "pyproject.toml:^version" ] From 276a685a59bff8c13e8a09d9c439c3798e6e7f19 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Mon, 22 Jan 2024 11:15:08 -0800 Subject: [PATCH 11/18] feat(utils.py): support custom cost tracking per second https://github.com/BerriAI/litellm/issues/1374 --- litellm/_logging.py | 24 ++++++++----- litellm/main.py | 15 ++++++++ litellm/tests/test_completion.py | 7 +++- litellm/utils.py | 59 ++++++++++++++++++++------------ 4 files changed, 74 insertions(+), 31 deletions(-) diff --git a/litellm/_logging.py b/litellm/_logging.py index 0bd82a6bd..b1276c045 100644 --- a/litellm/_logging.py +++ b/litellm/_logging.py @@ -12,15 +12,6 @@ formatter = logging.Formatter("\033[92m%(name)s - %(levelname)s\033[0m: %(messag handler.setFormatter(formatter) - -def print_verbose(print_statement): - try: - if set_verbose: - print(print_statement) # noqa - except: - pass - - verbose_proxy_logger = logging.getLogger("LiteLLM Proxy") verbose_router_logger = logging.getLogger("LiteLLM Router") verbose_logger = logging.getLogger("LiteLLM") @@ -29,3 +20,18 @@ verbose_logger = logging.getLogger("LiteLLM") verbose_router_logger.addHandler(handler) verbose_proxy_logger.addHandler(handler) verbose_logger.addHandler(handler) + + +def print_verbose(print_statement): + try: + if set_verbose: + print(print_statement) # noqa + verbose_logger.setLevel(level=logging.DEBUG) # set package log to debug + verbose_router_logger.setLevel( + level=logging.DEBUG + ) # set router logs to debug + verbose_proxy_logger.setLevel( + level=logging.DEBUG + ) # set proxy logs to debug + except: + pass diff --git a/litellm/main.py b/litellm/main.py index 69c912189..7bc12ffef 100644 --- a/litellm/main.py +++ b/litellm/main.py @@ -457,6 +457,8 @@ def completion( ### CUSTOM MODEL COST ### input_cost_per_token = kwargs.get("input_cost_per_token", None) output_cost_per_token = kwargs.get("output_cost_per_token", None) + input_cost_per_second = kwargs.get("input_cost_per_second", None) + output_cost_per_second = kwargs.get("output_cost_per_second", None) ### CUSTOM PROMPT TEMPLATE ### initial_prompt_value = kwargs.get("initial_prompt_value", None) roles = kwargs.get("roles", None) @@ -596,6 +598,19 @@ def completion( } } ) + if ( + input_cost_per_second is not None + ): # time based pricing just needs cost in place + output_cost_per_second = output_cost_per_second or 0.0 + litellm.register_model( + { + model: { + "input_cost_per_second": input_cost_per_second, + "output_cost_per_second": output_cost_per_second, + "litellm_provider": custom_llm_provider, + } + } + ) ### BUILD CUSTOM PROMPT TEMPLATE -- IF GIVEN ### custom_prompt_dict = {} # type: ignore if ( diff --git a/litellm/tests/test_completion.py b/litellm/tests/test_completion.py index 247ae4676..644b348ec 100644 --- a/litellm/tests/test_completion.py +++ b/litellm/tests/test_completion.py @@ -1372,16 +1372,21 @@ def test_customprompt_together_ai(): def test_completion_sagemaker(): try: - print("testing sagemaker") litellm.set_verbose = True + print("testing sagemaker") response = completion( model="sagemaker/berri-benchmarking-Llama-2-70b-chat-hf-4", messages=messages, temperature=0.2, max_tokens=80, + input_cost_per_second=0.000420, ) # Add any assertions here to check the response print(response) + cost = completion_cost(completion_response=response) + assert ( + cost > 0.0 and cost < 1.0 + ) # should never be > $1 for a single completion call except Exception as e: pytest.fail(f"Error occurred: {e}") diff --git a/litellm/utils.py b/litellm/utils.py index 1fea89996..f4c7e93a8 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -829,7 +829,7 @@ class Logging: [f"-H '{k}: {v}'" for k, v in masked_headers.items()] ) - print_verbose(f"PRE-API-CALL ADDITIONAL ARGS: {additional_args}") + verbose_logger.debug(f"PRE-API-CALL ADDITIONAL ARGS: {additional_args}") curl_command = "\n\nPOST Request Sent from LiteLLM:\n" curl_command += "curl -X POST \\\n" @@ -995,13 +995,10 @@ class Logging: self.model_call_details["log_event_type"] = "post_api_call" # User Logging -> if you pass in a custom logging function - print_verbose( + verbose_logger.info( f"RAW RESPONSE:\n{self.model_call_details.get('original_response', self.model_call_details)}\n\n" ) - print_verbose( - f"Logging Details Post-API Call: logger_fn - {self.logger_fn} | callable(logger_fn) - {callable(self.logger_fn)}" - ) - print_verbose( + verbose_logger.debug( f"Logging Details Post-API Call: LiteLLM Params: {self.model_call_details}" ) if self.logger_fn and callable(self.logger_fn): @@ -2135,7 +2132,7 @@ def client(original_function): litellm.cache.add_cache(result, *args, **kwargs) # LOG SUCCESS - handle streaming success logging in the _next_ object, remove `handle_success` once it's deprecated - print_verbose(f"Wrapper: Completed Call, calling success_handler") + verbose_logger.info(f"Wrapper: Completed Call, calling success_handler") threading.Thread( target=logging_obj.success_handler, args=(result, start_time, end_time) ).start() @@ -2807,7 +2804,11 @@ def token_counter( def cost_per_token( - model="", prompt_tokens=0, completion_tokens=0, custom_llm_provider=None + model="", + prompt_tokens=0, + completion_tokens=0, + response_time_ms=None, + custom_llm_provider=None, ): """ Calculates the cost per token for a given model, prompt tokens, and completion tokens. @@ -2829,15 +2830,29 @@ def cost_per_token( else: model_with_provider = model # see this https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models - print_verbose(f"Looking up model={model} in model_cost_map") + verbose_logger.debug(f"Looking up model={model} in model_cost_map") if model in model_cost_ref: - prompt_tokens_cost_usd_dollar = ( - model_cost_ref[model]["input_cost_per_token"] * prompt_tokens - ) - completion_tokens_cost_usd_dollar = ( - model_cost_ref[model]["output_cost_per_token"] * completion_tokens - ) + if ( + model_cost_ref[model].get("input_cost_per_token", None) is not None + and model_cost_ref[model].get("output_cost_per_token", None) is not None + ): + ## COST PER TOKEN ## + prompt_tokens_cost_usd_dollar = ( + model_cost_ref[model]["input_cost_per_token"] * prompt_tokens + ) + completion_tokens_cost_usd_dollar = ( + model_cost_ref[model]["output_cost_per_token"] * completion_tokens + ) + elif ( + model_cost_ref[model].get("input_cost_per_second", None) is not None + and response_time_ms is not None + ): + ## COST PER SECOND ## + prompt_tokens_cost_usd_dollar = ( + model_cost_ref[model]["input_cost_per_second"] * response_time_ms / 1000 + ) + completion_tokens_cost_usd_dollar = 0.0 return prompt_tokens_cost_usd_dollar, completion_tokens_cost_usd_dollar elif model_with_provider in model_cost_ref: print_verbose(f"Looking up model={model_with_provider} in model_cost_map") @@ -2939,6 +2954,7 @@ def completion_cost( completion_tokens = completion_response.get("usage", {}).get( "completion_tokens", 0 ) + total_time = completion_response.get("_response_ms", 0) model = ( model or completion_response["model"] ) # check if user passed an override for model, if it's none check completion_response['model'] @@ -2976,6 +2992,7 @@ def completion_cost( prompt_tokens=prompt_tokens, completion_tokens=completion_tokens, custom_llm_provider=custom_llm_provider, + response_time_ms=total_time, ) return prompt_tokens_cost_usd_dollar + completion_tokens_cost_usd_dollar except Exception as e: @@ -3006,9 +3023,7 @@ def register_model(model_cost: Union[str, dict]): for key, value in loaded_model_cost.items(): ## override / add new keys to the existing model cost dictionary - if key in litellm.model_cost: - for k, v in loaded_model_cost[key].items(): - litellm.model_cost[key][k] = v + litellm.model_cost.setdefault(key, {}).update(value) # add new model names to provider lists if value.get("litellm_provider") == "openai": if key not in litellm.open_ai_chat_completion_models: @@ -3301,11 +3316,13 @@ def get_optional_params( ) def _check_valid_arg(supported_params): - print_verbose( + verbose_logger.debug( f"\nLiteLLM completion() model= {model}; provider = {custom_llm_provider}" ) - print_verbose(f"\nLiteLLM: Params passed to completion() {passed_params}") - print_verbose( + verbose_logger.debug( + f"\nLiteLLM: Params passed to completion() {passed_params}" + ) + verbose_logger.debug( f"\nLiteLLM: Non-Default params passed to completion() {non_default_params}" ) unsupported_params = {} From 39a1b4c3b5b67239cd3a7dcdf6163bd4ea3bae1b Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Mon, 22 Jan 2024 12:09:43 -0800 Subject: [PATCH 12/18] fix(main.py): support custom pricing for embedding calls --- litellm/tests/test_embedding.py | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/litellm/tests/test_embedding.py b/litellm/tests/test_embedding.py index d1f0ee699..630b41d72 100644 --- a/litellm/tests/test_embedding.py +++ b/litellm/tests/test_embedding.py @@ -10,7 +10,7 @@ sys.path.insert( 0, os.path.abspath("../..") ) # Adds the parent directory to the system path import litellm -from litellm import embedding, completion +from litellm import embedding, completion, completion_cost litellm.set_verbose = False @@ -341,8 +341,30 @@ def test_sagemaker_embeddings(): response = litellm.embedding( model="sagemaker/berri-benchmarking-gpt-j-6b-fp16", input=["good morning from litellm", "this is another item"], + input_cost_per_second=0.000420, ) print(f"response: {response}") + cost = completion_cost(completion_response=response) + assert ( + cost > 0.0 and cost < 1.0 + ) # should never be > $1 for a single embedding call + except Exception as e: + pytest.fail(f"Error occurred: {e}") + + +@pytest.mark.asyncio +async def test_sagemaker_aembeddings(): + try: + response = await litellm.aembedding( + model="sagemaker/berri-benchmarking-gpt-j-6b-fp16", + input=["good morning from litellm", "this is another item"], + input_cost_per_second=0.000420, + ) + print(f"response: {response}") + cost = completion_cost(completion_response=response) + assert ( + cost > 0.0 and cost < 1.0 + ) # should never be > $1 for a single embedding call except Exception as e: pytest.fail(f"Error occurred: {e}") From 2ce4258cc0e79ca07cc00a0b23b8a647921038d6 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Mon, 22 Jan 2024 12:10:53 -0800 Subject: [PATCH 13/18] fix(main.py): support custom pricing for embedding calls --- litellm/main.py | 31 +++++++++++++++++++++++++++++++ litellm/utils.py | 4 +++- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/litellm/main.py b/litellm/main.py index 7bc12ffef..8ee0e7d7b 100644 --- a/litellm/main.py +++ b/litellm/main.py @@ -536,6 +536,8 @@ def completion( "tpm", "input_cost_per_token", "output_cost_per_token", + "input_cost_per_second", + "output_cost_per_second", "hf_model_name", "model_info", "proxy_server_request", @@ -2262,6 +2264,11 @@ def embedding( encoding_format = kwargs.get("encoding_format", None) proxy_server_request = kwargs.get("proxy_server_request", None) aembedding = kwargs.get("aembedding", None) + ### CUSTOM MODEL COST ### + input_cost_per_token = kwargs.get("input_cost_per_token", None) + output_cost_per_token = kwargs.get("output_cost_per_token", None) + input_cost_per_second = kwargs.get("input_cost_per_second", None) + output_cost_per_second = kwargs.get("output_cost_per_second", None) openai_params = [ "user", "request_timeout", @@ -2310,6 +2317,8 @@ def embedding( "tpm", "input_cost_per_token", "output_cost_per_token", + "input_cost_per_second", + "output_cost_per_second", "hf_model_name", "proxy_server_request", "model_info", @@ -2335,6 +2344,28 @@ def embedding( custom_llm_provider=custom_llm_provider, **non_default_params, ) + ### REGISTER CUSTOM MODEL PRICING -- IF GIVEN ### + if input_cost_per_token is not None and output_cost_per_token is not None: + litellm.register_model( + { + model: { + "input_cost_per_token": input_cost_per_token, + "output_cost_per_token": output_cost_per_token, + "litellm_provider": custom_llm_provider, + } + } + ) + if input_cost_per_second is not None: # time based pricing just needs cost in place + output_cost_per_second = output_cost_per_second or 0.0 + litellm.register_model( + { + model: { + "input_cost_per_second": input_cost_per_second, + "output_cost_per_second": output_cost_per_second, + "litellm_provider": custom_llm_provider, + } + } + ) try: response = None logging = litellm_logging_obj diff --git a/litellm/utils.py b/litellm/utils.py index f4c7e93a8..192ae099d 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -2371,7 +2371,9 @@ def client(original_function): result._hidden_params["model_id"] = kwargs.get("model_info", {}).get( "id", None ) - if isinstance(result, ModelResponse): + if isinstance(result, ModelResponse) or isinstance( + result, EmbeddingResponse + ): result._response_ms = ( end_time - start_time ).total_seconds() * 1000 # return response latency in ms like openai From 82bbf336d51f7c052a8b0f6d50b138268bce725c Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Mon, 22 Jan 2024 12:47:13 -0800 Subject: [PATCH 14/18] docs(sidebars.js): add custom pricing to docs --- docs/my-website/docs/proxy/custom_pricing.md | 34 +++++++++++++++++++ docs/my-website/img/spend_logs_table.png | Bin 0 -> 193547 bytes docs/my-website/sidebars.js | 1 + 3 files changed, 35 insertions(+) create mode 100644 docs/my-website/docs/proxy/custom_pricing.md create mode 100644 docs/my-website/img/spend_logs_table.png diff --git a/docs/my-website/docs/proxy/custom_pricing.md b/docs/my-website/docs/proxy/custom_pricing.md new file mode 100644 index 000000000..10ae06667 --- /dev/null +++ b/docs/my-website/docs/proxy/custom_pricing.md @@ -0,0 +1,34 @@ +import Image from '@theme/IdealImage'; + +# Custom Pricing - Sagemaker, etc. + +Use this to register custom pricing (cost per token or cost per second) for models. + +## Quick Start + +Register custom pricing for sagemaker completion + embedding models. + +For cost per second pricing, you **just** need to register `input_cost_per_second`. + +**Step 1: Add pricing to config.yaml** +```yaml +model_list: + - model_name: sagemaker-completion-model + litellm_params: + model: sagemaker/berri-benchmarking-Llama-2-70b-chat-hf-4 + input_cost_per_second: 0.000420 + - model_name: sagemaker-embedding-model + litellm_params: + model: sagemaker/berri-benchmarking-gpt-j-6b-fp16 + input_cost_per_second: 0.000420 +``` + +**Step 2: Start proxy** + +```bash +litellm /path/to/config.yaml +``` + +**Step 3: View Spend Logs** + + \ No newline at end of file diff --git a/docs/my-website/img/spend_logs_table.png b/docs/my-website/img/spend_logs_table.png new file mode 100644 index 0000000000000000000000000000000000000000..a0f259244fa02e37d4dba2ee7585f0b8e9a04878 GIT binary patch literal 193547 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

@BG6wbhTL(Dd5o_k4D{SC!1V&-$@mL3 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

l4C6>9(+RKAogE6EGVjvrS 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 Date: Mon, 22 Jan 2024 13:41:22 -0800 Subject: [PATCH 15/18] fix: support streaming custom cost completion tracking --- litellm/main.py | 9 ++++-- litellm/proxy/proxy_server.py | 4 +-- litellm/proxy/utils.py | 4 +++ litellm/utils.py | 52 ++++++++++++++++++++++++++++++----- 4 files changed, 58 insertions(+), 11 deletions(-) diff --git a/litellm/main.py b/litellm/main.py index 8ee0e7d7b..2d8f2c0c9 100644 --- a/litellm/main.py +++ b/litellm/main.py @@ -3334,7 +3334,9 @@ def stream_chunk_builder_text_completion(chunks: list, messages: Optional[List] return response -def stream_chunk_builder(chunks: list, messages: Optional[list] = None): +def stream_chunk_builder( + chunks: list, messages: Optional[list] = None, start_time=None, end_time=None +): model_response = litellm.ModelResponse() # set hidden params from chunk to model_response if model_response is not None and hasattr(model_response, "_hidden_params"): @@ -3509,5 +3511,8 @@ def stream_chunk_builder(chunks: list, messages: Optional[list] = None): response["usage"]["prompt_tokens"] + response["usage"]["completion_tokens"] ) return convert_to_model_response_object( - response_object=response, model_response_object=model_response + response_object=response, + model_response_object=model_response, + start_time=start_time, + end_time=end_time, ) diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index 71f6a4447..9ef9a8158 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -577,7 +577,7 @@ async def track_cost_callback( "user_api_key_user_id", None ) - verbose_proxy_logger.debug( + verbose_proxy_logger.info( f"streaming response_cost {response_cost}, for user_id {user_id}" ) if user_api_key and ( @@ -602,7 +602,7 @@ async def track_cost_callback( user_id = user_id or kwargs["litellm_params"]["metadata"].get( "user_api_key_user_id", None ) - verbose_proxy_logger.debug( + verbose_proxy_logger.info( f"response_cost {response_cost}, for user_id {user_id}" ) if user_api_key and ( diff --git a/litellm/proxy/utils.py b/litellm/proxy/utils.py index 9f183644d..c19137d57 100644 --- a/litellm/proxy/utils.py +++ b/litellm/proxy/utils.py @@ -449,6 +449,7 @@ class PrismaClient: "update": {}, # don't do anything if it already exists }, ) + verbose_proxy_logger.info(f"Data Inserted into Keys Table") return new_verification_token elif table_name == "user": db_data = self.jsonify_object(data=data) @@ -459,6 +460,7 @@ class PrismaClient: "update": {}, # don't do anything if it already exists }, ) + verbose_proxy_logger.info(f"Data Inserted into User Table") return new_user_row elif table_name == "config": """ @@ -483,6 +485,7 @@ class PrismaClient: tasks.append(updated_table_row) await asyncio.gather(*tasks) + verbose_proxy_logger.info(f"Data Inserted into Config Table") elif table_name == "spend": db_data = self.jsonify_object(data=data) new_spend_row = await self.db.litellm_spendlogs.upsert( @@ -492,6 +495,7 @@ class PrismaClient: "update": {}, # don't do anything if it already exists }, ) + verbose_proxy_logger.info(f"Data Inserted into Spend Table") return new_spend_row except Exception as e: diff --git a/litellm/utils.py b/litellm/utils.py index 192ae099d..f42c8a024 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -1105,7 +1105,7 @@ class Logging: self.sync_streaming_chunks.append(result) if complete_streaming_response: - verbose_logger.info( + verbose_logger.debug( f"Logging Details LiteLLM-Success Call streaming complete" ) self.model_call_details[ @@ -1305,7 +1305,9 @@ class Logging: ) == False ): # custom logger class - print_verbose(f"success callbacks: Running Custom Logger Class") + verbose_logger.info( + f"success callbacks: Running SYNC Custom Logger Class" + ) if self.stream and complete_streaming_response is None: callback.log_stream_event( kwargs=self.model_call_details, @@ -1327,7 +1329,17 @@ class Logging: start_time=start_time, end_time=end_time, ) - if callable(callback): # custom logger functions + elif ( + callable(callback) == True + and self.model_call_details.get("litellm_params", {}).get( + "acompletion", False + ) + == False + and self.model_call_details.get("litellm_params", {}).get( + "aembedding", False + ) + == False + ): # custom logger functions print_verbose( f"success callbacks: Running Custom Callback Function" ) @@ -1362,6 +1374,9 @@ class Logging: Implementing async callbacks, to handle asyncio event loop issues when custom integrations need to use async functions. """ print_verbose(f"Async success callbacks: {litellm._async_success_callback}") + start_time, end_time, result = self._success_handler_helper_fn( + start_time=start_time, end_time=end_time, result=result, cache_hit=cache_hit + ) ## BUILD COMPLETE STREAMED RESPONSE complete_streaming_response = None if self.stream: @@ -1372,6 +1387,8 @@ class Logging: complete_streaming_response = litellm.stream_chunk_builder( self.streaming_chunks, messages=self.model_call_details.get("messages", None), + start_time=start_time, + end_time=end_time, ) except Exception as e: print_verbose( @@ -1385,9 +1402,7 @@ class Logging: self.model_call_details[ "complete_streaming_response" ] = complete_streaming_response - start_time, end_time, result = self._success_handler_helper_fn( - start_time=start_time, end_time=end_time, result=result, cache_hit=cache_hit - ) + for callback in litellm._async_success_callback: try: if callback == "cache" and litellm.cache is not None: @@ -1434,7 +1449,6 @@ class Logging: end_time=end_time, ) if callable(callback): # custom logger functions - print_verbose(f"Async success callbacks: async_log_event") await customLogger.async_log_event( kwargs=self.model_call_details, response_obj=result, @@ -2835,6 +2849,7 @@ def cost_per_token( verbose_logger.debug(f"Looking up model={model} in model_cost_map") if model in model_cost_ref: + verbose_logger.debug(f"Success: model={model} in model_cost_map") if ( model_cost_ref[model].get("input_cost_per_token", None) is not None and model_cost_ref[model].get("output_cost_per_token", None) is not None @@ -2850,11 +2865,17 @@ def cost_per_token( model_cost_ref[model].get("input_cost_per_second", None) is not None and response_time_ms is not None ): + verbose_logger.debug( + f"For model={model} - input_cost_per_second: {model_cost_ref[model].get('input_cost_per_second')}; response time: {response_time_ms}" + ) ## COST PER SECOND ## prompt_tokens_cost_usd_dollar = ( model_cost_ref[model]["input_cost_per_second"] * response_time_ms / 1000 ) completion_tokens_cost_usd_dollar = 0.0 + verbose_logger.debug( + f"Returned custom cost for model={model} - prompt_tokens_cost_usd_dollar: {prompt_tokens_cost_usd_dollar}, completion_tokens_cost_usd_dollar: {completion_tokens_cost_usd_dollar}" + ) return prompt_tokens_cost_usd_dollar, completion_tokens_cost_usd_dollar elif model_with_provider in model_cost_ref: print_verbose(f"Looking up model={model_with_provider} in model_cost_map") @@ -2957,6 +2978,9 @@ def completion_cost( "completion_tokens", 0 ) total_time = completion_response.get("_response_ms", 0) + verbose_logger.debug( + f"completion_response response ms: {completion_response.get('_response_ms')} " + ) model = ( model or completion_response["model"] ) # check if user passed an override for model, if it's none check completion_response['model'] @@ -3026,6 +3050,7 @@ def register_model(model_cost: Union[str, dict]): for key, value in loaded_model_cost.items(): ## override / add new keys to the existing model cost dictionary litellm.model_cost.setdefault(key, {}).update(value) + verbose_logger.debug(f"{key} added to model cost map") # add new model names to provider lists if value.get("litellm_provider") == "openai": if key not in litellm.open_ai_chat_completion_models: @@ -5170,6 +5195,8 @@ def convert_to_model_response_object( "completion", "embedding", "image_generation" ] = "completion", stream=False, + start_time=None, + end_time=None, ): try: if response_type == "completion" and ( @@ -5223,6 +5250,12 @@ def convert_to_model_response_object( if "model" in response_object: model_response_object.model = response_object["model"] + + if start_time is not None and end_time is not None: + model_response_object._response_ms = ( + end_time - start_time + ).total_seconds() * 1000 # return response latency in ms like openai + return model_response_object elif response_type == "embedding" and ( model_response_object is None @@ -5247,6 +5280,11 @@ def convert_to_model_response_object( model_response_object.usage.prompt_tokens = response_object["usage"].get("prompt_tokens", 0) # type: ignore model_response_object.usage.total_tokens = response_object["usage"].get("total_tokens", 0) # type: ignore + if start_time is not None and end_time is not None: + model_response_object._response_ms = ( + end_time - start_time + ).total_seconds() * 1000 # return response latency in ms like openai + return model_response_object elif response_type == "image_generation" and ( model_response_object is None From 25311293e4aeb8d7fbf412f72fa882b11c0db53e Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Mon, 22 Jan 2024 13:52:30 -0800 Subject: [PATCH 16/18] fix(utils.py): fix sync/async stream logging --- litellm/tests/test_custom_logger.py | 324 ++++++++++++++++++---------- 1 file changed, 211 insertions(+), 113 deletions(-) diff --git a/litellm/tests/test_custom_logger.py b/litellm/tests/test_custom_logger.py index de7dd67b4..565df5b25 100644 --- a/litellm/tests/test_custom_logger.py +++ b/litellm/tests/test_custom_logger.py @@ -1,56 +1,58 @@ ### What this tests #### import sys, os, time, inspect, asyncio, traceback import pytest -sys.path.insert(0, os.path.abspath('../..')) + +sys.path.insert(0, os.path.abspath("../..")) from litellm import completion, embedding import litellm from litellm.integrations.custom_logger import CustomLogger + class MyCustomHandler(CustomLogger): complete_streaming_response_in_callback = "" + def __init__(self): - self.success: bool = False # type: ignore - self.failure: bool = False # type: ignore - self.async_success: bool = False # type: ignore + self.success: bool = False # type: ignore + self.failure: bool = False # type: ignore + self.async_success: bool = False # type: ignore self.async_success_embedding: bool = False # type: ignore - self.async_failure: bool = False # type: ignore + self.async_failure: bool = False # type: ignore self.async_failure_embedding: bool = False # type: ignore - self.async_completion_kwargs = None # type: ignore - self.async_embedding_kwargs = None # type: ignore - self.async_embedding_response = None # type: ignore + self.async_completion_kwargs = None # type: ignore + self.async_embedding_kwargs = None # type: ignore + self.async_embedding_response = None # type: ignore - self.async_completion_kwargs_fail = None # type: ignore - self.async_embedding_kwargs_fail = None # type: ignore + self.async_completion_kwargs_fail = None # type: ignore + self.async_embedding_kwargs_fail = None # type: ignore - self.stream_collected_response = None # type: ignore - self.sync_stream_collected_response = None # type: ignore - self.user = None # type: ignore + self.stream_collected_response = None # type: ignore + self.sync_stream_collected_response = None # type: ignore + self.user = None # type: ignore self.data_sent_to_api: dict = {} - def log_pre_api_call(self, model, messages, kwargs): + def log_pre_api_call(self, model, messages, kwargs): print(f"Pre-API Call") self.data_sent_to_api = kwargs["additional_args"].get("complete_input_dict", {}) - - def log_post_api_call(self, kwargs, response_obj, start_time, end_time): + + def log_post_api_call(self, kwargs, response_obj, start_time, end_time): print(f"Post-API Call") - + def log_stream_event(self, kwargs, response_obj, start_time, end_time): print(f"On Stream") - - def log_success_event(self, kwargs, response_obj, start_time, end_time): + + def log_success_event(self, kwargs, response_obj, start_time, end_time): print(f"On Success") self.success = True if kwargs.get("stream") == True: self.sync_stream_collected_response = response_obj - - def log_failure_event(self, kwargs, response_obj, start_time, end_time): + def log_failure_event(self, kwargs, response_obj, start_time, end_time): print(f"On Failure") self.failure = True - async def async_log_success_event(self, kwargs, response_obj, start_time, end_time): + async def async_log_success_event(self, kwargs, response_obj, start_time, end_time): print(f"On Async success") print(f"received kwargs user: {kwargs['user']}") self.async_success = True @@ -62,24 +64,30 @@ class MyCustomHandler(CustomLogger): self.stream_collected_response = response_obj self.async_completion_kwargs = kwargs self.user = kwargs.get("user", None) - - async def async_log_failure_event(self, kwargs, response_obj, start_time, end_time): + + async def async_log_failure_event(self, kwargs, response_obj, start_time, end_time): print(f"On Async Failure") self.async_failure = True if kwargs.get("model") == "text-embedding-ada-002": self.async_failure_embedding = True self.async_embedding_kwargs_fail = kwargs - + self.async_completion_kwargs_fail = kwargs + class TmpFunction: complete_streaming_response_in_callback = "" async_success: bool = False + async def async_test_logging_fn(self, kwargs, completion_obj, start_time, end_time): print(f"ON ASYNC LOGGING") self.async_success = True - print(f'kwargs.get("complete_streaming_response"): {kwargs.get("complete_streaming_response")}') - self.complete_streaming_response_in_callback = kwargs.get("complete_streaming_response") + print( + f'kwargs.get("complete_streaming_response"): {kwargs.get("complete_streaming_response")}' + ) + self.complete_streaming_response_in_callback = kwargs.get( + "complete_streaming_response" + ) def test_async_chat_openai_stream(): @@ -88,29 +96,39 @@ def test_async_chat_openai_stream(): # litellm.set_verbose = True litellm.success_callback = [tmp_function.async_test_logging_fn] complete_streaming_response = "" + async def call_gpt(): nonlocal complete_streaming_response - response = await litellm.acompletion(model="gpt-3.5-turbo", - messages=[{ - "role": "user", - "content": "Hi 👋 - i'm openai" - }], - stream=True) - async for chunk in response: - complete_streaming_response += chunk["choices"][0]["delta"]["content"] or "" + response = await litellm.acompletion( + model="gpt-3.5-turbo", + messages=[{"role": "user", "content": "Hi 👋 - i'm openai"}], + stream=True, + ) + async for chunk in response: + complete_streaming_response += ( + chunk["choices"][0]["delta"]["content"] or "" + ) print(complete_streaming_response) + asyncio.run(call_gpt()) complete_streaming_response = complete_streaming_response.strip("'") - response1 = tmp_function.complete_streaming_response_in_callback["choices"][0]["message"]["content"] + response1 = tmp_function.complete_streaming_response_in_callback["choices"][0][ + "message" + ]["content"] response2 = complete_streaming_response # assert [ord(c) for c in response1] == [ord(c) for c in response2] + print(f"response1: {response1}") + print(f"response2: {response2}") assert response1 == response2 assert tmp_function.async_success == True except Exception as e: print(e) pytest.fail(f"An error occurred - {str(e)}") + + # test_async_chat_openai_stream() + def test_completion_azure_stream_moderation_failure(): try: customHandler = MyCustomHandler() @@ -122,11 +140,11 @@ def test_completion_azure_stream_moderation_failure(): "content": "how do i kill someone", }, ] - try: + try: response = completion( model="azure/chatgpt-v-2", messages=messages, stream=True ) - for chunk in response: + for chunk in response: print(f"chunk: {chunk}") continue except Exception as e: @@ -139,7 +157,7 @@ def test_completion_azure_stream_moderation_failure(): def test_async_custom_handler_stream(): try: - # [PROD Test] - Do not DELETE + # [PROD Test] - Do not DELETE # checks if the model response available in the async + stream callbacks is equal to the received response customHandler2 = MyCustomHandler() litellm.callbacks = [customHandler2] @@ -152,32 +170,37 @@ def test_async_custom_handler_stream(): }, ] complete_streaming_response = "" + async def test_1(): nonlocal complete_streaming_response response = await litellm.acompletion( - model="azure/chatgpt-v-2", - messages=messages, - stream=True + model="azure/chatgpt-v-2", messages=messages, stream=True ) - async for chunk in response: - complete_streaming_response += chunk["choices"][0]["delta"]["content"] or "" + async for chunk in response: + complete_streaming_response += ( + chunk["choices"][0]["delta"]["content"] or "" + ) print(complete_streaming_response) - + asyncio.run(test_1()) response_in_success_handler = customHandler2.stream_collected_response - response_in_success_handler = response_in_success_handler["choices"][0]["message"]["content"] + response_in_success_handler = response_in_success_handler["choices"][0][ + "message" + ]["content"] print("\n\n") print("response_in_success_handler: ", response_in_success_handler) print("complete_streaming_response: ", complete_streaming_response) assert response_in_success_handler == complete_streaming_response except Exception as e: pytest.fail(f"Error occurred: {e}") + + # test_async_custom_handler_stream() def test_azure_completion_stream(): - # [PROD Test] - Do not DELETE + # [PROD Test] - Do not DELETE # test if completion() + sync custom logger get the same complete stream response try: # checks if the model response available in the async + stream callbacks is equal to the received response @@ -194,17 +217,17 @@ def test_azure_completion_stream(): complete_streaming_response = "" response = litellm.completion( - model="azure/chatgpt-v-2", - messages=messages, - stream=True + model="azure/chatgpt-v-2", messages=messages, stream=True ) - for chunk in response: + for chunk in response: complete_streaming_response += chunk["choices"][0]["delta"]["content"] or "" print(complete_streaming_response) - - time.sleep(0.5) # wait 1/2 second before checking callbacks + + time.sleep(0.5) # wait 1/2 second before checking callbacks response_in_success_handler = customHandler2.sync_stream_collected_response - response_in_success_handler = response_in_success_handler["choices"][0]["message"]["content"] + response_in_success_handler = response_in_success_handler["choices"][0][ + "message" + ]["content"] print("\n\n") print("response_in_success_handler: ", response_in_success_handler) print("complete_streaming_response: ", complete_streaming_response) @@ -212,24 +235,32 @@ def test_azure_completion_stream(): except Exception as e: pytest.fail(f"Error occurred: {e}") + @pytest.mark.asyncio -async def test_async_custom_handler_completion(): - try: +async def test_async_custom_handler_completion(): + try: customHandler_success = MyCustomHandler() customHandler_failure = MyCustomHandler() # success assert customHandler_success.async_success == False litellm.callbacks = [customHandler_success] response = await litellm.acompletion( - model="gpt-3.5-turbo", - messages=[{ + model="gpt-3.5-turbo", + messages=[ + { "role": "user", "content": "hello from litellm test", - }] - ) + } + ], + ) await asyncio.sleep(1) - assert customHandler_success.async_success == True, "async success is not set to True even after success" - assert customHandler_success.async_completion_kwargs.get("model") == "gpt-3.5-turbo" + assert ( + customHandler_success.async_success == True + ), "async success is not set to True even after success" + assert ( + customHandler_success.async_completion_kwargs.get("model") + == "gpt-3.5-turbo" + ) # failure litellm.callbacks = [customHandler_failure] messages = [ @@ -240,80 +271,119 @@ async def test_async_custom_handler_completion(): }, ] - assert customHandler_failure.async_failure == False - try: + assert customHandler_failure.async_failure == False + try: response = await litellm.acompletion( - model="gpt-3.5-turbo", - messages=messages, - api_key="my-bad-key", - ) + model="gpt-3.5-turbo", + messages=messages, + api_key="my-bad-key", + ) except: pass - assert customHandler_failure.async_failure == True, "async failure is not set to True even after failure" - assert customHandler_failure.async_completion_kwargs_fail.get("model") == "gpt-3.5-turbo" - assert len(str(customHandler_failure.async_completion_kwargs_fail.get("exception"))) > 10 # expect APIError("OpenAIException - Error code: 401 - {'error': {'message': 'Incorrect API key provided: test. You can find your API key at https://platform.openai.com/account/api-keys.', 'type': 'invalid_request_error', 'param': None, 'code': 'invalid_api_key'}}"), 'traceback_exception': 'Traceback (most recent call last):\n File "/Users/ishaanjaffer/Github/litellm/litellm/llms/openai.py", line 269, in acompletion\n response = await openai_aclient.chat.completions.create(**data)\n File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/openai/resources/chat/completions.py", line 119 + assert ( + customHandler_failure.async_failure == True + ), "async failure is not set to True even after failure" + assert ( + customHandler_failure.async_completion_kwargs_fail.get("model") + == "gpt-3.5-turbo" + ) + assert ( + len( + str(customHandler_failure.async_completion_kwargs_fail.get("exception")) + ) + > 10 + ) # expect APIError("OpenAIException - Error code: 401 - {'error': {'message': 'Incorrect API key provided: test. You can find your API key at https://platform.openai.com/account/api-keys.', 'type': 'invalid_request_error', 'param': None, 'code': 'invalid_api_key'}}"), 'traceback_exception': 'Traceback (most recent call last):\n File "/Users/ishaanjaffer/Github/litellm/litellm/llms/openai.py", line 269, in acompletion\n response = await openai_aclient.chat.completions.create(**data)\n File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/openai/resources/chat/completions.py", line 119 litellm.callbacks = [] print("Passed setting async failure") except Exception as e: pytest.fail(f"An exception occurred - {str(e)}") + + # asyncio.run(test_async_custom_handler_completion()) + @pytest.mark.asyncio -async def test_async_custom_handler_embedding(): - try: +async def test_async_custom_handler_embedding(): + try: customHandler_embedding = MyCustomHandler() litellm.callbacks = [customHandler_embedding] # success assert customHandler_embedding.async_success_embedding == False response = await litellm.aembedding( - model="text-embedding-ada-002", - input = ["hello world"], - ) + model="text-embedding-ada-002", + input=["hello world"], + ) await asyncio.sleep(1) - assert customHandler_embedding.async_success_embedding == True, "async_success_embedding is not set to True even after success" - assert customHandler_embedding.async_embedding_kwargs.get("model") == "text-embedding-ada-002" - assert customHandler_embedding.async_embedding_response["usage"]["prompt_tokens"] ==2 + assert ( + customHandler_embedding.async_success_embedding == True + ), "async_success_embedding is not set to True even after success" + assert ( + customHandler_embedding.async_embedding_kwargs.get("model") + == "text-embedding-ada-002" + ) + assert ( + customHandler_embedding.async_embedding_response["usage"]["prompt_tokens"] + == 2 + ) print("Passed setting async success: Embedding") - # failure + # failure assert customHandler_embedding.async_failure_embedding == False - try: + try: response = await litellm.aembedding( - model="text-embedding-ada-002", - input = ["hello world"], - api_key="my-bad-key", - ) - except: + model="text-embedding-ada-002", + input=["hello world"], + api_key="my-bad-key", + ) + except: pass - assert customHandler_embedding.async_failure_embedding == True, "async failure embedding is not set to True even after failure" - assert customHandler_embedding.async_embedding_kwargs_fail.get("model") == "text-embedding-ada-002" - assert len(str(customHandler_embedding.async_embedding_kwargs_fail.get("exception"))) > 10 # exppect APIError("OpenAIException - Error code: 401 - {'error': {'message': 'Incorrect API key provided: test. You can find your API key at https://platform.openai.com/account/api-keys.', 'type': 'invalid_request_error', 'param': None, 'code': 'invalid_api_key'}}"), 'traceback_exception': 'Traceback (most recent call last):\n File "/Users/ishaanjaffer/Github/litellm/litellm/llms/openai.py", line 269, in acompletion\n response = await openai_aclient.chat.completions.create(**data)\n File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/openai/resources/chat/completions.py", line 119 + assert ( + customHandler_embedding.async_failure_embedding == True + ), "async failure embedding is not set to True even after failure" + assert ( + customHandler_embedding.async_embedding_kwargs_fail.get("model") + == "text-embedding-ada-002" + ) + assert ( + len( + str( + customHandler_embedding.async_embedding_kwargs_fail.get("exception") + ) + ) + > 10 + ) # exppect APIError("OpenAIException - Error code: 401 - {'error': {'message': 'Incorrect API key provided: test. You can find your API key at https://platform.openai.com/account/api-keys.', 'type': 'invalid_request_error', 'param': None, 'code': 'invalid_api_key'}}"), 'traceback_exception': 'Traceback (most recent call last):\n File "/Users/ishaanjaffer/Github/litellm/litellm/llms/openai.py", line 269, in acompletion\n response = await openai_aclient.chat.completions.create(**data)\n File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/openai/resources/chat/completions.py", line 119 except Exception as e: pytest.fail(f"An exception occurred - {str(e)}") + + # asyncio.run(test_async_custom_handler_embedding()) + @pytest.mark.asyncio -async def test_async_custom_handler_embedding_optional_param(): +async def test_async_custom_handler_embedding_optional_param(): """ - Tests if the openai optional params for embedding - user + encoding_format, + Tests if the openai optional params for embedding - user + encoding_format, are logged """ customHandler_optional_params = MyCustomHandler() litellm.callbacks = [customHandler_optional_params] response = await litellm.aembedding( - model="azure/azure-embedding-model", - input = ["hello world"], - user = "John" - ) - await asyncio.sleep(1) # success callback is async + model="azure/azure-embedding-model", input=["hello world"], user="John" + ) + await asyncio.sleep(1) # success callback is async assert customHandler_optional_params.user == "John" - assert customHandler_optional_params.user == customHandler_optional_params.data_sent_to_api["user"] + assert ( + customHandler_optional_params.user + == customHandler_optional_params.data_sent_to_api["user"] + ) + # asyncio.run(test_async_custom_handler_embedding_optional_param()) + @pytest.mark.asyncio -async def test_async_custom_handler_embedding_optional_param_bedrock(): +async def test_async_custom_handler_embedding_optional_param_bedrock(): """ - Tests if the openai optional params for embedding - user + encoding_format, + Tests if the openai optional params for embedding - user + encoding_format, are logged but makes sure these are not sent to the non-openai/azure endpoint (raises errors). @@ -323,42 +393,68 @@ async def test_async_custom_handler_embedding_optional_param_bedrock(): customHandler_optional_params = MyCustomHandler() litellm.callbacks = [customHandler_optional_params] response = await litellm.aembedding( - model="bedrock/amazon.titan-embed-text-v1", - input = ["hello world"], - user = "John" - ) - await asyncio.sleep(1) # success callback is async + model="bedrock/amazon.titan-embed-text-v1", input=["hello world"], user="John" + ) + await asyncio.sleep(1) # success callback is async assert customHandler_optional_params.user == "John" assert "user" not in customHandler_optional_params.data_sent_to_api def test_redis_cache_completion_stream(): from litellm import Cache - # Important Test - This tests if we can add to streaming cache, when custom callbacks are set + + # Important Test - This tests if we can add to streaming cache, when custom callbacks are set import random + try: print("\nrunning test_redis_cache_completion_stream") litellm.set_verbose = True - random_number = random.randint(1, 100000) # add a random number to ensure it's always adding / reading from cache - messages = [{"role": "user", "content": f"write a one sentence poem about: {random_number}"}] - litellm.cache = Cache(type="redis", host=os.environ['REDIS_HOST'], port=os.environ['REDIS_PORT'], password=os.environ['REDIS_PASSWORD']) + random_number = random.randint( + 1, 100000 + ) # add a random number to ensure it's always adding / reading from cache + messages = [ + { + "role": "user", + "content": f"write a one sentence poem about: {random_number}", + } + ] + litellm.cache = Cache( + type="redis", + host=os.environ["REDIS_HOST"], + port=os.environ["REDIS_PORT"], + password=os.environ["REDIS_PASSWORD"], + ) print("test for caching, streaming + completion") - response1 = completion(model="gpt-3.5-turbo", messages=messages, max_tokens=40, temperature=0.2, stream=True) + response1 = completion( + model="gpt-3.5-turbo", + messages=messages, + max_tokens=40, + temperature=0.2, + stream=True, + ) response_1_content = "" for chunk in response1: print(chunk) response_1_content += chunk.choices[0].delta.content or "" print(response_1_content) - time.sleep(0.1) # sleep for 0.1 seconds allow set cache to occur - response2 = completion(model="gpt-3.5-turbo", messages=messages, max_tokens=40, temperature=0.2, stream=True) + time.sleep(0.1) # sleep for 0.1 seconds allow set cache to occur + response2 = completion( + model="gpt-3.5-turbo", + messages=messages, + max_tokens=40, + temperature=0.2, + stream=True, + ) response_2_content = "" for chunk in response2: print(chunk) response_2_content += chunk.choices[0].delta.content or "" print("\nresponse 1", response_1_content) print("\nresponse 2", response_2_content) - assert response_1_content == response_2_content, f"Response 1 != Response 2. Same params, Response 1{response_1_content} != Response 2{response_2_content}" + assert ( + response_1_content == response_2_content + ), f"Response 1 != Response 2. Same params, Response 1{response_1_content} != Response 2{response_2_content}" litellm.success_callback = [] litellm._async_success_callback = [] litellm.cache = None @@ -366,4 +462,6 @@ def test_redis_cache_completion_stream(): print(e) litellm.success_callback = [] raise e -# test_redis_cache_completion_stream() \ No newline at end of file + + +# test_redis_cache_completion_stream() From a343c4d22fc9be79c1141fddd443f3031211d007 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Mon, 22 Jan 2024 14:06:32 -0800 Subject: [PATCH 17/18] refactor(utils.py): fix linting errors --- litellm/utils.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/litellm/utils.py b/litellm/utils.py index f42c8a024..2b589898c 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -5252,9 +5252,9 @@ def convert_to_model_response_object( model_response_object.model = response_object["model"] if start_time is not None and end_time is not None: - model_response_object._response_ms = ( + model_response_object._response_ms = ( # type: ignore end_time - start_time - ).total_seconds() * 1000 # return response latency in ms like openai + ).total_seconds() * 1000 return model_response_object elif response_type == "embedding" and ( @@ -5281,7 +5281,7 @@ def convert_to_model_response_object( model_response_object.usage.total_tokens = response_object["usage"].get("total_tokens", 0) # type: ignore if start_time is not None and end_time is not None: - model_response_object._response_ms = ( + model_response_object._response_ms = ( # type: ignore end_time - start_time ).total_seconds() * 1000 # return response latency in ms like openai From 36c6d3cd901f2bffa6419c225c933aa9f11bacbd Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Mon, 22 Jan 2024 14:54:45 -0800 Subject: [PATCH 18/18] fix(utils.py): fix debug log --- litellm/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/litellm/utils.py b/litellm/utils.py index 2b589898c..468e67136 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -995,7 +995,7 @@ class Logging: self.model_call_details["log_event_type"] = "post_api_call" # User Logging -> if you pass in a custom logging function - verbose_logger.info( + verbose_logger.debug( f"RAW RESPONSE:\n{self.model_call_details.get('original_response', self.model_call_details)}\n\n" ) verbose_logger.debug(