From d1b1eb0c37a39953740f70ae17105d0a702c110c Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Sat, 18 Nov 2023 14:36:56 -0800 Subject: [PATCH] (docs) parallel function calling with Azure OpenAI --- cookbook/Parallel_function_calling.ipynb | 221 ++++++++++++++++++++++- 1 file changed, 219 insertions(+), 2 deletions(-) diff --git a/cookbook/Parallel_function_calling.ipynb b/cookbook/Parallel_function_calling.ipynb index cef31c973..cb7fbafac 100644 --- a/cookbook/Parallel_function_calling.ipynb +++ b/cookbook/Parallel_function_calling.ipynb @@ -34,6 +34,17 @@ "!pip install litellm" ] }, + { + "cell_type": "markdown", + "source": [ + "This tutorial walks through the steps doing parallel function calling using\n", + " - OpenAI\n", + " - Azure OpenAI" + ], + "metadata": { + "id": "sG5ANaazjU0g" + } + }, { "cell_type": "code", "source": [ @@ -50,6 +61,8 @@ { "cell_type": "markdown", "source": [ + "\n", + "# OpenAI gpt-3.5-turbo-1106\n", "## Step 1: send the conversation and available functions to the model" ], "metadata": { @@ -248,14 +261,218 @@ } ] }, + { + "cell_type": "markdown", + "source": [ + "## Using Azure OpenAI" + ], + "metadata": { + "id": "1cIIFEvXjofp" + } + }, { "cell_type": "code", - "source": [], + "source": [ + "# set Azure env variables\n", + "import os\n", + "os.environ['AZURE_API_KEY'] = \"\" # litellm reads AZURE_API_KEY from .env and sends the request\n", + "os.environ['AZURE_API_BASE'] = \"https://openai-gpt-4-test-v-1.openai.azure.com/\"\n", + "os.environ['AZURE_API_VERSION'] = \"2023-07-01-preview\"" + ], "metadata": { "id": "lG9mUnModeeE" }, - "execution_count": null, + "execution_count": 32, "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "## Step 1" + ], + "metadata": { + "id": "17S-Ysksj-E_" + } + }, + { + "cell_type": "code", + "source": [ + "import litellm\n", + "import json\n", + "# Example dummy function hard coded to return the same weather\n", + "# In production, this could be your backend API or an external API\n", + "def get_current_weather(location, unit=\"fahrenheit\"):\n", + " \"\"\"Get the current weather in a given location\"\"\"\n", + " if \"tokyo\" in location.lower():\n", + " return json.dumps({\"location\": \"Tokyo\", \"temperature\": \"10\", \"unit\": \"celsius\"})\n", + " elif \"san francisco\" in location.lower():\n", + " return json.dumps({\"location\": \"San Francisco\", \"temperature\": \"72\", \"unit\": \"fahrenheit\"})\n", + " elif \"paris\" in location.lower():\n", + " return json.dumps({\"location\": \"Paris\", \"temperature\": \"22\", \"unit\": \"celsius\"})\n", + " else:\n", + " return json.dumps({\"location\": location, \"temperature\": \"unknown\"})\n", + "\n", + "messages = [{\"role\": \"user\", \"content\": \"What's the weather like in San Francisco, Tokyo, and Paris?\"}]\n", + "tools = [\n", + " {\n", + " \"type\": \"function\",\n", + " \"function\": {\n", + " \"name\": \"get_current_weather\",\n", + " \"description\": \"Get the current weather in a given location\",\n", + " \"parameters\": {\n", + " \"type\": \"object\",\n", + " \"properties\": {\n", + " \"location\": {\n", + " \"type\": \"string\",\n", + " \"description\": \"The city and state, e.g. San Francisco, CA\",\n", + " },\n", + " \"unit\": {\"type\": \"string\", \"enum\": [\"celsius\", \"fahrenheit\"]},\n", + " },\n", + " \"required\": [\"location\"],\n", + " },\n", + " },\n", + " }\n", + "]\n", + "\n", + "response = litellm.completion(\n", + " model=\"azure/chatgpt-functioncalling\", # model = azure/\n", + " messages=messages,\n", + " tools=tools,\n", + " tool_choice=\"auto\", # auto is default, but we'll be explicit\n", + ")\n", + "print(\"\\nLLM Response1:\\n\", response)\n", + "response_message = response.choices[0].message\n", + "tool_calls = response.choices[0].message.tool_calls\n", + "print(\"\\nTool Choice:\\n\", tool_calls)\n" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "boAIHLEXj80m", + "outputId": "00afcf09-5b6b-4805-c374-ba089cc6eb43" + }, + "execution_count": 33, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\n", + "LLM Response1:\n", + " ModelResponse(id='chatcmpl-8MOBPvEnqG7qitkmVqZmCrzSGEmDj', choices=[Choices(finish_reason='tool_calls', index=0, message=Message(content=None, role='assistant', tool_calls=[ChatCompletionMessageToolCall(id='call_7gZ0PkmmmgzTOxfF01ATp0U5', function=Function(arguments='{\\n \"location\": \"San Francisco, CA\"\\n}', name='get_current_weather'), type='function')]))], created=1700346867, model='gpt-35-turbo', object='chat.completion', system_fingerprint=None, usage={'completion_tokens': 19, 'prompt_tokens': 88, 'total_tokens': 107}, _response_ms=833.4319999999999)\n", + "\n", + "Tool Choice:\n", + " [ChatCompletionMessageToolCall(id='call_7gZ0PkmmmgzTOxfF01ATp0U5', function=Function(arguments='{\\n \"location\": \"San Francisco, CA\"\\n}', name='get_current_weather'), type='function')]\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Step 2" + ], + "metadata": { + "id": "hqh1y1IMkmGO" + } + }, + { + "cell_type": "code", + "source": [ + "# Check if the model wants to call a function\n", + "if tool_calls:\n", + " # Execute the functions and prepare responses\n", + " available_functions = {\n", + " \"get_current_weather\": get_current_weather,\n", + " }\n", + "\n", + " messages.append(response_message) # Extend conversation with assistant's reply\n", + "\n", + " for tool_call in tool_calls:\n", + " print(f\"\\nExecuting tool call\\n{tool_call}\")\n", + " function_name = tool_call.function.name\n", + " function_to_call = available_functions[function_name]\n", + " function_args = json.loads(tool_call.function.arguments)\n", + " # calling the get_current_weather() function\n", + " function_response = function_to_call(\n", + " location=function_args.get(\"location\"),\n", + " unit=function_args.get(\"unit\"),\n", + " )\n", + " print(f\"Result from tool call\\n{function_response}\\n\")\n", + "\n", + " # Extend conversation with function response\n", + " messages.append(\n", + " {\n", + " \"tool_call_id\": tool_call.id,\n", + " \"role\": \"tool\",\n", + " \"name\": function_name,\n", + " \"content\": function_response,\n", + " }\n", + " )\n" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "FGu7DY7PkOiG", + "outputId": "96d39ae7-7fc8-4dd8-c82f-5ee9a486724c" + }, + "execution_count": 34, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\n", + "Executing tool call\n", + "ChatCompletionMessageToolCall(id='call_7gZ0PkmmmgzTOxfF01ATp0U5', function=Function(arguments='{\\n \"location\": \"San Francisco, CA\"\\n}', name='get_current_weather'), type='function')\n", + "Result from tool call\n", + "{\"location\": \"San Francisco\", \"temperature\": \"72\", \"unit\": \"fahrenheit\"}\n", + "\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Step 3" + ], + "metadata": { + "id": "4MjYyeajkpBl" + } + }, + { + "cell_type": "code", + "source": [ + "second_response = litellm.completion(\n", + " model=\"azure/chatgpt-functioncalling\",\n", + " messages=messages,\n", + ")\n", + "print(\"Second Response\\n\", second_response)\n", + "print(\"Second Response Message\\n\", second_response.choices[0].message.content)\n" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "qHgXyZq1kqGn", + "outputId": "61a30470-d7f5-484d-c42b-681c9b60b34a" + }, + "execution_count": 36, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Second Response\n", + " ModelResponse(id='chatcmpl-8MOC90vwZ2LHX0DE796XYtsOxdGcc', choices=[Choices(finish_reason='stop', index=0, message=Message(content='The current weather in San Francisco is 72°F.', role='assistant'))], created=1700346913, model='gpt-35-turbo', object='chat.completion', system_fingerprint=None, usage={'completion_tokens': 11, 'prompt_tokens': 69, 'total_tokens': 80}, _response_ms=824.882)\n", + "Second Response Message\n", + " The current weather in San Francisco is 72°F.\n" + ] + } + ] } ] } \ No newline at end of file