From 98bed2a24837756100c4518220f912d34680d3c1 Mon Sep 17 00:00:00 2001 From: maamalama Date: Wed, 24 Jul 2024 17:40:20 -0700 Subject: [PATCH 1/3] tools_call to Helicone --- litellm/integrations/helicone.py | 59 ++++++++++++++++++++++---------- 1 file changed, 41 insertions(+), 18 deletions(-) diff --git a/litellm/integrations/helicone.py b/litellm/integrations/helicone.py index f0666431a69..edab68c1c68 100644 --- a/litellm/integrations/helicone.py +++ b/litellm/integrations/helicone.py @@ -17,27 +17,50 @@ class HeliconeLogger: self.key = os.getenv("HELICONE_API_KEY") def claude_mapping(self, model, messages, response_obj): - from anthropic import HUMAN_PROMPT, AI_PROMPT + from anthropic import HUMAN_PROMPT, AI_PROMPT - prompt = f"{HUMAN_PROMPT}" - for message in messages: - if "role" in message: - if message["role"] == "user": - prompt += f"{HUMAN_PROMPT}{message['content']}" - else: - prompt += f"{AI_PROMPT}{message['content']}" - else: - prompt += f"{HUMAN_PROMPT}{message['content']}" - prompt += f"{AI_PROMPT}" - claude_provider_request = {"model": model, "prompt": prompt} + prompt = f"{HUMAN_PROMPT}" + for message in messages: + if "role" in message: + if message["role"] == "user": + prompt += f"{HUMAN_PROMPT}{message['content']}" + else: + prompt += f"{AI_PROMPT}{message['content']}" + else: + prompt += f"{HUMAN_PROMPT}{message['content']}" + prompt += f"{AI_PROMPT}" + claude_provider_request = {"model": model, "prompt": prompt} - claude_response_obj = { - "completion": response_obj["choices"][0]["message"]["content"], - "model": model, - "stop_reason": "stop_sequence", - } + choice = response_obj["choices"][0] + message = choice["message"] - return claude_provider_request, claude_response_obj + content = [] + if "tool_calls" in message and message["tool_calls"]: + for tool_call in message["tool_calls"]: + content.append({ + "type": "tool_use", + "id": tool_call["id"], + "name": tool_call["function"]["name"], + "input": tool_call["function"]["arguments"] + }) + elif "content" in message and message["content"]: + content = [{"type": "text", "text": message["content"]}] + + claude_response_obj = { + "id": response_obj["id"], + "type": "message", + "role": "assistant", + "model": model, + "content": content, + "stop_reason": choice["finish_reason"], + "stop_sequence": None, + "usage": { + "input_tokens": response_obj["usage"]["prompt_tokens"], + "output_tokens": response_obj["usage"]["completion_tokens"] + } + } + + return claude_provider_request, claude_response_obj @staticmethod def add_metadata_from_header(litellm_params: dict, metadata: dict) -> dict: From 41811218b2e22b6fa5c07a655ec7e04a0e9e3a67 Mon Sep 17 00:00:00 2001 From: maamalama Date: Wed, 24 Jul 2024 17:42:07 -0700 Subject: [PATCH 2/3] tab --- litellm/integrations/helicone.py | 78 ++++++++++++++++---------------- 1 file changed, 39 insertions(+), 39 deletions(-) diff --git a/litellm/integrations/helicone.py b/litellm/integrations/helicone.py index edab68c1c68..b00e145171f 100644 --- a/litellm/integrations/helicone.py +++ b/litellm/integrations/helicone.py @@ -17,50 +17,50 @@ class HeliconeLogger: self.key = os.getenv("HELICONE_API_KEY") def claude_mapping(self, model, messages, response_obj): - from anthropic import HUMAN_PROMPT, AI_PROMPT + from anthropic import HUMAN_PROMPT, AI_PROMPT - prompt = f"{HUMAN_PROMPT}" - for message in messages: - if "role" in message: - if message["role"] == "user": - prompt += f"{HUMAN_PROMPT}{message['content']}" - else: - prompt += f"{AI_PROMPT}{message['content']}" - else: - prompt += f"{HUMAN_PROMPT}{message['content']}" - prompt += f"{AI_PROMPT}" - claude_provider_request = {"model": model, "prompt": prompt} + prompt = f"{HUMAN_PROMPT}" + for message in messages: + if "role" in message: + if message["role"] == "user": + prompt += f"{HUMAN_PROMPT}{message['content']}" + else: + prompt += f"{AI_PROMPT}{message['content']}" + else: + prompt += f"{HUMAN_PROMPT}{message['content']}" + prompt += f"{AI_PROMPT}" + claude_provider_request = {"model": model, "prompt": prompt} - choice = response_obj["choices"][0] - message = choice["message"] + choice = response_obj["choices"][0] + message = choice["message"] - content = [] - if "tool_calls" in message and message["tool_calls"]: - for tool_call in message["tool_calls"]: - content.append({ - "type": "tool_use", - "id": tool_call["id"], - "name": tool_call["function"]["name"], - "input": tool_call["function"]["arguments"] - }) - elif "content" in message and message["content"]: - content = [{"type": "text", "text": message["content"]}] + content = [] + if "tool_calls" in message and message["tool_calls"]: + for tool_call in message["tool_calls"]: + content.append({ + "type": "tool_use", + "id": tool_call["id"], + "name": tool_call["function"]["name"], + "input": tool_call["function"]["arguments"] + }) + elif "content" in message and message["content"]: + content = [{"type": "text", "text": message["content"]}] - claude_response_obj = { - "id": response_obj["id"], - "type": "message", - "role": "assistant", - "model": model, - "content": content, - "stop_reason": choice["finish_reason"], - "stop_sequence": None, - "usage": { - "input_tokens": response_obj["usage"]["prompt_tokens"], - "output_tokens": response_obj["usage"]["completion_tokens"] - } - } + claude_response_obj = { + "id": response_obj["id"], + "type": "message", + "role": "assistant", + "model": model, + "content": content, + "stop_reason": choice["finish_reason"], + "stop_sequence": None, + "usage": { + "input_tokens": response_obj["usage"]["prompt_tokens"], + "output_tokens": response_obj["usage"]["completion_tokens"] + } + } - return claude_provider_request, claude_response_obj + return claude_provider_request, claude_response_obj @staticmethod def add_metadata_from_header(litellm_params: dict, metadata: dict) -> dict: From a3e4e4d4129accf402356cf9cdebea3a5f0454da Mon Sep 17 00:00:00 2001 From: maamalama Date: Thu, 25 Jul 2024 11:37:29 -0700 Subject: [PATCH 3/3] anthropic gateway fixes --- litellm/integrations/helicone.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/litellm/integrations/helicone.py b/litellm/integrations/helicone.py index b00e145171f..56c9c38bc6a 100644 --- a/litellm/integrations/helicone.py +++ b/litellm/integrations/helicone.py @@ -60,7 +60,7 @@ class HeliconeLogger: } } - return claude_provider_request, claude_response_obj + return claude_response_obj @staticmethod def add_metadata_from_header(litellm_params: dict, metadata: dict) -> dict: @@ -119,7 +119,7 @@ class HeliconeLogger: response_obj = response_obj.json() if "claude" in model: - provider_request, response_obj = self.claude_mapping( + response_obj = self.claude_mapping( model=model, messages=messages, response_obj=response_obj ) @@ -130,7 +130,11 @@ class HeliconeLogger: } # Code to be executed + provider_url = self.provider_url url = "https://api.hconeai.com/oai/v1/log" + if "claude" in model: + url = "https://api.hconeai.com/anthropic/v1/log" + provider_url = "https://api.anthropic.com/v1/messages" headers = { "Authorization": f"Bearer {self.key}", "Content-Type": "application/json", @@ -147,7 +151,7 @@ class HeliconeLogger: meta.update(metadata) data = { "providerRequest": { - "url": self.provider_url, + "url": provider_url, "json": provider_request, "meta": meta, },