From e5ef18b46728526011ee016ab7cd171fb4b19dcb Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Thu, 3 Aug 2023 06:57:30 -0700 Subject: [PATCH] updates --- build/lib/litellm/__init__.py | 2 +- build/lib/litellm/main.py | 2 +- build/lib/litellm/utils.py | 22 ++++++++++++++++---- dist/litellm-0.1.220-py3-none-any.whl | Bin 10101 -> 0 bytes dist/litellm-0.1.220.tar.gz | Bin 10154 -> 0 bytes dist/litellm-0.1.222-py3-none-any.whl | Bin 0 -> 10305 bytes dist/litellm-0.1.222.tar.gz | Bin 0 -> 10367 bytes docs/advanced.md | 28 ++++++++++++++++---------- docs/client_integrations.md | 9 +++++---- docs/index.md | 6 +++++- docs/supported.md | 21 +++++++++---------- litellm.egg-info/PKG-INFO | 2 +- litellm/utils.py | 1 + setup.py | 2 +- 14 files changed, 59 insertions(+), 36 deletions(-) delete mode 100644 dist/litellm-0.1.220-py3-none-any.whl delete mode 100644 dist/litellm-0.1.220.tar.gz create mode 100644 dist/litellm-0.1.222-py3-none-any.whl create mode 100644 dist/litellm-0.1.222.tar.gz diff --git a/build/lib/litellm/__init__.py b/build/lib/litellm/__init__.py index e3d4a8d84..6ae281afc 100644 --- a/build/lib/litellm/__init__.py +++ b/build/lib/litellm/__init__.py @@ -2,7 +2,7 @@ success_callback = [] failure_callback = [] set_verbose=False telemetry=True - +max_tokens = 256 # OpenAI Defaults ####### PROXY PARAMS ################### configurable params if you use proxy models like Helicone api_base = None headers = None diff --git a/build/lib/litellm/main.py b/build/lib/litellm/main.py index 16faba2bd..898f40ae4 100644 --- a/build/lib/litellm/main.py +++ b/build/lib/litellm/main.py @@ -189,7 +189,7 @@ def completion( if max_tokens != float('inf'): max_tokens_to_sample = max_tokens else: - max_tokens_to_sample = 300 # default in Anthropic docs https://docs.anthropic.com/claude/reference/client-libraries + max_tokens_to_sample = litellm.max_tokens # default in Anthropic docs https://docs.anthropic.com/claude/reference/client-libraries ## LOGGING logging(model=model, input=prompt, azure=azure, additional_args={"max_tokens": max_tokens}, logger_fn=logger_fn) ## COMPLETION CALL diff --git a/build/lib/litellm/utils.py b/build/lib/litellm/utils.py index 67a3d6df7..1cbbb37cf 100644 --- a/build/lib/litellm/utils.py +++ b/build/lib/litellm/utils.py @@ -2,6 +2,7 @@ import dotenv, json, traceback, threading import subprocess, os import litellm, openai import random, uuid, requests +import datetime from openai.error import AuthenticationError, InvalidRequestError, RateLimitError, ServiceUnavailableError, OpenAIError ####### ENVIRONMENT VARIABLES ################### dotenv.load_dotenv() # Loading env variables using dotenv @@ -11,6 +12,7 @@ add_breadcrumb = None posthog = None slack_app = None alerts_channel = None +heliconeLogger = None callback_list = [] user_logger_fn = None additional_details = {} @@ -68,7 +70,7 @@ def client(original_function): global callback_list, add_breadcrumb if (len(litellm.success_callback) > 0 or len(litellm.failure_callback) > 0) and len(callback_list) == 0: callback_list = list(set(litellm.success_callback + litellm.failure_callback)) - set_callbacks(callback_list=callback_list) + set_callbacks(callback_list=callback_list,) if add_breadcrumb: add_breadcrumb( category="litellm.llm_call", @@ -83,9 +85,11 @@ def client(original_function): try: function_setup(args, kwargs) ## MODEL CALL + start_time = datetime.datetime.now() result = original_function(*args, **kwargs) + end_time = datetime.datetime.now() ## LOG SUCCESS - my_thread = threading.Thread(target=handle_success, args=(args, kwargs)) # don't interrupt execution of main thread + my_thread = threading.Thread(target=handle_success, args=(args, kwargs, result, start_time, end_time)) # don't interrupt execution of main thread my_thread.start() return result except Exception as e: @@ -97,7 +101,7 @@ def client(original_function): ####### HELPER FUNCTIONS ################ def set_callbacks(callback_list): - global sentry_sdk_instance, capture_exception, add_breadcrumb, posthog, slack_app, alerts_channel + global sentry_sdk_instance, capture_exception, add_breadcrumb, posthog, slack_app, alerts_channel, heliconeLogger try: for callback in callback_list: if callback == "sentry": @@ -134,6 +138,10 @@ def set_callbacks(callback_list): ) alerts_channel = os.environ["SLACK_API_CHANNEL"] print_verbose(f"Initialized Slack App: {slack_app}") + elif callback == "helicone": + from .integrations.helicone import HeliconeLogger + + heliconeLogger = HeliconeLogger() except: pass @@ -200,7 +208,8 @@ def handle_failure(exception, traceback_exception, args, kwargs): except: pass -def handle_success(*args, **kwargs): +def handle_success(args, kwargs, result, start_time, end_time): + global heliconeLogger try: success_handler = additional_details.pop("success_handler", None) failure_handler = additional_details.pop("failure_handler", None) @@ -223,6 +232,11 @@ def handle_success(*args, **kwargs): for detail in additional_details: slack_msg += f"{detail}: {additional_details[detail]}\n" slack_app.client.chat_postMessage(channel=alerts_channel, text=slack_msg) + elif callback == "helicone": + print_verbose("reaches helicone for logging!") + model = args[0] if len(args) > 0 else kwargs["model"] + messages = args[1] if len(args) > 1 else kwargs["messages"] + heliconeLogger.log_success(model=model, messages=messages, response_obj=result, start_time=start_time, end_time=end_time) except: pass diff --git a/dist/litellm-0.1.220-py3-none-any.whl b/dist/litellm-0.1.220-py3-none-any.whl deleted file mode 100644 index d12f0568cd6acb623c31adb78b51e07bb8228430..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10101 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 BCS?Es diff --git a/dist/litellm-0.1.220.tar.gz b/dist/litellm-0.1.220.tar.gz deleted file mode 100644 index 63d50fdac4eaf20a03366a5a1af9f397ec757355..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10154 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 literal 0 HcmV?d00001 diff --git a/docs/advanced.md b/docs/advanced.md index 403e60755..aa3b22389 100644 --- a/docs/advanced.md +++ b/docs/advanced.md @@ -1,21 +1,27 @@ -# Advanced - liteLLM client +# Advanced - Callbacks -## Use liteLLM client to send Output Data to Posthog, Sentry etc -liteLLM allows you to create `completion_client` and `embedding_client` to send successfull / error LLM API call data to Posthog, Sentry, Slack etc +## Use Callbacks to send Output Data to Posthog, Sentry etc +liteLLM provides `success_callbacks` and `failure_callbacks`, making it easy for you to send data to a particular provider depending on the status of your responses. + +liteLLM supports: + +- [Helicone](https://docs.helicone.ai/introduction) +- [Sentry](https://docs.sentry.io/platforms/python/) +- [PostHog](https://posthog.com/docs/libraries/python) +- [Slack](https://slack.dev/bolt-python/concepts) ### Quick Start ```python -from main import litellm_client -import os +from litellm import completion + +# set callbacks +litellm.success_callback=["posthog", "helicone"] +litellm.failure_callback=["sentry"] ## set env variables -os.environ['SENTRY_API_URL'] = "" +os.environ['SENTRY_API_URL'], os.environ['SENTRY_API_TRACE_RATE']= "" os.environ['POSTHOG_API_KEY'], os.environ['POSTHOG_API_URL'] = "api-key", "api-url" - -# init liteLLM client -client = litellm_client(success_callback=["posthog"], failure_callback=["sentry", "posthog"]) -completion = client.completion -embedding = client.embedding +os.environ["HELICONE_API_KEY"] = "" response = completion(model="gpt-3.5-turbo", messages=messages) ``` diff --git a/docs/client_integrations.md b/docs/client_integrations.md index 83de02a41..a7ebc6969 100644 --- a/docs/client_integrations.md +++ b/docs/client_integrations.md @@ -1,10 +1,11 @@ # Data Logging Integrations -| Integration | Required OS Variables | How to Use with litellm Client | +| Integration | Required OS Variables | How to Use with callbacks | |-----------------|--------------------------------------------|-------------------------------------------| -| Sentry | `SENTRY_API_URL` | `client = litellm_client(success_callback=["sentry"], failure_callback=["sentry"])` | -| Posthog | `POSTHOG_API_KEY`,
`POSTHOG_API_URL` | `client = litellm_client(success_callback=["posthog"], failure_callback=["posthog"])` | -| Slack | `SLACK_API_TOKEN`,
`SLACK_API_SECRET`,
`SLACK_API_CHANNEL` | `client = litellm_client(success_callback=["slack"], failure_callback=["slack"])` | +| Sentry | `SENTRY_API_URL` | `litellm.success_callback=["sentry"], litellm.failure_callback=["sentry"]` | +| Posthog | `POSTHOG_API_KEY`,
`POSTHOG_API_URL` | `litellm.success_callback=["posthog"], litellm.failure_callback=["posthog"]` | +| Slack | `SLACK_API_TOKEN`,
`SLACK_API_SECRET`,
`SLACK_API_CHANNEL` | `litellm.success_callback=["slack"], litellm.failure_callback=["slack"]` | +| Helicone | `HELICONE_API_TOKEN` | `litellm.success_callback=["helicone"]` | diff --git a/docs/index.md b/docs/index.md index b58918f09..dba0cee0d 100644 --- a/docs/index.md +++ b/docs/index.md @@ -4,7 +4,11 @@ a light 100 line package to simplify calling OpenAI, Azure, Cohere, Anthropic AP ###### litellm manages: * Calling all LLM APIs using the OpenAI format - `completion(model, messages)` * Consistent output for all LLM APIs, text responses will always be available at `['choices'][0]['message']['content']` -* **[Advanced]** Automatically logging your output to Sentry, Posthog, Slack [see liteLLM Client](https://litellm.readthedocs.io/en/latest/advanced/) +* Consistent Exceptions for all LLM APIs, we map RateLimit, Context Window, and Authentication Error exceptions across all providers to their OpenAI equivalents. [see Code](https://github.com/BerriAI/litellm/blob/ba1079ff6698ef238c5c7f771dd2b698ec76f8d9/litellm/utils.py#L250) + +###### observability: +* Logging - see exactly what the raw model request/response is `completion(.., logger_fn=your_logging_fn)` +* Callbacks - automatically send your data to Helicone, Sentry, Posthog, Slack - `litellm.success_callbacks`, `litellm.failure_callbacks` [see Callbacks](https://litellm.readthedocs.io/en/latest/advanced/) ## Quick Start Go directly to code: [Getting Started Notebook](https://colab.research.google.com/drive/1gR3pY-JzDZahzpVdbGBtrNGDBmzUNJaJ?usp=sharing) diff --git a/docs/supported.md b/docs/supported.md index e6107d0ac..692a55e7d 100644 --- a/docs/supported.md +++ b/docs/supported.md @@ -5,6 +5,8 @@ | Model Name | Function Call | Required OS Variables | |------------------|----------------------------------------|--------------------------------------| | gpt-3.5-turbo | `completion('gpt-3.5-turbo', messages)` | `os.environ['OPENAI_API_KEY']` | +| gpt-3.5-turbo-16k | `completion('gpt-3.5-turbo-16k', messages)` | `os.environ['OPENAI_API_KEY']` | +| gpt-3.5-turbo-16k-0613 | `completion('gpt-3.5-turbo-16k-0613', messages)` | `os.environ['OPENAI_API_KEY']` | | gpt-4 | `completion('gpt-4', messages)` | `os.environ['OPENAI_API_KEY']` | ## Azure OpenAI Chat Completion Models @@ -26,16 +28,11 @@ |------------------|--------------------------------------------|--------------------------------------| | command-nightly | `completion('command-nightly', messages)` | `os.environ['COHERE_API_KEY']` | -### OpenRouter Models -| Model Name | Function Call | Required OS Variables | -|----------------------------------|----------------------------------------------------------------------|---------------------------------------------------------------------------| -| google/palm-2-codechat-bison | `completion('google/palm-2-codechat-bison', messages)` | `os.environ['OPENROUTER_API_KEY']`,
`os.environ['OR_SITE_URL']`,
`os.environ['OR_APP_NAME']` | -| google/palm-2-chat-bison | `completion('google/palm-2-chat-bison', messages)` | `os.environ['OPENROUTER_API_KEY']`,
`os.environ['OR_SITE_URL']`,
`os.environ['OR_APP_NAME']` | -| openai/gpt-3.5-turbo | `completion('openai/gpt-3.5-turbo', messages)` | `os.environ['OPENROUTER_API_KEY']`,
`os.environ['OR_SITE_URL']`,
`os.environ['OR_APP_NAME']` | -| openai/gpt-3.5-turbo-16k | `completion('openai/gpt-3.5-turbo-16k', messages)` | `os.environ['OPENROUTER_API_KEY']`,
`os.environ['OR_SITE_URL']`,
`os.environ['OR_APP_NAME']` | -| openai/gpt-4-32k | `completion('openai/gpt-4-32k', messages)` | `os.environ['OPENROUTER_API_KEY']`,
`os.environ['OR_SITE_URL']`,
`os.environ['OR_APP_NAME']` | -| anthropic/claude-2 | `completion('anthropic/claude-2', messages)` | `os.environ['OPENROUTER_API_KEY']`,
`os.environ['OR_SITE_URL']`,
`os.environ['OR_APP_NAME']` | -| anthropic/claude-instant-v1 | `completion('anthropic/claude-instant-v1', messages)` | `os.environ['OPENROUTER_API_KEY']`,
`os.environ['OR_SITE_URL']`,
`os.environ['OR_APP_NAME']` | -| meta-llama/llama-2-13b-chat | `completion('meta-llama/llama-2-13b-chat', messages)` | `os.environ['OPENROUTER_API_KEY']`,
`os.environ['OR_SITE_URL']`,
`os.environ['OR_APP_NAME']` | -| meta-llama/llama-2-70b-chat | `completion('meta-llama/llama-2-70b-chat', messages)` | `os.environ['OPENROUTER_API_KEY']`,
`os.environ['OR_SITE_URL']`,
`os.environ['OR_APP_NAME']` | +### Anthropic Models + +| Model Name | Function Call | Required OS Variables | +|------------------|--------------------------------------------|--------------------------------------| +| claude-instant-1 | `completion('claude-instant-1', messages)` | `os.environ['ANTHROPIC_API_KEY']` | +| claude-v2 | `completion('claude-v2', messages)` | `os.environ['ANTHROPIC_API_KEY']` | + diff --git a/litellm.egg-info/PKG-INFO b/litellm.egg-info/PKG-INFO index 2e24f886b..bac726f75 100644 --- a/litellm.egg-info/PKG-INFO +++ b/litellm.egg-info/PKG-INFO @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: litellm -Version: 0.1.220 +Version: 0.1.222 Summary: Library to easily interface with LLM API providers Author: BerriAI License-File: LICENSE diff --git a/litellm/utils.py b/litellm/utils.py index 1cbbb37cf..16fab0aee 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -112,6 +112,7 @@ def set_callbacks(callback_list): subprocess.check_call([sys.executable, '-m', 'pip', 'install', 'sentry_sdk']) import sentry_sdk sentry_sdk_instance = sentry_sdk + sentry_trace_rate = os.environ.get("SENTRY_API_TRACE_RATE") if "SENTRY_API_TRACE_RATE" in os.environ else "1.0" sentry_sdk_instance.init(dsn=os.environ.get("SENTRY_API_URL"), traces_sample_rate=float(os.environ.get("SENTRY_API_TRACE_RATE"))) capture_exception = sentry_sdk_instance.capture_exception add_breadcrumb = sentry_sdk_instance.add_breadcrumb diff --git a/setup.py b/setup.py index e2d3a25be..641473e0a 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages setup( name='litellm', - version='0.1.221', + version='0.1.222', description='Library to easily interface with LLM API providers', author='BerriAI', packages=[