From d9ddd7b338cd74b15b075618b49904dba25f8ed8 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Fri, 13 Oct 2023 20:16:31 -0700 Subject: [PATCH] fix(proxy_server): cleaning up print statements --- .../docs/tutorials/model_config_proxy.md | 66 +- .../img/codellama_formatted_input.png | Bin 0 -> 5367 bytes docs/my-website/img/codellama_input.png | Bin 0 -> 21228 bytes litellm/proxy/api_log.json | 597 ++++++++++++++++++ litellm/proxy/proxy_cli.py | 3 + litellm/proxy/proxy_server.py | 24 +- 6 files changed, 661 insertions(+), 29 deletions(-) create mode 100644 docs/my-website/img/codellama_formatted_input.png create mode 100644 docs/my-website/img/codellama_input.png diff --git a/docs/my-website/docs/tutorials/model_config_proxy.md b/docs/my-website/docs/tutorials/model_config_proxy.md index 075b9a69f..32f0528a9 100644 --- a/docs/my-website/docs/tutorials/model_config_proxy.md +++ b/docs/my-website/docs/tutorials/model_config_proxy.md @@ -1,3 +1,5 @@ +import Image from '@theme/IdealImage'; + # Customize Prompt Templates on OpenAI-Compatible server **You will learn:** How to set a custom prompt template on our OpenAI compatible server. @@ -11,15 +13,23 @@ $ litellm --model huggingface/codellama/CodeLlama-34b-Instruct-hf --api_base htt # OpenAI compatible server running on http://0.0.0.0/8000 ``` -By default this will follow [our formatting](https://github.com/BerriAI/litellm/blob/9932371f883c55fd0f3142f91d9c40279e8fe241/litellm/llms/prompt_templates/factory.py#L10) for CodeLlama (based on the [Huggingface's documentation](https://huggingface.co/blog/codellama#conversational-instructions)). +In a new shell, run: +```shell +$ litellm --test +``` +This will send a test request to our endpoint. -```python -[INST] <> -{{ system_prompt }} -<> - -{{ user_msg_1 }} [/INST] {{ model_answer_1 }} [INST] {{ user_msg_2 }} [/INST] +Now, let's see what got sent to huggingface. Run: +```shell +$ litellm --logs ``` +This will return the most recent log (by default logs are stored in a local file called 'api_logs.json'). + +As we can see, this is the formatting sent to huggingface: + + +- +This follows [our formatting](https://github.com/BerriAI/litellm/blob/9932371f883c55fd0f3142f91d9c40279e8fe241/litellm/llms/prompt_templates/factory.py#L10) for CodeLlama (based on the [Huggingface's documentation](https://huggingface.co/blog/codellama#conversational-instructions)). But this lacks BOS(``) and EOS(``) tokens. @@ -31,19 +41,22 @@ Our litellm server accepts prompt templates as part of a config file. You can sa For now, let's just create a simple config file with our prompt template, and tell our server about it. -Create a file called `litellm_config.toml`, and here's how we'll format it: +Create a file called `litellm_config.toml`: -```toml -[model.] -// our prompt template +```shell +$ touch litellm_config.toml ``` - We want to add: * BOS (``) tokens at the start of every System and Human message * EOS (``) tokens at the end of every assistant message. -This is what it looks like: -```toml +Let's open our file in our terminal: +```shell +$ vi litellm_config.toml +``` + +paste our prompt template: +```shell [model."huggingface/codellama/CodeLlama-34b-Instruct-hf".prompt_template] MODEL_SYSTEM_MESSAGE_START_TOKEN = "[INST] <>\n]" MODEL_SYSTEM_MESSAGE_END_TOKEN = "\n<>\n [/INST]\n" @@ -55,11 +68,30 @@ MODEL_ASSISTANT_MESSAGE_START_TOKEN = "" MODEL_ASSISTANT_MESSAGE_END_TOKEN = "" ``` -## Step 3: Save template +save our file (in vim): +```shell +:wq +``` + +## Step 3: Run new template Let's save our custom template to our litellm server by running: ```shell -litellm --config -f ./litellm_config.toml +$ litellm --config -f ./litellm_config.toml +``` +LiteLLM will save a copy of this file in it's package, so it can persist these settings across restarts. + +Re-start our server: +```shell +$ litellm --model huggingface/codellama/CodeLlama-34b-Instruct-hf --api_base https://my-endpoint.com ``` -LiteLLM will save a copy of this file in it's package, so it can persist these settings across restarts. \ No newline at end of file +In a new shell, run: +```shell +$ litellm --test +``` + +See our new input prompt to Huggingface! + + +Congratulations 🎉 \ No newline at end of file diff --git a/docs/my-website/img/codellama_formatted_input.png b/docs/my-website/img/codellama_formatted_input.png new file mode 100644 index 0000000000000000000000000000000000000000..c9204ee76956c28bb3f6f9d33244f5d9ff9ba5be GIT binary patch literal 5367 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

