diff --git a/litellm/integrations/slack_alerting.py b/litellm/integrations/slack_alerting.py index 6c855766a..121e73c33 100644 --- a/litellm/integrations/slack_alerting.py +++ b/litellm/integrations/slack_alerting.py @@ -412,6 +412,53 @@ class SlackAlerting: return + async def model_added_alert(self, model_name: str, litellm_model_name: str): + model_info = litellm.model_cost.get(litellm_model_name, {}) + model_info_str = "" + for k, v in model_info.items(): + if k == "input_cost_per_token" or k == "output_cost_per_token": + # when converting to string it should not be 1.63e-06 + v = "{:.8f}".format(v) + + model_info_str += f"{k}: {v}\n" + + message = f""" +*🚅 New Model Added* +Model Name: `{model_name}` + +Usage OpenAI Python SDK: +``` +import openai +client = openai.OpenAI( + api_key="your_api_key", + base_url={os.getenv("PROXY_BASE_URL", "http://0.0.0.0:4000")} +) + +response = client.chat.completions.create( + model="{model_name}", # model to send to the proxy + messages = [ + {{ + "role": "user", + "content": "this is a test request, write a short poem" + }} + ] +) +``` + +Model Info: +``` +{model_info_str} +``` +""" + + await self.send_alert( + message=message, level="Low", alert_type="new_model_added" + ) + pass + + async def model_removed_alert(self, model_name: str): + pass + async def send_alert( self, message: str, @@ -422,6 +469,7 @@ class SlackAlerting: "llm_requests_hanging", "budget_alerts", "db_exceptions", + "new_model_added", ], ): """ @@ -447,9 +495,12 @@ class SlackAlerting: # Get the current timestamp current_time = datetime.now().strftime("%H:%M:%S") _proxy_base_url = os.getenv("PROXY_BASE_URL", None) - formatted_message = ( - f"Level: `{level}`\nTimestamp: `{current_time}`\n\nMessage: {message}" - ) + if alert_type == "new_model_added": + formatted_message = message + else: + formatted_message = ( + f"Level: `{level}`\nTimestamp: `{current_time}`\n\nMessage: {message}" + ) if _proxy_base_url is not None: formatted_message += f"\n\nProxy URL: `{_proxy_base_url}`" diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index b0469fdd3..83ba3f60f 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -7303,6 +7303,7 @@ async def add_new_model( """ # encrypt litellm params # _litellm_params_dict = model_params.litellm_params.dict(exclude_none=True) + _orignal_litellm_model_name = model_params.litellm_params.model for k, v in _litellm_params_dict.items(): if isinstance(v, str): encrypted_value = encrypt_value(value=v, master_key=master_key) # type: ignore @@ -7329,6 +7330,11 @@ async def add_new_model( prisma_client=prisma_client, proxy_logging_obj=proxy_logging_obj ) + await proxy_logging_obj.slack_alerting_instance.model_added_alert( + model_name=model_params.model_name, + litellm_model_name=_orignal_litellm_model_name, + ) + else: raise HTTPException( status_code=500,