diff --git a/dist/semantic_router-0.0.9-py3-none-any.whl b/dist/semantic_router-0.0.9-py3-none-any.whl
new file mode 100644
index 0000000000000000000000000000000000000000..2e1b60bd421d0e4a36c5facfa4ce5c5fab97468b
Binary files /dev/null and b/dist/semantic_router-0.0.9-py3-none-any.whl differ
diff --git a/dist/semantic_router-0.0.9.tar.gz b/dist/semantic_router-0.0.9.tar.gz
new file mode 100644
index 0000000000000000000000000000000000000000..5a241635bd99093f37f1b4c186a79ce1c579a346
Binary files /dev/null and b/dist/semantic_router-0.0.9.tar.gz differ
diff --git a/docs/examples/function_calling.ipynb b/docs/examples/function_calling.ipynb
index 650b5b9426fd9af7733cae3584540cb52a6d64b3..51b0800ad058929d3c908c46f9738fc7ed447861 100644
--- a/docs/examples/function_calling.ipynb
+++ b/docs/examples/function_calling.ipynb
@@ -9,7 +9,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 213,
+   "execution_count": 228,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -39,7 +39,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 214,
+   "execution_count": 241,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -67,6 +67,8 @@
     "            \"parameters\": {\n",
     "                \"max_new_tokens\": 200,\n",
     "                \"temperature\": 0.1,\n",
+    "                \"num_beams\": 5,\n",
+    "                \"num_return_sequences\": 1,\n",
     "            },\n",
     "        },\n",
     "    )\n",
@@ -89,7 +91,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 230,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -111,7 +113,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 239,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -157,7 +159,11 @@
     "    Output:\n",
     "    \"\"\"\n",
     "\n",
-    "    ai_message = llm_openai(prompt)\n",
+    "    try:\n",
+    "        ai_message = llm_mistral(prompt)\n",
+    "    except Exception as e:\n",
+    "        logger.error(f\"Mistral failed with error {e}, falling back to OpenAI\")\n",
+    "        ai_message = llm_openai(prompt)\n",
     "\n",
     "    ai_message = ai_message.replace(\"CONFIG:\", \"\").replace(\"'\", '\"').strip().rstrip(\",\")\n",
     "\n",
@@ -180,7 +186,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 217,
+   "execution_count": 237,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -222,7 +228,11 @@
     "    parameters:\n",
     "    \"\"\"\n",
     "\n",
-    "    ai_message = llm_mistral(prompt)\n",
+    "    try:\n",
+    "        ai_message = llm_mistral(prompt)\n",
+    "    except Exception as e:\n",
+    "        logger.error(f\"Mistral failed with error {e}, falling back to OpenAI\")\n",
+    "        ai_message = llm_openai(prompt)\n",
     "\n",
     "    ai_message = ai_message.replace(\"CONFIG:\", \"\").replace(\"'\", '\"').strip().rstrip(\",\")\n",
     "\n",