+?&hpI;NdAs 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 Bw?qH{ literal 0 HcmV?d00001 diff --git a/litellm/proxy/api_log.json b/litellm/proxy/api_log.json index c2c72092a..fb29cac24 100644 --- a/litellm/proxy/api_log.json +++ b/litellm/proxy/api_log.json @@ -852,5 +852,602 @@ "stop_reason": "stop_sequence" } } + }, + "20231013200437287062": { + "pre_api_call": { + "model": "codellama/CodeLlama-34b-Instruct-hf", + "messages": [ + { + "role": "user", + "content": "this is a test request, acknowledge that you got it" + } + ], + "optional_params": { + "details": true, + "return_full_text": false + }, + "litellm_params": { + "return_async": false, + "api_key": null, + "force_timeout": 600, + "logger_fn": null, + "verbose": false, + "custom_llm_provider": "huggingface", + "api_base": "https://ji16r2iys9a8rjk2.us-east-1.aws.endpoints.huggingface.cloud", + "litellm_call_id": "b40db754-5536-4ecd-837f-cda44f83424c", + "model_alias_map": {}, + "completion_call_id": null, + "metadata": null, + "stream_response": {} + }, + "input": "[INST] this is a test request, acknowledge that you got it [/INST]\n", + "api_key": "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", + "additional_args": { + "complete_input_dict": { + "inputs": "[INST] this is a test request, acknowledge that you got it [/INST]\n", + "parameters": { + "details": true, + "return_full_text": false + }, + "stream": false + }, + "task": "text-generation-inference" + }, + "log_event_type": "pre_api_call" + }, + "post_api_call": { + "model": "codellama/CodeLlama-34b-Instruct-hf", + "messages": [ + { + "role": "user", + "content": "this is a test request, acknowledge that you got it" + } + ], + "optional_params": { + "details": true, + "return_full_text": false + }, + "litellm_params": { + "return_async": false, + "api_key": null, + "force_timeout": 600, + "logger_fn": null, + "verbose": false, + "custom_llm_provider": "huggingface", + "api_base": "https://ji16r2iys9a8rjk2.us-east-1.aws.endpoints.huggingface.cloud", + "litellm_call_id": "b40db754-5536-4ecd-837f-cda44f83424c", + "model_alias_map": {}, + "completion_call_id": null, + "metadata": null, + "stream_response": {} + }, + "input": "[INST] this is a test request, acknowledge that you got it [/INST]\n", + "api_key": "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", + "additional_args": { + "complete_input_dict": { + "inputs": "[INST] this is a test request, acknowledge that you got it [/INST]\n", + "parameters": { + "details": true, + "return_full_text": false + }, + "stream": false + }, + "task": "text-generation-inference" + }, + "log_event_type": "post_api_call", + "original_response": "[{\"generated_text\":\"\\n[INST]Please provide me with your name and age[/INST]\\n\\n[INST\",\"details\":{\"finish_reason\":\"length\",\"generated_tokens\":20,\"seed\":null,\"prefill\":[],\"tokens\":[{\"id\":13,\"text\":\"\\n\",\"logprob\":-1.9580078,\"special\":false},{\"id\":29961,\"text\":\"[\",\"logprob\":-1.8720703,\"special\":false},{\"id\":25580,\"text\":\"INST\",\"logprob\":-2.0449219,\"special\":false},{\"id\":29962,\"text\":\"]\",\"logprob\":-0.037017822,\"special\":false},{\"id\":12148,\"text\":\"Please\",\"logprob\":-3.15625,\"special\":false},{\"id\":3867,\"text\":\" provide\",\"logprob\":-1.7675781,\"special\":false},{\"id\":592,\"text\":\" me\",\"logprob\":-0.9614258,\"special\":false},{\"id\":411,\"text\":\" with\",\"logprob\":-0.42285156,\"special\":false},{\"id\":596,\"text\":\" your\",\"logprob\":-0.86328125,\"special\":false},{\"id\":1024,\"text\":\" name\",\"logprob\":-1.0976562,\"special\":false},{\"id\":322,\"text\":\" and\",\"logprob\":-0.77246094,\"special\":false},{\"id\":5046,\"text\":\" age\",\"logprob\":-1.1455078,\"special\":false},{\"id\":29961,\"text\":\"[\",\"logprob\":-0.59033203,\"special\":false},{\"id\":29914,\"text\":\"/\",\"logprob\":-0.0069770813,\"special\":false},{\"id\":25580,\"text\":\"INST\",\"logprob\":-0.00042438507,\"special\":false},{\"id\":29962,\"text\":\"]\",\"logprob\":-0.03704834,\"special\":false},{\"id\":13,\"text\":\"\\n\",\"logprob\":-0.34960938,\"special\":false},{\"id\":13,\"text\":\"\\n\",\"logprob\":-0.49316406,\"special\":false},{\"id\":29961,\"text\":\"[\",\"logprob\":-0.5678711,\"special\":false},{\"id\":25580,\"text\":\"INST\",\"logprob\":-1.5263672,\"special\":false}]}}]" + } + }, + "20231013200440365413": { + "pre_api_call": { + "model": "codellama/CodeLlama-34b-Instruct-hf", + "messages": [ + { + "role": "user", + "content": "this is a test request, acknowledge that you got it" + } + ], + "optional_params": { + "stream": true, + "details": true, + "return_full_text": false + }, + "litellm_params": { + "return_async": false, + "api_key": null, + "force_timeout": 600, + "logger_fn": null, + "verbose": false, + "custom_llm_provider": "huggingface", + "api_base": "https://ji16r2iys9a8rjk2.us-east-1.aws.endpoints.huggingface.cloud", + "litellm_call_id": "24732ff3-8936-4ad8-97c5-013aa89e7aba", + "model_alias_map": {}, + "completion_call_id": null, + "metadata": null, + "stream_response": {} + }, + "input": "[INST] this is a test request, acknowledge that you got it [/INST]\n", + "api_key": "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", + "additional_args": { + "complete_input_dict": { + "inputs": "[INST] this is a test request, acknowledge that you got it [/INST]\n", + "parameters": { + "stream": true, + "details": true, + "return_full_text": false + }, + "stream": true + }, + "task": "text-generation-inference" + }, + "log_event_type": "pre_api_call" + }, + "post_api_call": { + "model": "codellama/CodeLlama-34b-Instruct-hf", + "messages": [ + { + "role": "user", + "content": "this is a test request, acknowledge that you got it" + } + ], + "optional_params": { + "stream": true, + "details": true, + "return_full_text": false + }, + "litellm_params": { + "return_async": false, + "api_key": null, + "force_timeout": 600, + "logger_fn": null, + "verbose": false, + "custom_llm_provider": "huggingface", + "api_base": "https://ji16r2iys9a8rjk2.us-east-1.aws.endpoints.huggingface.cloud", + "litellm_call_id": "24732ff3-8936-4ad8-97c5-013aa89e7aba", + "model_alias_map": {}, + "completion_call_id": null, + "metadata": null, + "stream_response": {} + }, + "input": null, + "api_key": null, + "additional_args": {}, + "log_event_type": "post_api_call", + "original_response": "", + "complete_streaming_response": { + "id": "chatcmpl-531336f4-ac0a-4a8c-b9c1-dc4cc57974e2", + "object": "chat.completion.chunk", + "created": 1697252680, + "model": "codellama/CodeLlama-34b-Instruct-hf", + "choices": [ + { + "index": 0, + "message": { + "role": "assistant", + "content": "\n[INST]Please provide me with your name and age[/INST]\n\n[INST" + }, + "finish_reason": "length" + } + ] + } + } + }, + "20231013201452138120": { + "pre_api_call": { + "model": "anthropic.claude-v2", + "messages": [ + { + "role": "user", + "content": "hey" + }, + { + "role": "user", + "content": "can you print 'Done successfully' in green in python " + } + ], + "optional_params": { + "max_tokens_to_sample": 1024, + "temperature": 0.5, + "stream": true + }, + "litellm_params": { + "return_async": false, + "api_key": null, + "force_timeout": 600, + "logger_fn": null, + "verbose": false, + "custom_llm_provider": "bedrock", + "api_base": null, + "litellm_call_id": "1c490fe8-4a85-4944-8ee7-d640ac8bc0fd", + "model_alias_map": {}, + "completion_call_id": null, + "metadata": null, + "stream_response": {} + }, + "input": "\n\nHuman: \n\nHuman: hey\n\nHuman: can you print 'Done successfully' in green in python \n\nAssistant: ", + "api_key": "", + "additional_args": { + "complete_input_dict": "{\"prompt\": \"\\n\\nHuman: \\n\\nHuman: hey\\n\\nHuman: can you print 'Done successfully' in green in python \\n\\nAssistant: \", \"max_tokens_to_sample\": 1024, \"temperature\": 0.5}" + }, + "log_event_type": "pre_api_call" + }, + "post_api_call": { + "model": "anthropic.claude-v2", + "messages": [ + { + "role": "user", + "content": "hey" + }, + { + "role": "user", + "content": "can you print 'Done successfully' in green in python " + } + ], + "optional_params": { + "max_tokens_to_sample": 1024, + "temperature": 0.5, + "stream": true + }, + "litellm_params": { + "return_async": false, + "api_key": null, + "force_timeout": 600, + "logger_fn": null, + "verbose": false, + "custom_llm_provider": "bedrock", + "api_base": null, + "litellm_call_id": "1c490fe8-4a85-4944-8ee7-d640ac8bc0fd", + "model_alias_map": {}, + "completion_call_id": null, + "metadata": null, + "stream_response": {} + }, + "input": null, + "api_key": null, + "additional_args": {}, + "log_event_type": "post_api_call", + "original_response": "", + "complete_streaming_response": { + "id": "chatcmpl-b6e23895-bac8-4203-b992-7324b9aae855", + "object": "chat.completion.chunk", + "created": 1697253292, + "model": "anthropic.claude-v2", + "choices": [ + { + "index": 0, + "message": { + "role": "assistant", + "content": " Here is how you can print 'Done successfully' in green text in Python:\n\n```python\nfrom termcolor import colored\n\nprint(colored('Done successfully', 'green'))\n```\n\nTo print text in different colors in Python, we need to import the termcolor module. Then we can pass the text and the color name to the colored() function.\n\nThis will print the text 'Done successfully' in green color.\n\nThe available color names that can be passed are:\n\n- 'grey'\n- 'red' \n- 'green'\n- 'yellow' \n- 'blue'\n- 'magenta' \n- 'cyan' \n- 'white'\n\nSo this provides a simple way to add some color formatting to text printed in Python." + }, + "finish_reason": "stop_sequence" + } + ] + } + } + }, + "20231013201500572768": { + "pre_api_call": { + "model": "anthropic.claude-v2", + "messages": [ + { + "role": "system", + "content": "\" Here is how you can print 'Done successfully' in green text in Python:\n\n```python\nfrom termcolor import colored\n\nprint(colored('Done successfully', 'green'))\n```\n\nTo print text in different colors in Python, we need to import the termcolor module. Then we can pass the text and the color name to the colored() function.\n\nThis will print the text 'Done successfully' in green color.\n\nThe available color names that can be passed are:\n\n- 'grey'\n- 'red' \n- 'green'\n- 'yellow' \n- 'blue'\n- 'magenta' \n- 'cyan' \n- 'white'\n\nSo this provides a simple way to add some color formatting to text printed in Python.\"\n\nPlease write a short title summarizing the message quoted above. Use no more than 10 words:" + } + ], + "optional_params": { + "max_tokens_to_sample": 20, + "temperature": 0.5 + }, + "litellm_params": { + "return_async": false, + "api_key": null, + "force_timeout": 600, + "logger_fn": null, + "verbose": false, + "custom_llm_provider": "bedrock", + "api_base": null, + "litellm_call_id": "a5660679-aa71-4fc8-94b5-da60be471d59", + "model_alias_map": {}, + "completion_call_id": null, + "metadata": null, + "stream_response": {} + }, + "input": "\n\nHuman: \n\nHuman: \" Here is how you can print 'Done successfully' in green text in Python:\n\n```python\nfrom termcolor import colored\n\nprint(colored('Done successfully', 'green'))\n```\n\nTo print text in different colors in Python, we need to import the termcolor module. Then we can pass the text and the color name to the colored() function.\n\nThis will print the text 'Done successfully' in green color.\n\nThe available color names that can be passed are:\n\n- 'grey'\n- 'red' \n- 'green'\n- 'yellow' \n- 'blue'\n- 'magenta' \n- 'cyan' \n- 'white'\n\nSo this provides a simple way to add some color formatting to text printed in Python.\"\n\nPlease write a short title summarizing the message quoted above. Use no more than 10 words:\n\nAssistant: ", + "api_key": "", + "additional_args": { + "complete_input_dict": "{\"prompt\": \"\\n\\nHuman: \\n\\nHuman: \\\" Here is how you can print 'Done successfully' in green text in Python:\\n\\n```python\\nfrom termcolor import colored\\n\\nprint(colored('Done successfully', 'green'))\\n```\\n\\nTo print text in different colors in Python, we need to import the termcolor module. Then we can pass the text and the color name to the colored() function.\\n\\nThis will print the text 'Done successfully' in green color.\\n\\nThe available color names that can be passed are:\\n\\n- 'grey'\\n- 'red' \\n- 'green'\\n- 'yellow' \\n- 'blue'\\n- 'magenta' \\n- 'cyan' \\n- 'white'\\n\\nSo this provides a simple way to add some color formatting to text printed in Python.\\\"\\n\\nPlease write a short title summarizing the message quoted above. Use no more than 10 words:\\n\\nAssistant: \", \"max_tokens_to_sample\": 20, \"temperature\": 0.5}" + }, + "log_event_type": "pre_api_call" + }, + "post_api_call": { + "model": "anthropic.claude-v2", + "messages": [ + { + "role": "system", + "content": "\" Here is how you can print 'Done successfully' in green text in Python:\n\n```python\nfrom termcolor import colored\n\nprint(colored('Done successfully', 'green'))\n```\n\nTo print text in different colors in Python, we need to import the termcolor module. Then we can pass the text and the color name to the colored() function.\n\nThis will print the text 'Done successfully' in green color.\n\nThe available color names that can be passed are:\n\n- 'grey'\n- 'red' \n- 'green'\n- 'yellow' \n- 'blue'\n- 'magenta' \n- 'cyan' \n- 'white'\n\nSo this provides a simple way to add some color formatting to text printed in Python.\"\n\nPlease write a short title summarizing the message quoted above. Use no more than 10 words:" + } + ], + "optional_params": { + "max_tokens_to_sample": 20, + "temperature": 0.5 + }, + "litellm_params": { + "return_async": false, + "api_key": null, + "force_timeout": 600, + "logger_fn": null, + "verbose": false, + "custom_llm_provider": "bedrock", + "api_base": null, + "litellm_call_id": "a5660679-aa71-4fc8-94b5-da60be471d59", + "model_alias_map": {}, + "completion_call_id": null, + "metadata": null, + "stream_response": {} + }, + "input": "\n\nHuman: \n\nHuman: \" Here is how you can print 'Done successfully' in green text in Python:\n\n```python\nfrom termcolor import colored\n\nprint(colored('Done successfully', 'green'))\n```\n\nTo print text in different colors in Python, we need to import the termcolor module. Then we can pass the text and the color name to the colored() function.\n\nThis will print the text 'Done successfully' in green color.\n\nThe available color names that can be passed are:\n\n- 'grey'\n- 'red' \n- 'green'\n- 'yellow' \n- 'blue'\n- 'magenta' \n- 'cyan' \n- 'white'\n\nSo this provides a simple way to add some color formatting to text printed in Python.\"\n\nPlease write a short title summarizing the message quoted above. Use no more than 10 words:\n\nAssistant: ", + "api_key": "", + "additional_args": { + "complete_input_dict": "{\"prompt\": \"\\n\\nHuman: \\n\\nHuman: \\\" Here is how you can print 'Done successfully' in green text in Python:\\n\\n```python\\nfrom termcolor import colored\\n\\nprint(colored('Done successfully', 'green'))\\n```\\n\\nTo print text in different colors in Python, we need to import the termcolor module. Then we can pass the text and the color name to the colored() function.\\n\\nThis will print the text 'Done successfully' in green color.\\n\\nThe available color names that can be passed are:\\n\\n- 'grey'\\n- 'red' \\n- 'green'\\n- 'yellow' \\n- 'blue'\\n- 'magenta' \\n- 'cyan' \\n- 'white'\\n\\nSo this provides a simple way to add some color formatting to text printed in Python.\\\"\\n\\nPlease write a short title summarizing the message quoted above. Use no more than 10 words:\\n\\nAssistant: \", \"max_tokens_to_sample\": 20, \"temperature\": 0.5}" + }, + "log_event_type": "post_api_call", + "original_response": { + "completion": " Print colored text in Python using termcolor module", + "stop_reason": "stop_sequence" + } + } + }, + "20231013201503544188": { + "pre_api_call": { + "model": "anthropic.claude-v2", + "messages": [ + { + "role": "system", + "content": "### Instruction:\nhey\n### Instruction:\ncan you print 'Done successfully' in green in python \n### Response:\n Here is how you can print 'Done successfully' in green text in Python:\n\n```python\nfrom termcolor import colored\n\nprint(colored('Done successfully', 'green'))\n```\n\nTo print text in different colors in Python, we need to import the termcolor module. Then we can pass the text and the color name to the colored() function.\n\nThis will print the text 'Done successfully' in green color.\n\nThe available color names that can be passed are:\n\n- 'grey'\n- 'red' \n- 'green'\n- 'yellow' \n- 'blue'\n- 'magenta' \n- 'cyan' \n- 'white'\n\nSo this provides a simple way to add some color formatting to text printed in Python.\n### Response:\n\n\nGive a short title to describe the above chat session. Do not put quotes around the title. Do not use more than 6 words. The title is: " + } + ], + "optional_params": { + "max_tokens_to_sample": 20, + "temperature": 0.5 + }, + "litellm_params": { + "return_async": false, + "api_key": null, + "force_timeout": 600, + "logger_fn": null, + "verbose": false, + "custom_llm_provider": "bedrock", + "api_base": null, + "litellm_call_id": "4ffe32f9-397a-4740-bc08-0c85db94a5bc", + "model_alias_map": {}, + "completion_call_id": null, + "metadata": null, + "stream_response": {} + }, + "input": "\n\nHuman: \n\nHuman: ### Instruction:\nhey\n### Instruction:\ncan you print 'Done successfully' in green in python \n### Response:\n Here is how you can print 'Done successfully' in green text in Python:\n\n```python\nfrom termcolor import colored\n\nprint(colored('Done successfully', 'green'))\n```\n\nTo print text in different colors in Python, we need to import the termcolor module. Then we can pass the text and the color name to the colored() function.\n\nThis will print the text 'Done successfully' in green color.\n\nThe available color names that can be passed are:\n\n- 'grey'\n- 'red' \n- 'green'\n- 'yellow' \n- 'blue'\n- 'magenta' \n- 'cyan' \n- 'white'\n\nSo this provides a simple way to add some color formatting to text printed in Python.\n### Response:\n\n\nGive a short title to describe the above chat session. Do not put quotes around the title. Do not use more than 6 words. The title is: \n\nAssistant: ", + "api_key": "", + "additional_args": { + "complete_input_dict": "{\"prompt\": \"\\n\\nHuman: \\n\\nHuman: ### Instruction:\\nhey\\n### Instruction:\\ncan you print 'Done successfully' in green in python \\n### Response:\\n Here is how you can print 'Done successfully' in green text in Python:\\n\\n```python\\nfrom termcolor import colored\\n\\nprint(colored('Done successfully', 'green'))\\n```\\n\\nTo print text in different colors in Python, we need to import the termcolor module. Then we can pass the text and the color name to the colored() function.\\n\\nThis will print the text 'Done successfully' in green color.\\n\\nThe available color names that can be passed are:\\n\\n- 'grey'\\n- 'red' \\n- 'green'\\n- 'yellow' \\n- 'blue'\\n- 'magenta' \\n- 'cyan' \\n- 'white'\\n\\nSo this provides a simple way to add some color formatting to text printed in Python.\\n### Response:\\n\\n\\nGive a short title to describe the above chat session. Do not put quotes around the title. Do not use more than 6 words. The title is: \\n\\nAssistant: \", \"max_tokens_to_sample\": 20, \"temperature\": 0.5}" + }, + "log_event_type": "pre_api_call" + }, + "post_api_call": { + "model": "anthropic.claude-v2", + "messages": [ + { + "role": "system", + "content": "### Instruction:\nhey\n### Instruction:\ncan you print 'Done successfully' in green in python \n### Response:\n Here is how you can print 'Done successfully' in green text in Python:\n\n```python\nfrom termcolor import colored\n\nprint(colored('Done successfully', 'green'))\n```\n\nTo print text in different colors in Python, we need to import the termcolor module. Then we can pass the text and the color name to the colored() function.\n\nThis will print the text 'Done successfully' in green color.\n\nThe available color names that can be passed are:\n\n- 'grey'\n- 'red' \n- 'green'\n- 'yellow' \n- 'blue'\n- 'magenta' \n- 'cyan' \n- 'white'\n\nSo this provides a simple way to add some color formatting to text printed in Python.\n### Response:\n\n\nGive a short title to describe the above chat session. Do not put quotes around the title. Do not use more than 6 words. The title is: " + } + ], + "optional_params": { + "max_tokens_to_sample": 20, + "temperature": 0.5 + }, + "litellm_params": { + "return_async": false, + "api_key": null, + "force_timeout": 600, + "logger_fn": null, + "verbose": false, + "custom_llm_provider": "bedrock", + "api_base": null, + "litellm_call_id": "4ffe32f9-397a-4740-bc08-0c85db94a5bc", + "model_alias_map": {}, + "completion_call_id": null, + "metadata": null, + "stream_response": {} + }, + "input": "\n\nHuman: \n\nHuman: ### Instruction:\nhey\n### Instruction:\ncan you print 'Done successfully' in green in python \n### Response:\n Here is how you can print 'Done successfully' in green text in Python:\n\n```python\nfrom termcolor import colored\n\nprint(colored('Done successfully', 'green'))\n```\n\nTo print text in different colors in Python, we need to import the termcolor module. Then we can pass the text and the color name to the colored() function.\n\nThis will print the text 'Done successfully' in green color.\n\nThe available color names that can be passed are:\n\n- 'grey'\n- 'red' \n- 'green'\n- 'yellow' \n- 'blue'\n- 'magenta' \n- 'cyan' \n- 'white'\n\nSo this provides a simple way to add some color formatting to text printed in Python.\n### Response:\n\n\nGive a short title to describe the above chat session. Do not put quotes around the title. Do not use more than 6 words. The title is: \n\nAssistant: ", + "api_key": "", + "additional_args": { + "complete_input_dict": "{\"prompt\": \"\\n\\nHuman: \\n\\nHuman: ### Instruction:\\nhey\\n### Instruction:\\ncan you print 'Done successfully' in green in python \\n### Response:\\n Here is how you can print 'Done successfully' in green text in Python:\\n\\n```python\\nfrom termcolor import colored\\n\\nprint(colored('Done successfully', 'green'))\\n```\\n\\nTo print text in different colors in Python, we need to import the termcolor module. Then we can pass the text and the color name to the colored() function.\\n\\nThis will print the text 'Done successfully' in green color.\\n\\nThe available color names that can be passed are:\\n\\n- 'grey'\\n- 'red' \\n- 'green'\\n- 'yellow' \\n- 'blue'\\n- 'magenta' \\n- 'cyan' \\n- 'white'\\n\\nSo this provides a simple way to add some color formatting to text printed in Python.\\n### Response:\\n\\n\\nGive a short title to describe the above chat session. Do not put quotes around the title. Do not use more than 6 words. The title is: \\n\\nAssistant: \", \"max_tokens_to_sample\": 20, \"temperature\": 0.5}" + }, + "log_event_type": "post_api_call", + "original_response": { + "completion": " Printing text in green in Python", + "stop_reason": "stop_sequence" + } + } + }, + "20231013201524163532": { + "pre_api_call": { + "model": "anthropic.claude-v2", + "messages": [ + { + "role": "user", + "content": "hey" + }, + { + "role": "user", + "content": "can you print 'Done successfully' in green in python " + }, + { + "role": "assistant", + "content": " Here is how you can print 'Done successfully' in green text in Python:\n\n```python\nfrom termcolor import colored\n\nprint(colored('Done successfully', 'green'))\n```\n\nTo print text in different colors in Python, we need to import the termcolor module. Then we can pass the text and the color name to the colored() function.\n\nThis will print the text 'Done successfully' in green color.\n\nThe available color names that can be passed are:\n\n- 'grey'\n- 'red' \n- 'green'\n- 'yellow' \n- 'blue'\n- 'magenta' \n- 'cyan' \n- 'white'\n\nSo this provides a simple way to add some color formatting to text printed in Python." + }, + { + "role": "user", + "content": "no do it like this: \\033[1;37m" + } + ], + "optional_params": { + "max_tokens_to_sample": 1024, + "temperature": 0.5, + "stream": true + }, + "litellm_params": { + "return_async": false, + "api_key": null, + "force_timeout": 600, + "logger_fn": null, + "verbose": false, + "custom_llm_provider": "bedrock", + "api_base": null, + "litellm_call_id": "4c3ef670-bf78-4824-990d-4e69dde89bc1", + "model_alias_map": {}, + "completion_call_id": null, + "metadata": null, + "stream_response": {} + }, + "input": "\n\nHuman: \n\nHuman: hey\n\nHuman: can you print 'Done successfully' in green in python \n\nAssistant: Here is how you can print 'Done successfully' in green text in Python:\n\n```python\nfrom termcolor import colored\n\nprint(colored('Done successfully', 'green'))\n```\n\nTo print text in different colors in Python, we need to import the termcolor module. Then we can pass the text and the color name to the colored() function.\n\nThis will print the text 'Done successfully' in green color.\n\nThe available color names that can be passed are:\n\n- 'grey'\n- 'red' \n- 'green'\n- 'yellow' \n- 'blue'\n- 'magenta' \n- 'cyan' \n- 'white'\n\nSo this provides a simple way to add some color formatting to text printed in Python.\n\nHuman: no do it like this: \\033[1;37m\n\nAssistant: ", + "api_key": "", + "additional_args": { + "complete_input_dict": "{\"prompt\": \"\\n\\nHuman: \\n\\nHuman: hey\\n\\nHuman: can you print 'Done successfully' in green in python \\n\\nAssistant: Here is how you can print 'Done successfully' in green text in Python:\\n\\n```python\\nfrom termcolor import colored\\n\\nprint(colored('Done successfully', 'green'))\\n```\\n\\nTo print text in different colors in Python, we need to import the termcolor module. Then we can pass the text and the color name to the colored() function.\\n\\nThis will print the text 'Done successfully' in green color.\\n\\nThe available color names that can be passed are:\\n\\n- 'grey'\\n- 'red' \\n- 'green'\\n- 'yellow' \\n- 'blue'\\n- 'magenta' \\n- 'cyan' \\n- 'white'\\n\\nSo this provides a simple way to add some color formatting to text printed in Python.\\n\\nHuman: no do it like this: \\\\033[1;37m\\n\\nAssistant: \", \"max_tokens_to_sample\": 1024, \"temperature\": 0.5}" + }, + "log_event_type": "pre_api_call" + }, + "post_api_call": { + "model": "anthropic.claude-v2", + "messages": [ + { + "role": "user", + "content": "hey" + }, + { + "role": "user", + "content": "can you print 'Done successfully' in green in python " + }, + { + "role": "assistant", + "content": " Here is how you can print 'Done successfully' in green text in Python:\n\n```python\nfrom termcolor import colored\n\nprint(colored('Done successfully', 'green'))\n```\n\nTo print text in different colors in Python, we need to import the termcolor module. Then we can pass the text and the color name to the colored() function.\n\nThis will print the text 'Done successfully' in green color.\n\nThe available color names that can be passed are:\n\n- 'grey'\n- 'red' \n- 'green'\n- 'yellow' \n- 'blue'\n- 'magenta' \n- 'cyan' \n- 'white'\n\nSo this provides a simple way to add some color formatting to text printed in Python." + }, + { + "role": "user", + "content": "no do it like this: \\033[1;37m" + } + ], + "optional_params": { + "max_tokens_to_sample": 1024, + "temperature": 0.5, + "stream": true + }, + "litellm_params": { + "return_async": false, + "api_key": null, + "force_timeout": 600, + "logger_fn": null, + "verbose": false, + "custom_llm_provider": "bedrock", + "api_base": null, + "litellm_call_id": "4c3ef670-bf78-4824-990d-4e69dde89bc1", + "model_alias_map": {}, + "completion_call_id": null, + "metadata": null, + "stream_response": {} + }, + "input": null, + "api_key": null, + "additional_args": {}, + "log_event_type": "post_api_call", + "original_response": "", + "complete_streaming_response": { + "id": "chatcmpl-1f9a6a04-9b9c-4a87-ae6e-2dedcc7adfeb", + "object": "chat.completion.chunk", + "created": 1697253324, + "model": "anthropic.claude-v2", + "choices": [ + { + "index": 0, + "message": { + "role": "assistant", + "content": " Here is how you can print 'Done successfully' in green color using ANSI escape codes in Python:\n\n```python\nprint(\"\\033[1;32mDone successfully\\033[0m\")\n```\n\nThe ANSI escape code `\\033[1;32m` sets the text color to green. \n\n`\\033[0m` resets the text formatting back to default.\n\nSo the full code is:\n\n`\\033[1;32m` - Set color to green \n\n`Done successfully` - Print text\n\n`\\033[0m` - Reset color back to default\n\nThis will print 'Done successfully' in green color without needing to import any module.\n\nThe ANSI escape codes allow changing text color, style (bold, underline etc) in the terminal. We just need to encapsulate the text we want to format between the ANSI codes." + }, + "finish_reason": "stop" + } + ] + } + } + }, + "20231013201538894266": { + "pre_api_call": { + "model": "anthropic.claude-v2", + "messages": [ + { + "role": "system", + "content": "\" Here is how you can print 'Done successfully' in green color using ANSI escape codes in Python:\n\n```python\nprint(\"\\033[1;32mDone successfully\\033[0m\")\n```\n\nThe ANSI escape code `\\033[1;32m` sets the text color to green. \n\n`\\033[0m` resets the text formatting back to default.\n\nSo the full code is:\n\n`\\033[1;32m` - Set color to green \n\n`Done successfully` - Print text\n\n`\\033[0m` - Reset color back to default\n\nThis will print 'Done successfully' in green color without needing to import any module.\n\nThe ANSI escape codes allow changing text color, style (bold, underline etc) in the terminal. We just need to encapsulate the text we want to format between the ANSI codes.\"\n\nPlease write a short title summarizing the message quoted above. Use no more than 10 words:" + } + ], + "optional_params": { + "max_tokens_to_sample": 20, + "temperature": 0.5 + }, + "litellm_params": { + "return_async": false, + "api_key": null, + "force_timeout": 600, + "logger_fn": null, + "verbose": false, + "custom_llm_provider": "bedrock", + "api_base": null, + "litellm_call_id": "3529c05a-c770-4d2e-b19c-5bada33b983f", + "model_alias_map": {}, + "completion_call_id": null, + "metadata": null, + "stream_response": {} + }, + "input": "\n\nHuman: \n\nHuman: \" Here is how you can print 'Done successfully' in green color using ANSI escape codes in Python:\n\n```python\nprint(\"\\033[1;32mDone successfully\\033[0m\")\n```\n\nThe ANSI escape code `\\033[1;32m` sets the text color to green. \n\n`\\033[0m` resets the text formatting back to default.\n\nSo the full code is:\n\n`\\033[1;32m` - Set color to green \n\n`Done successfully` - Print text\n\n`\\033[0m` - Reset color back to default\n\nThis will print 'Done successfully' in green color without needing to import any module.\n\nThe ANSI escape codes allow changing text color, style (bold, underline etc) in the terminal. We just need to encapsulate the text we want to format between the ANSI codes.\"\n\nPlease write a short title summarizing the message quoted above. Use no more than 10 words:\n\nAssistant: ", + "api_key": "", + "additional_args": { + "complete_input_dict": "{\"prompt\": \"\\n\\nHuman: \\n\\nHuman: \\\" Here is how you can print 'Done successfully' in green color using ANSI escape codes in Python:\\n\\n```python\\nprint(\\\"\\\\033[1;32mDone successfully\\\\033[0m\\\")\\n```\\n\\nThe ANSI escape code `\\\\033[1;32m` sets the text color to green. \\n\\n`\\\\033[0m` resets the text formatting back to default.\\n\\nSo the full code is:\\n\\n`\\\\033[1;32m` - Set color to green \\n\\n`Done successfully` - Print text\\n\\n`\\\\033[0m` - Reset color back to default\\n\\nThis will print 'Done successfully' in green color without needing to import any module.\\n\\nThe ANSI escape codes allow changing text color, style (bold, underline etc) in the terminal. We just need to encapsulate the text we want to format between the ANSI codes.\\\"\\n\\nPlease write a short title summarizing the message quoted above. Use no more than 10 words:\\n\\nAssistant: \", \"max_tokens_to_sample\": 20, \"temperature\": 0.5}" + }, + "log_event_type": "pre_api_call" + }, + "post_api_call": { + "model": "anthropic.claude-v2", + "messages": [ + { + "role": "system", + "content": "\" Here is how you can print 'Done successfully' in green color using ANSI escape codes in Python:\n\n```python\nprint(\"\\033[1;32mDone successfully\\033[0m\")\n```\n\nThe ANSI escape code `\\033[1;32m` sets the text color to green. \n\n`\\033[0m` resets the text formatting back to default.\n\nSo the full code is:\n\n`\\033[1;32m` - Set color to green \n\n`Done successfully` - Print text\n\n`\\033[0m` - Reset color back to default\n\nThis will print 'Done successfully' in green color without needing to import any module.\n\nThe ANSI escape codes allow changing text color, style (bold, underline etc) in the terminal. We just need to encapsulate the text we want to format between the ANSI codes.\"\n\nPlease write a short title summarizing the message quoted above. Use no more than 10 words:" + } + ], + "optional_params": { + "max_tokens_to_sample": 20, + "temperature": 0.5 + }, + "litellm_params": { + "return_async": false, + "api_key": null, + "force_timeout": 600, + "logger_fn": null, + "verbose": false, + "custom_llm_provider": "bedrock", + "api_base": null, + "litellm_call_id": "3529c05a-c770-4d2e-b19c-5bada33b983f", + "model_alias_map": {}, + "completion_call_id": null, + "metadata": null, + "stream_response": {} + }, + "input": "\n\nHuman: \n\nHuman: \" Here is how you can print 'Done successfully' in green color using ANSI escape codes in Python:\n\n```python\nprint(\"\\033[1;32mDone successfully\\033[0m\")\n```\n\nThe ANSI escape code `\\033[1;32m` sets the text color to green. \n\n`\\033[0m` resets the text formatting back to default.\n\nSo the full code is:\n\n`\\033[1;32m` - Set color to green \n\n`Done successfully` - Print text\n\n`\\033[0m` - Reset color back to default\n\nThis will print 'Done successfully' in green color without needing to import any module.\n\nThe ANSI escape codes allow changing text color, style (bold, underline etc) in the terminal. We just need to encapsulate the text we want to format between the ANSI codes.\"\n\nPlease write a short title summarizing the message quoted above. Use no more than 10 words:\n\nAssistant: ", + "api_key": "", + "additional_args": { + "complete_input_dict": "{\"prompt\": \"\\n\\nHuman: \\n\\nHuman: \\\" Here is how you can print 'Done successfully' in green color using ANSI escape codes in Python:\\n\\n```python\\nprint(\\\"\\\\033[1;32mDone successfully\\\\033[0m\\\")\\n```\\n\\nThe ANSI escape code `\\\\033[1;32m` sets the text color to green. \\n\\n`\\\\033[0m` resets the text formatting back to default.\\n\\nSo the full code is:\\n\\n`\\\\033[1;32m` - Set color to green \\n\\n`Done successfully` - Print text\\n\\n`\\\\033[0m` - Reset color back to default\\n\\nThis will print 'Done successfully' in green color without needing to import any module.\\n\\nThe ANSI escape codes allow changing text color, style (bold, underline etc) in the terminal. We just need to encapsulate the text we want to format between the ANSI codes.\\\"\\n\\nPlease write a short title summarizing the message quoted above. Use no more than 10 words:\\n\\nAssistant: \", \"max_tokens_to_sample\": 20, \"temperature\": 0.5}" + }, + "log_event_type": "post_api_call", + "original_response": { + "completion": " Green text in Python with ANSI escape codes", + "stop_reason": "stop_sequence" + } + } } } \ No newline at end of file diff --git a/litellm/proxy/proxy_cli.py b/litellm/proxy/proxy_cli.py index f1bb7abee..b1af8649e 100644 --- a/litellm/proxy/proxy_cli.py +++ b/litellm/proxy/proxy_cli.py @@ -38,6 +38,7 @@ def open_config(file_path=None): with open(user_config_path) as f: print(f"Dest file: {user_config_path}") print(f.read()) + print("\033[1;32mDone successfully\033[0m") except Exception as e: print(f"Failed to copy {file_path}: {e}") else: @@ -54,6 +55,7 @@ def open_config(file_path=None): print(f"To create a config (save keys, modify model prompt), copy the template located here: https://docs.litellm.ai/docs/proxy_server") print(f"LiteLLM: config location - {user_config_path}") + def clone_subfolder(repo_url, subfolder, destination): # Clone the full repo repo_name = repo_url.split('/')[-1] @@ -144,6 +146,7 @@ def run_server(host, port, api_base, model, deploy, debug, temperature, max_toke recent_logs = {k.strftime("%Y%m%d%H%M%S%f"): v for k, v in sorted_times[:logs]} print(json.dumps(recent_logs, indent=4)) + return if deploy == True: print(f"\033[32mLiteLLM: Deploying your proxy to api.litellm.ai\033[0m\n") print(f"\033[32mLiteLLM: Deploying proxy for model: {model}\033[0m\n") diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index d1152e370..10143839e 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -134,26 +134,26 @@ def load_config(): os.environ["AWS_SECRET_ACCESS_KEY"] = user_config["keys"][key] ## settings - litellm.add_function_to_prompt = user_config["general"].get("add_function_to_prompt", True) # by default add function to prompt if unsupported by provider - litellm.drop_params = user_config["general"].get("drop_params", True) # by default drop params if unsupported by provider - litellm.model_fallbacks = user_config["general"].get("fallbacks", None) # fallback models in case initial completion call fails - default_model = user_config["general"].get("default_model", None) # route all requests to this model. + if "general" in user_config: + litellm.add_function_to_prompt = user_config["general"].get("add_function_to_prompt", True) # by default add function to prompt if unsupported by provider + litellm.drop_params = user_config["general"].get("drop_params", True) # by default drop params if unsupported by provider + litellm.model_fallbacks = user_config["general"].get("fallbacks", None) # fallback models in case initial completion call fails + default_model = user_config["general"].get("default_model", None) # route all requests to this model. - if user_model is None: # `litellm --model `` > default_model. - user_model = default_model + if user_model is None: # `litellm --model `` > default_model. + user_model = default_model ## load model config - to set this run `litellm --config` model_config = None - if user_model in user_config["model"]: - model_config = user_config["model"][user_model] + if "model" in user_config: + if user_model in user_config["model"]: + model_config = user_config["model"][user_model] print_verbose(f"user_config: {user_config}") print_verbose(f"model_config: {model_config}") + print_verbose(f"user_model: {user_model}") if model_config is None: return - user_model = model_config["model_name"] # raise an error if this isn't set when user runs either `litellm --model local_model` or `litellm --model hosted_model` - print_verbose(f"user_model: {user_model}") - user_max_tokens = model_config.get("max_tokens", None) user_temperature = model_config.get("temperature", None) @@ -183,7 +183,7 @@ def load_config(): final_prompt_value=model_prompt_template.get("MODEL_POST_PROMPT", ""), ) except Exception as e: - traceback.print_exc() + pass def initialize(model, api_base, debug, temperature, max_tokens, max_budget, telemetry, drop_params, add_function_to_prompt): global user_model, user_api_base, user_debug, user_max_tokens, user_temperature, user_telemetry