From 548fcfdff92af0fd99ec3a57ea53ce4543d73fc6 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Wed, 2 Aug 2023 15:15:33 -0700 Subject: [PATCH] pass in api key via params --- build/lib/litellm/main.py | 41 ++++-------------- dist/litellm-0.1.217.tar.gz | Bin 9968 -> 0 bytes ...y.whl => litellm-0.1.218-py3-none-any.whl} | Bin 9890 -> 9914 bytes dist/litellm-0.1.218.tar.gz | Bin 0 -> 9982 bytes litellm.egg-info/PKG-INFO | 2 +- litellm/main.py | 41 ++++-------------- litellm/tests/test_api_key_param.py | 25 +++++++++++ litellm/tests/test_logging.py | 2 +- setup.py | 2 +- 9 files changed, 46 insertions(+), 67 deletions(-) delete mode 100644 dist/litellm-0.1.217.tar.gz rename dist/{litellm-0.1.217-py3-none-any.whl => litellm-0.1.218-py3-none-any.whl} (51%) create mode 100644 dist/litellm-0.1.218.tar.gz create mode 100644 litellm/tests/test_api_key_param.py diff --git a/build/lib/litellm/main.py b/build/lib/litellm/main.py index a90c9bf81..55d560814 100644 --- a/build/lib/litellm/main.py +++ b/build/lib/litellm/main.py @@ -63,7 +63,7 @@ def completion( temperature=1, top_p=1, n=1, stream=False, stop=None, max_tokens=float('inf'), presence_penalty=0, frequency_penalty=0, logit_bias={}, user="", # Optional liteLLM function params - *, force_timeout=60, azure=False, logger_fn=None, verbose=False + *, api_key=None, force_timeout=60, azure=False, logger_fn=None, verbose=False ): try: # check if user passed in any of the OpenAI optional params @@ -77,7 +77,7 @@ def completion( openai.api_type = "azure" openai.api_base = os.environ.get("AZURE_API_BASE") openai.api_version = os.environ.get("AZURE_API_VERSION") - openai.api_key = os.environ.get("AZURE_API_KEY") + openai.api_key = api_key if api_key is not None else os.environ.get("AZURE_API_KEY") ## LOGGING logging(model=model, input=messages, azure=azure, logger_fn=logger_fn) ## COMPLETION CALL @@ -90,10 +90,9 @@ def completion( openai.api_type = "openai" openai.api_base = "https://api.openai.com/v1" openai.api_version = None - openai.api_key = os.environ.get("OPENAI_API_KEY") + openai.api_key = api_key if api_key is not None else os.environ.get("OPENAI_API_KEY") ## LOGGING logging(model=model, input=messages, azure=azure, logger_fn=logger_fn) - ## COMPLETION CALL response = openai.ChatCompletion.create( model=model, @@ -104,7 +103,7 @@ def completion( openai.api_type = "openai" openai.api_base = "https://api.openai.com/v1" openai.api_version = None - openai.api_key = os.environ.get("OPENAI_API_KEY") + openai.api_key = api_key if api_key is not None else os.environ.get("OPENAI_API_KEY") prompt = " ".join([message["content"] for message in messages]) ## LOGGING logging(model=model, input=prompt, azure=azure, logger_fn=logger_fn) @@ -119,6 +118,8 @@ def completion( if not os.environ.get("REPLICATE_API_TOKEN") and os.environ.get("REPLICATE_API_KEY"): replicate_api_token = os.environ.get("REPLICATE_API_KEY") os.environ["REPLICATE_API_TOKEN"] = replicate_api_token + elif api_key: + os.environ["REPLICATE_API_TOKEN"] = api_key prompt = " ".join([message["content"] for message in messages]) input = {"prompt": prompt} if max_tokens != float('inf'): @@ -148,6 +149,8 @@ def completion( response = new_response elif model in litellm.anthropic_models: #anthropic defaults to os.environ.get("ANTHROPIC_API_KEY") + if api_key: + os.environ["ANTHROPIC_API_KEY"] = api_key prompt = f"{HUMAN_PROMPT}" for message in messages: if "role" in message: @@ -187,7 +190,7 @@ def completion( print_verbose(f"new response: {new_response}") response = new_response elif model in litellm.cohere_models: - cohere_key = os.environ.get("COHERE_API_KEY") + cohere_key = api_key if api_key is not None else os.environ.get("COHERE_API_KEY") co = cohere.Client(cohere_key) prompt = " ".join([message["content"] for message in messages]) ## LOGGING @@ -210,32 +213,6 @@ def completion( ], } response = new_response - - elif model in litellm.open_ai_chat_completion_models: - openai.api_type = "openai" - openai.api_base = "https://api.openai.com/v1" - openai.api_version = None - openai.api_key = os.environ.get("OPENAI_API_KEY") - ## LOGGING - logging(model=model, input=messages, azure=azure, logger_fn=logger_fn) - ## COMPLETION CALL - response = openai.ChatCompletion.create( - model=model, - messages = messages - ) - elif model in litellm.open_ai_text_completion_models: - openai.api_type = "openai" - openai.api_base = "https://api.openai.com/v1" - openai.api_version = None - openai.api_key = os.environ.get("OPENAI_API_KEY") - prompt = " ".join([message["content"] for message in messages]) - ## LOGGING - logging(model=model, input=prompt, azure=azure, logger_fn=logger_fn) - ## COMPLETION CALL - response = openai.Completion.create( - model=model, - prompt = prompt - ) else: logging(model=model, input=messages, azure=azure, logger_fn=logger_fn) args = locals() diff --git a/dist/litellm-0.1.217.tar.gz b/dist/litellm-0.1.217.tar.gz deleted file mode 100644 index 32b5dbbc18d3f7a445c01b052b125593de17e078..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9968 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 diff --git a/dist/litellm-0.1.217-py3-none-any.whl b/dist/litellm-0.1.218-py3-none-any.whl similarity index 51% rename from dist/litellm-0.1.217-py3-none-any.whl rename to dist/litellm-0.1.218-py3-none-any.whl index 2c1ae431bec3d8e801ee3b30971f504b82cf34d0..3e95ae9de509da1acfa1efc20d9b109544485dc7 100644 GIT binary patch delta 3460 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 delta 3481 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 LxX6fjez*M#*Ht^q diff --git a/dist/litellm-0.1.218.tar.gz b/dist/litellm-0.1.218.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..a42de6be566bfaccfca3fbed3ac7b4311892b601 GIT binary patch literal 9982 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