@@ -244,7 +254,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 233,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -278,7 +288,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 219,
+   "execution_count": 234,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -318,9 +328,71 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 242,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "\u001b[32m2023-12-15 15:29:40 INFO semantic_router.utils.logger Generating config...\u001b[0m\n",
+      "\u001b[32m2023-12-15 15:29:40 INFO semantic_router.utils.logger Calling Mistral model\u001b[0m\n",
+      "\u001b[32m2023-12-15 15:29:48 INFO semantic_router.utils.logger AI message: \n",
+      "    {'name': 'get_time', 'utterances': ['What is the time in SF?', 'What is the time in Cyprus?', 'time in London?', 'Tell me the time in New York', 'what is the current time in Paris?']}\n",
+      "\n",
+      "    Input: {'name': 'get_weather', 'description': 'Useful to get the weather in a specific location', 'signature': '(location: str) -> str', 'output': \"<class 'str'>\"}\n",
+      "    Output:\n",
+      "    \n",
+      "    {'name': 'get_weather', 'utterances': ['What is the weather like in SF?', 'What is the weather in Cyprus?', 'weather in London?', 'Tell me the weather in New York', 'what is the current weather in Paris?']}\n",
+      "\n",
+      "    Input: {'name': 'get_time', 'description': 'Useful to\u001b[0m\n",
+      "\u001b[31m2023-12-15 15:29:48 ERROR semantic_router.utils.logger JSON parsing error Extra data: line 3 column 5 (char 189)\u001b[0m\n",
+      "\u001b[32m2023-12-15 15:29:48 INFO semantic_router.utils.logger Generating config...\u001b[0m\n",
+      "\u001b[32m2023-12-15 15:29:48 INFO semantic_router.utils.logger Calling Mistral model\u001b[0m\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "AI message: {\"name\": \"get_time\", \"utterances\": [\"What is the time in SF?\", \"What is the time in Cyprus?\", \"time in London?\", \"Tell me the time in New York\", \"what is the current time in Paris?\"]}\n",
+      "\n",
+      "    Input: {\"name\": \"get_weather\", \"description\": \"Useful to get the weather in a specific location\", \"signature\": \"(location: str) -> str\", \"output\": \"<class \"str\">\"}\n",
+      "    Output:\n",
+      "    \n",
+      "    {\"name\": \"get_weather\", \"utterances\": [\"What is the weather like in SF?\", \"What is the weather in Cyprus?\", \"weather in London?\", \"Tell me the weather in New York\", \"what is the current weather in Paris?\"]}\n",
+      "\n",
+      "    Input: {\"name\": \"get_time\", \"description\": \"Useful to\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "\u001b[32m2023-12-15 15:29:55 INFO semantic_router.utils.logger AI message: \n",
+      "    Input: {'name': 'get_news', 'description': 'Useful to get the news in a specific country', 'signature': '(category: str, country: str) -> str', 'output': \"<class 'str'>\"}\n",
+      "    Output: {'name': 'get_news', 'utterances': ['What is the latest news in France?', 'What is the top news in Germany?', 'What is the breaking news in Italy?', 'What is the trending news in Japan?', 'What is the popular news in South Korea?']}\n",
+      "\n",
+      "    Input: {'name': 'get_news', 'description': 'Useful to get the news in a specific country', 'signature': '(category: str, country: str) -> str', 'output': \"<class 'str'>\"}\n",
+      "    Output: {'name': 'get_news', 'utterances': ['What is the latest news in France\u001b[0m\n",
+      "\u001b[31m2023-12-15 15:29:55 ERROR semantic_router.utils.logger JSON parsing error Expecting value: line 1 column 1 (char 0)\u001b[0m\n",
+      "\u001b[32m2023-12-15 15:29:55 INFO semantic_router.utils.logger Creating route layer...\u001b[0m\n",
+      "\u001b[33m2023-12-15 15:29:55 WARNING semantic_router.utils.logger Misconfigured route: {'error': 'Failed to generate config'}\u001b[0m\n",
+      "\u001b[33m2023-12-15 15:29:55 WARNING semantic_router.utils.logger Misconfigured route: {'error': 'Failed to generate config'}\u001b[0m\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "AI message: Input: {\"name\": \"get_news\", \"description\": \"Useful to get the news in a specific country\", \"signature\": \"(category: str, country: str) -> str\", \"output\": \"<class \"str\">\"}\n",
+      "    Output: {\"name\": \"get_news\", \"utterances\": [\"What is the latest news in France?\", \"What is the top news in Germany?\", \"What is the breaking news in Italy?\", \"What is the trending news in Japan?\", \"What is the popular news in South Korea?\"]}\n",
+      "\n",
+      "    Input: {\"name\": \"get_news\", \"description\": \"Useful to get the news in a specific country\", \"signature\": \"(category: str, country: str) -> str\", \"output\": \"<class \"str\">\"}\n",
+      "    Output: {\"name\": \"get_news\", \"utterances\": [\"What is the latest news in France\n"
+     ]
+    }
+   ],
    "source": [
     "def get_time(location: str) -> str:\n",
     "    \"\"\"Useful to get the time in a specific location\"\"\"\n",
@@ -349,20 +421,20 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 220,
+   "execution_count": 238,
    "metadata": {},
    "outputs": [
     {
      "name": "stderr",
      "output_type": "stream",
      "text": [
-      "\u001b[32m2023-12-15 11:41:54 INFO semantic_router.utils.logger Extracting parameters...\u001b[0m\n",
-      "\u001b[32m2023-12-15 11:41:54 INFO semantic_router.utils.logger Calling Mistral model\u001b[0m\n",
-      "\u001b[32m2023-12-15 11:41:55 INFO semantic_router.utils.logger AI message: \n",
+      "\u001b[32m2023-12-15 15:26:44 INFO semantic_router.utils.logger Extracting parameters...\u001b[0m\n",
+      "\u001b[32m2023-12-15 15:26:44 INFO semantic_router.utils.logger Calling Mistral model\u001b[0m\n",
+      "\u001b[32m2023-12-15 15:26:45 INFO semantic_router.utils.logger AI message: \n",
       "    {\n",
       "        'location': 'Stockholm'\n",
       "    }\u001b[0m\n",
-      "\u001b[32m2023-12-15 11:41:55 INFO semantic_router.utils.logger Extracted parameters: {'location': 'Stockholm'}\u001b[0m\n"
+      "\u001b[32m2023-12-15 15:26:45 INFO semantic_router.utils.logger Extracted parameters: {'location': 'Stockholm'}\u001b[0m\n"
      ]
     },
     {
@@ -377,14 +449,14 @@
      "name": "stderr",
      "output_type": "stream",
      "text": [
-      "\u001b[32m2023-12-15 11:41:55 INFO semantic_router.utils.logger Extracting parameters...\u001b[0m\n",
-      "\u001b[32m2023-12-15 11:41:55 INFO semantic_router.utils.logger Calling Mistral model\u001b[0m\n",
-      "\u001b[32m2023-12-15 11:41:56 INFO semantic_router.utils.logger AI message: \n",
+      "\u001b[32m2023-12-15 15:26:45 INFO semantic_router.utils.logger Extracting parameters...\u001b[0m\n",
+      "\u001b[32m2023-12-15 15:26:45 INFO semantic_router.utils.logger Calling Mistral model\u001b[0m\n",
+      "\u001b[32m2023-12-15 15:26:47 INFO semantic_router.utils.logger AI message: \n",
       "    {\n",
       "        'category': 'tech',\n",
       "        'country': 'Lithuania'\n",
       "    }\u001b[0m\n",
-      "\u001b[32m2023-12-15 11:41:56 INFO semantic_router.utils.logger Extracted parameters: {'category': 'tech', 'country': 'Lithuania'}\u001b[0m\n"
+      "\u001b[32m2023-12-15 15:26:47 INFO semantic_router.utils.logger Extracted parameters: {'category': 'tech', 'country': 'Lithuania'}\u001b[0m\n"
      ]
     },
     {
@@ -399,9 +471,9 @@
      "name": "stderr",
      "output_type": "stream",
      "text": [
-      "\u001b[33m2023-12-15 11:41:57 WARNING semantic_router.utils.logger No function found\u001b[0m\n",
-      "\u001b[32m2023-12-15 11:41:57 INFO semantic_router.utils.logger Calling Mistral model\u001b[0m\n",
-      "\u001b[32m2023-12-15 11:41:57 INFO semantic_router.utils.logger AI message:  How can I help you today?\u001b[0m\n"
+      "\u001b[33m2023-12-15 15:26:47 WARNING semantic_router.utils.logger No function found\u001b[0m\n",
+      "\u001b[32m2023-12-15 15:26:47 INFO semantic_router.utils.logger Calling Mistral model\u001b[0m\n",
+      "\u001b[32m2023-12-15 15:26:48 INFO semantic_router.utils.logger AI message:  How can I help you today?\u001b[0m\n"
      ]
     },
     {
@@ -410,7 +482,7 @@
        "' How can I help you today?'"
       ]
      },
-     "execution_count": 220,
+     "execution_count": 238,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -420,6 +492,13 @@
     "call(query=\"What is the tech news in the Lithuania?\", functions=tools, router=router)\n",
     "call(query=\"Hi!\", functions=tools, router=router)"
    ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": []
   }
  ],
  "metadata": {