From 5242a826ca0d852f5ca06d6f7e159ec4286f4802 Mon Sep 17 00:00:00 2001 From: Jeff Hoekman Date: Wed, 11 Nov 2026 13:35:28 -0500 Subject: [PATCH 1/2] VAP15-97 docs: custom LLM URL must resolve to a public IP Co-Authored-By: Claude Opus 5.5 --- fern/calls/call-ended-reason.mdx | 1 + fern/customization/custom-llm/using-your-server.mdx | 2 ++ 2 files changed, 3 insertions(+) diff --git a/fern/calls/call-ended-reason.mdx b/fern/calls/call-ended-reason.mdx index 6ac710991..863edc41b 100644 --- a/fern/calls/call-ended-reason.mdx +++ b/fern/calls/call-ended-reason.mdx @@ -127,6 +127,7 @@ Additional model errors: - `pipeline-no-available-llm-model` / `call.in-progress.error-pipeline-no-available-llm-model` — No suitable LLM model was available. Check your model configuration. - `call.in-progress.error-pipeline-ws-model-connection-failed` — Failed to connect to a custom LLM WebSocket endpoint. +- `pipeline-error-custom-llm-llm-failed` with the call log line "Custom LLM URL blocked: it does not resolve to a public IP address" — The Custom LLM URL is not public. Use a public HTTPS host. ## Pipeline errors: voice (TTS) diff --git a/fern/customization/custom-llm/using-your-server.mdx b/fern/customization/custom-llm/using-your-server.mdx index 042921548..5ff6172e6 100644 --- a/fern/customization/custom-llm/using-your-server.mdx +++ b/fern/customization/custom-llm/using-your-server.mdx @@ -62,6 +62,8 @@ On the **Assistant** tab, select **MODEL**. In **Model Settings**, open **Model* Enter `gpt-4.1-mini` in the second **Model** field. Paste the public base URL for your OpenAI-compatible endpoint into **Custom LLM URL** (for example, the URL generated by Ngrok for your server). The server handles requests at `/chat/completions`. +The Custom LLM URL must use HTTPS and resolve to a public IP address, including every redirect. Requests to localhost, private networks or link-local addresses are refused. For local development, expose your server through a tunnel such as ngrok. + Set the custom LLM URL on a stored assistant, as in this step. A web call or chat authenticated with a public API key or a public JWT that supplies `model.url` is rejected with a `403` response. For more information, including how to set the URL per request from your server, see [Model URLs on public-key requests](/assistants/concepts/transient-vs-permanent-configurations#model-urls-on-public-key-requests). From 321b2012363bb11de8cbd114d7a1f65ddfaba757 Mon Sep 17 00:00:00 2001 From: Jeff Hoekman Date: Wed, 11 Nov 2026 13:53:07 -0500 Subject: [PATCH 2/2] VAP15-97 docs: move URL rules into the step and match every blocked log entry Co-Authored-By: Claude Opus 5.5 --- fern/calls/call-ended-reason.mdx | 2 +- fern/customization/custom-llm/using-your-server.mdx | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/fern/calls/call-ended-reason.mdx b/fern/calls/call-ended-reason.mdx index 863edc41b..d49555414 100644 --- a/fern/calls/call-ended-reason.mdx +++ b/fern/calls/call-ended-reason.mdx @@ -127,7 +127,7 @@ Additional model errors: - `pipeline-no-available-llm-model` / `call.in-progress.error-pipeline-no-available-llm-model` — No suitable LLM model was available. Check your model configuration. - `call.in-progress.error-pipeline-ws-model-connection-failed` — Failed to connect to a custom LLM WebSocket endpoint. -- `pipeline-error-custom-llm-llm-failed` with the call log line "Custom LLM URL blocked: it does not resolve to a public IP address" — The Custom LLM URL is not public. Use a public HTTPS host. +- `pipeline-error-custom-llm-llm-failed` with a call log entry that starts with `Custom LLM URL blocked:` — The Custom LLM URL was refused before the request was sent, and the rest of the entry names the reason. For the URL requirements, see [Bring your own server](/customization/custom-llm/using-your-server). A configured fallback model is tried first. ## Pipeline errors: voice (TTS) diff --git a/fern/customization/custom-llm/using-your-server.mdx b/fern/customization/custom-llm/using-your-server.mdx index 5ff6172e6..709dc258d 100644 --- a/fern/customization/custom-llm/using-your-server.mdx +++ b/fern/customization/custom-llm/using-your-server.mdx @@ -61,9 +61,9 @@ On the **Assistant** tab, select **MODEL**. In **Model Settings**, open **Model* **3. Enter Ngrok URL:** Enter `gpt-4.1-mini` in the second **Model** field. Paste the public base URL for your OpenAI-compatible endpoint into **Custom LLM URL** (for example, the URL generated by Ngrok for your server). The server handles requests at `/chat/completions`. - -The Custom LLM URL must use HTTPS and resolve to a public IP address, including every redirect. Requests to localhost, private networks or link-local addresses are refused. For local development, expose your server through a tunnel such as ngrok. +The URL must use `https://` and resolve to a public IP address, and so must every URL it redirects to. Localhost, private network, and link-local addresses are refused, as is a URL that includes credentials, a query string, or a fragment. + Set the custom LLM URL on a stored assistant, as in this step. A web call or chat authenticated with a public API key or a public JWT that supplies `model.url` is rejected with a `403` response. For more information, including how to set the URL per request from your server, see [Model URLs on public-key requests](/assistants/concepts/transient-vs-permanent-configurations#model-urls-on-public-key-requests).