diff --git a/docs/10-dynamic-routes-via-openai-function-calling.ipynb b/docs/10-dynamic-routes-via-openai-function-calling.ipynb
index 2bee09b2fbc0c114593b75fd63462e3cf42e1538..0eb3ae16e25c4d02ddf002d0cd0b781e94c87d93 100644
--- a/docs/10-dynamic-routes-via-openai-function-calling.ipynb
+++ b/docs/10-dynamic-routes-via-openai-function-calling.ipynb
@@ -15,7 +15,7 @@
         "id": "EduhQaNAur0u"
       },
       "source": [
-        "# Dynamic Routes"
+        "# Dynamic Routes via OpenAI Function Calling"
       ]
     },
     {
@@ -24,11 +24,9 @@
         "id": "_4JgNeX4ur0v"
       },
       "source": [
-        "In semantic-router there are two types of routes that can be chosen. Both routes belong to the `Route` object, the only difference between them is that _static_ routes return a `Route.name` when chosen, whereas _dynamic_ routes use an LLM call to produce parameter input values.\n",
+        "In this Notebook we showcase an alternative to dynamic routes where an `openai_function_schema` is specified or the Route, and in doing so, OpenAIs \"Function Calling\" API is utilized. \n",
         "\n",
-        "For example, a _static_ route will tell us if a query is talking about mathematics by returning the route name (which could be `\"math\"` for example). A _dynamic_ route can generate additional values, so it may decide a query is talking about maths, but it can also generate Python code that we can later execute to answer the user's query, this output may look like `\"math\", \"import math; output = math.sqrt(64)`.\n",
-        "\n",
-        "***⚠️ Note: We have a fully local version of dynamic routes available at [docs/05-local-execution.ipynb](https://github.com/aurelio-labs/semantic-router/blob/main/docs/05-local-execution.ipynb). The local 05 version tends to outperform the OpenAI version we demo in this notebook, so we'd recommend trying [05](https://github.com/aurelio-labs/semantic-router/blob/main/docs/05-local-execution.ipynb)!***"
+        "The usual Semantic Router procedure is used to determine which Route is most appropriate for the input utterance. Then, rather than using a regular LLM call with careful prompt engineering to allow the LLM to extract function arguments from the input, OpenAIs Function Calling is leveraged to try and obtain function arguments more reliably. \n"
       ]
     },
     {
@@ -409,7 +407,7 @@
     },
     {
       "cell_type": "code",
-      "execution_count": 11,
+      "execution_count": 19,
       "metadata": {
         "colab": {
           "base_uri": "https://localhost:8080/",
@@ -419,13 +417,6 @@
         "outputId": "79923883-2a4d-4744-f8ce-e818cb5f14c3"
       },
       "outputs": [
-        {
-          "name": "stderr",
-          "output_type": "stream",
-          "text": [
-            "\u001b[33m2024-04-27 02:23:31 WARNING semantic_router.utils.logger No LLM provided for dynamic route, will use OpenAI LLM default. Ensure API key is set in OPENAI_API_KEY environment variable.\u001b[0m\n"
-          ]
-        },
         {
           "name": "stdout",
           "output_type": "stream",
@@ -436,11 +427,11 @@
             "##################################################\n",
             "##################################################\n",
             "completion.choices[0].message.tool_calls\n",
-            "[ChatCompletionMessageToolCall(id='call_1nkq7oE7uqElxy9uBbPwVZcQ', function=Function(arguments='{\"timezone\":\"America/New_York\"}', name='get_time'), type='function')]\n",
+            "[ChatCompletionMessageToolCall(id='call_MS5F6OgeHtULS2OYN1dGSd7C', function=Function(arguments='{\"timezone\":\"America/New_York\"}', name='get_time'), type='function')]\n",
             "##################################################\n",
             "##################################################\n",
             "output\n",
-            "[ChatCompletionMessageToolCall(id='call_1nkq7oE7uqElxy9uBbPwVZcQ', function=Function(arguments='{\"timezone\":\"America/New_York\"}', name='get_time'), type='function')]\n",
+            "[ChatCompletionMessageToolCall(id='call_MS5F6OgeHtULS2OYN1dGSd7C', function=Function(arguments='{\"timezone\":\"America/New_York\"}', name='get_time'), type='function')]\n",
             "##################################################\n",
             "##################################################\n",
             "function_inputs\n",
@@ -454,27 +445,28 @@
               "RouteChoice(name='get_time', function_call={'timezone': 'America/New_York'}, similarity_score=None)"
             ]
           },
-          "execution_count": 11,
+          "execution_count": 19,
           "metadata": {},
           "output_type": "execute_result"
         }
       ],
       "source": [
-        "out = rl(\"what is the time in new york city?\")"
+        "out = rl(\"what is the time in new york city?\")\n",
+        "out"
       ]
     },
     {
       "cell_type": "code",
-      "execution_count": 13,
+      "execution_count": 20,
       "metadata": {},
       "outputs": [
         {
           "data": {
             "text/plain": [
-              "'18:23'"
+              "'14:07'"
             ]
           },
-          "execution_count": 13,
+          "execution_count": 20,
           "metadata": {},
           "output_type": "execute_result"
         }
@@ -492,6 +484,62 @@
         "Our dynamic route provides both the route itself _and_ the input parameters required to use the route."
       ]
     },
+    {
+      "cell_type": "markdown",
+      "metadata": {},
+      "source": [
+        "Now let's just verify that the other route selection still work correctly, starting with chitchat."
+      ]
+    },
+    {
+      "cell_type": "code",
+      "execution_count": 16,
+      "metadata": {},
+      "outputs": [
+        {
+          "data": {
+            "text/plain": [
+              "RouteChoice(name='chitchat', function_call=None, similarity_score=None)"
+            ]
+          },
+          "execution_count": 16,
+          "metadata": {},
+          "output_type": "execute_result"
+        }
+      ],
+      "source": [
+        "out = rl(\"What's the weather like?\")\n",
+        "out"
+      ]
+    },
+    {
+      "cell_type": "markdown",
+      "metadata": {},
+      "source": [
+        "Now, an utterance that shouldn't fall into any of the routes defined above."
+      ]
+    },
+    {
+      "cell_type": "code",
+      "execution_count": 21,
+      "metadata": {},
+      "outputs": [
+        {
+          "data": {
+            "text/plain": [
+              "RouteChoice(name=None, function_call=None, similarity_score=None)"
+            ]
+          },
+          "execution_count": 21,
+          "metadata": {},
+          "output_type": "execute_result"
+        }
+      ],
+      "source": [
+        "out = rl(\"Tell me how to bake cake?\")\n",
+        "out"
+      ]
+    },
     {
       "cell_type": "markdown",
       "metadata": {