I have searched for any existing and/or related issues.
I have searched for any existing and/or related discussions.
I am using the latest version of Open WebUI.
Installation Method
Docker
Open WebUI Version
v0.6.32
Ollama Version (if applicable)
No response
Operating System
RHEL 9
Browser (if applicable)
No response
Confirmation
I have read and followed all instructions in README.md.
I am using the latest version of both Open WebUI and Ollama.
I have included the browser console logs.
I have included the Docker container logs.
I have provided every relevant configuration, setting, and environment variable used in my setup.
I have clearly listed every relevant configuration, custom setting, environment variable, and command-line option that influences my setup (such as Docker Compose overrides, .env values, browser settings, authentication configurations, etc).
I have documented step-by-step reproduction instructions that are precise, sequential, and leave nothing to interpretation. My steps:
Start with the initial platform/version/OS and dependencies used,
Specify exact install/launch/configure commands,
List URLs visited, user input (incl. example values/emails/passwords if needed),
Describe all options and toggles enabled or changed,
Include any files or environmental changes,
Identify the expected and actual result at each stage,
Ensure any reasonably skilled user can follow and hit the same issue.
Expected Behavior
When a model is instructed to call a tool, it calls the tool, whether streaming replies is turned on or off.
Actual Behavior
With streaming on (the default setting) native tool calling works fine, with streaming off the model attempts to call the tool and returns the tool call message - however, OpenWebUI does NOT execute the tool and instead returns to the chat.
Steps to Reproduce
Start with OWUI 0.6.32 ; I use a container install on RHEL with Podman and Quadlet
Use a tried-and-tested model, in my case GLM-4.6 via OpenRouter. Provide a tool that is trivial to call,
Ensure native tool calling is on.
Instruct the model to call the tool; observe success.
Start a new chat with the same model and now ensure that native tool calling is still on, but streaming replies is off.
Instruct the model to call the tool; observe failure as instead of the tool call you are left back in chat.
Logs & Screenshots
Here's the response from the model on which I was returned to chat.
{
"id": "gen-1759860710-3bv2rlkEWdSMZAb6jfvv",
"model": "z-ai/glm-4.6",
"usage": {
"total_tokens": 433,
"prompt_tokens": 302,
"completion_tokens": 131,
"prompt_tokens_details": null,
"completion_tokens_details": null
},
"object": "chat.completion",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "\n\nI'll perform the sequential tool calling exactly as requested. Let me start by calling the ping tool first.\n",
"tool_calls": [
{
"id": "call_49a212c3b89543699c10a496",
"type": "function",
"index": 0,
"function": {
"name": "ping",
"arguments": "{\"query\": \"test\"}"
}
}
],
"function_call": null,
"reasoning_content": "The user wants me to test sequential tool calling with a specific sequence:\n1. Call the ping tool\n2. Display the result of the ping call\n3. Only after that, call the pong tool\n4. Display the result of the pong call\n\nI need to make sure I follow this exact sequence. Let me start by calling the ping tool. I need to provide a query parameter for the ping tool - I'll use something simple like \"test\"."
},
"finish_reason": "tool_calls",
"provider_specific_fields": {
"native_finish_reason": "tool_calls"
}
}
],
"created": 1759860710,
"provider": "Chutes",
"system_fingerprint": null
}
### Additional Information
_No response_
Originally created by @mramendi on GitHub (Oct 7, 2025).
Original GitHub issue: https://github.com/open-webui/open-webui/issues/18121
### Check Existing Issues
- [x] I have searched for any existing and/or related issues.
- [x] I have searched for any existing and/or related discussions.
- [x] I am using the latest version of Open WebUI.
### Installation Method
Docker
### Open WebUI Version
v0.6.32
### Ollama Version (if applicable)
_No response_
### Operating System
RHEL 9
### Browser (if applicable)
_No response_
### Confirmation
- [x] I have read and followed all instructions in `README.md`.
- [x] I am using the latest version of **both** Open WebUI and Ollama.
- [x] I have included the browser console logs.
- [x] I have included the Docker container logs.
- [x] I have **provided every relevant configuration, setting, and environment variable used in my setup.**
- [x] I have clearly **listed every relevant configuration, custom setting, environment variable, and command-line option that influences my setup** (such as Docker Compose overrides, .env values, browser settings, authentication configurations, etc).
- [x] I have documented **step-by-step reproduction instructions that are precise, sequential, and leave nothing to interpretation**. My steps:
- Start with the initial platform/version/OS and dependencies used,
- Specify exact install/launch/configure commands,
- List URLs visited, user input (incl. example values/emails/passwords if needed),
- Describe all options and toggles enabled or changed,
- Include any files or environmental changes,
- Identify the expected and actual result at each stage,
- Ensure any reasonably skilled user can follow and hit the same issue.
### Expected Behavior
When a model is instructed to call a tool, it calls the tool, whether streaming replies is turned on or off.
### Actual Behavior
With streaming on (the default setting) native tool calling works fine, with streaming off the model attempts to call the tool and returns the tool call message - however, OpenWebUI does NOT execute the tool and instead returns to the chat.
### Steps to Reproduce
1. Start with OWUI 0.6.32 ; I use a container install on RHEL with Podman and Quadlet
2. Use a tried-and-tested model, in my case GLM-4.6 via OpenRouter. Provide a tool that is trivial to call,
3. Ensure native tool calling is on.
4. Instruct the model to call the tool; observe success.
5. Start a new chat with the same model and now ensure that native tool calling is still on, but streaming replies is off.
6. 4. Instruct the model to call the tool; observe failure as instead of the tool call you are left back in chat.
### Logs & Screenshots
Here's the response from the model on which I was returned to chat.
```
{
"id": "gen-1759860710-3bv2rlkEWdSMZAb6jfvv",
"model": "z-ai/glm-4.6",
"usage": {
"total_tokens": 433,
"prompt_tokens": 302,
"completion_tokens": 131,
"prompt_tokens_details": null,
"completion_tokens_details": null
},
"object": "chat.completion",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "\n\nI'll perform the sequential tool calling exactly as requested. Let me start by calling the ping tool first.\n",
"tool_calls": [
{
"id": "call_49a212c3b89543699c10a496",
"type": "function",
"index": 0,
"function": {
"name": "ping",
"arguments": "{\"query\": \"test\"}"
}
}
],
"function_call": null,
"reasoning_content": "The user wants me to test sequential tool calling with a specific sequence:\n1. Call the ping tool\n2. Display the result of the ping call\n3. Only after that, call the pong tool\n4. Display the result of the pong call\n\nI need to make sure I follow this exact sequence. Let me start by calling the ping tool. I need to provide a query parameter for the ping tool - I'll use something simple like \"test\"."
},
"finish_reason": "tool_calls",
"provider_specific_fields": {
"native_finish_reason": "tool_calls"
}
}
],
"created": 1759860710,
"provider": "Chutes",
"system_fingerprint": null
}
### Additional Information
_No response_
GiteaMirror
added the bug label 2026-05-18 03:30:32 -05:00
Please research first - this is not an Open WebUI issue!
Native function (tool) calling in LLMs like GPT and Gemini is designed to work with streaming enabled. The function calling process is integrated into the streaming output so that the model can incrementally emit tokens representing the tool call intent, its arguments, and then receive and incorporate tool results in real time.
Without streaming, the model would need to complete the entire processing including tool calls before sending any output, which is inefficient and leads to slower response times.
The APIs simply do not allow it - for a good reason.
Additionally, since tool calls are integrated within the token generation stream as special message parts, streaming is necessary to handle this structured interaction, including managing tool call start, arguments passing, tool call completion, and final output tokens to the user.
Finally: This is a duplicate issue, the exact same question was raised multiple times before in issues and discussions.
PS: When turning OFF streaming, use the default function calling system provided by Open WebUI (non-native) then it can still work with streaming OFF.
<!-- gh-comment-id:3378210942 -->
@Classic298 commented on GitHub (Oct 7, 2025):
NOT an Open WebUI issue.
Please research first - this is not an Open WebUI issue!
Native function (tool) calling in LLMs like GPT and Gemini is designed to work with streaming enabled. The function calling process is integrated into the streaming output so that the model can incrementally emit tokens representing the tool call intent, its arguments, and then receive and incorporate tool results in real time.
Without streaming, the model would need to complete the entire processing including tool calls before sending any output, which is inefficient and leads to slower response times.
The APIs simply do not allow it - for a good reason.
Additionally, since tool calls are integrated within the token generation stream as special message parts, streaming is necessary to handle this structured interaction, including managing tool call start, arguments passing, tool call completion, and final output tokens to the user.
Finally: This is a duplicate issue, the exact same question was raised multiple times before in issues and discussions.
PS: When turning OFF streaming, use the default function calling system provided by Open WebUI (non-native) then it can still work with streaming OFF.
<!-- gh-comment-id:3378552052 -->
@mramendi commented on GitHub (Oct 7, 2025):
Your explanation does not reflect the official OpenAI API reference. In fact, the first example in this reference (the one with `get_horoscope`) does not use streaming. https://platform.openai.com/docs/guides/function-calling
It is simply not true that function calling in ChatCompletions is only for streaming.
<!-- gh-comment-id:3383773306 -->
@mramendi commented on GitHub (Oct 9, 2025):
@Classic298 sure, here's ChatCompletions: https://cookbook.openai.com/examples/how_to_call_functions_with_chat_models . Streaming is not even mentioned.
Loads of examples around such as https://github.com/john-carroll-sw/chat-completions-function-calling-examples/blob/master/func_get_weather.py .
It is simply not true that function calling in ChatCompletions is only for streaming.
I researched again and it is my fault, indeed you are right. I have found a few articles that mentioned major issues if you disabled streaming in connection with native function calls, but these were obviously wrong. Reopening.
<!-- gh-comment-id:3384238354 -->
@Classic298 commented on GitHub (Oct 9, 2025):
I researched again and it is my fault, indeed you are right. I have found a few articles that mentioned major issues if you disabled streaming in connection with native function calls, but these were obviously wrong. Reopening.
Intended. With streaming off it'll follow the existing API behaviour. Our docs should be updated for this instead to clearly mention this.
<!-- gh-comment-id:3387507317 -->
@tjbck commented on GitHub (Oct 9, 2025):
Intended. With streaming off it'll follow the existing API behaviour. Our docs should be updated for this instead to clearly mention this.
<!-- gh-comment-id:3387720124 -->
@mramendi commented on GitHub (Oct 9, 2025):
@tjbck no it does not, please refer to the openai cookbook link I already published: https://cookbook.openai.com/examples/how_to_call_functions_with_chat_models
@tjbck
Tim, but the chat stuck in this circunstance, as I tested & posted.
The tool is executed fine, without streaming, but the response is never displayed and the chat stuck with any error or notification.
<!-- gh-comment-id:3387805640 -->
@rgaricano commented on GitHub (Oct 9, 2025):
@tjbck
Tim, but the chat stuck in this circunstance, as I tested & posted.
The tool is executed fine, without streaming, but the response is never displayed and the chat stuck with any error or notification.
@mramendi the tools are called from Open WebUI, it's literally how their chat completion API behaves. I'd appreciate if you could actually try using the chat completion endpoint and see the behaviour for yourself instead of referencing a post that has nothing to with this.
<!-- gh-comment-id:3387808125 -->
@tjbck commented on GitHub (Oct 9, 2025):
@mramendi the tools are called from Open WebUI, it's literally how their chat completion API behaves. I'd appreciate if you could actually try using the chat completion endpoint and see the behaviour for yourself instead of referencing a post that has nothing to with this.
@rgaricano it's because if you turn off the stream it returns a tool call response. As per my message above, we do not "execute" the tool from our end to follow the existing API behaviour when the streaming if set to False. This IS an intended behaviour and will NOT be supported.
<!-- gh-comment-id:3387809287 -->
@tjbck commented on GitHub (Oct 9, 2025):
@rgaricano it's because if you turn off the stream it returns a tool call response. As per my message above, we do not "execute" the tool from our end to follow the existing API behaviour when the streaming if set to False. This **IS** an intended behaviour and will **NOT** be supported.
@Classic298 was half correct here. This is not an "issue" and is a matter of how stream off should be "interpreted".
<!-- gh-comment-id:3387816973 -->
@tjbck commented on GitHub (Oct 9, 2025):
@Classic298 was half correct here. This is not an "issue" and is a matter of how stream off should be "interpreted".
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Originally created by @mramendi on GitHub (Oct 7, 2025).
Original GitHub issue: https://github.com/open-webui/open-webui/issues/18121
Check Existing Issues
Installation Method
Docker
Open WebUI Version
v0.6.32
Ollama Version (if applicable)
No response
Operating System
RHEL 9
Browser (if applicable)
No response
Confirmation
README.md.Expected Behavior
When a model is instructed to call a tool, it calls the tool, whether streaming replies is turned on or off.
Actual Behavior
With streaming on (the default setting) native tool calling works fine, with streaming off the model attempts to call the tool and returns the tool call message - however, OpenWebUI does NOT execute the tool and instead returns to the chat.
Steps to Reproduce
Logs & Screenshots
Here's the response from the model on which I was returned to chat.
@Classic298 commented on GitHub (Oct 7, 2025):
NOT an Open WebUI issue.
Please research first - this is not an Open WebUI issue!
Native function (tool) calling in LLMs like GPT and Gemini is designed to work with streaming enabled. The function calling process is integrated into the streaming output so that the model can incrementally emit tokens representing the tool call intent, its arguments, and then receive and incorporate tool results in real time.
Without streaming, the model would need to complete the entire processing including tool calls before sending any output, which is inefficient and leads to slower response times.
The APIs simply do not allow it - for a good reason.
Additionally, since tool calls are integrated within the token generation stream as special message parts, streaming is necessary to handle this structured interaction, including managing tool call start, arguments passing, tool call completion, and final output tokens to the user.
Finally: This is a duplicate issue, the exact same question was raised multiple times before in issues and discussions.
PS: When turning OFF streaming, use the default function calling system provided by Open WebUI (non-native) then it can still work with streaming OFF.
@mramendi commented on GitHub (Oct 7, 2025):
Your explanation does not reflect the official OpenAI API reference. In fact, the first example in this reference (the one with
get_horoscope) does not use streaming. https://platform.openai.com/docs/guides/function-calling@rgaricano commented on GitHub (Oct 7, 2025):
Yes, there is an issue, the tool is called, the response is OK but isn't showed and chat is stucked
@Classic298 commented on GitHub (Oct 8, 2025):
@mramendi your examples are for the responses API
@mramendi commented on GitHub (Oct 9, 2025):
@Classic298 sure, here's ChatCompletions: https://cookbook.openai.com/examples/how_to_call_functions_with_chat_models . Streaming is not even mentioned.
Loads of examples around such as https://github.com/john-carroll-sw/chat-completions-function-calling-examples/blob/master/func_get_weather.py .
It is simply not true that function calling in ChatCompletions is only for streaming.
@Classic298 commented on GitHub (Oct 9, 2025):
I researched again and it is my fault, indeed you are right. I have found a few articles that mentioned major issues if you disabled streaming in connection with native function calls, but these were obviously wrong. Reopening.
@tjbck commented on GitHub (Oct 9, 2025):
Intended. With streaming off it'll follow the existing API behaviour. Our docs should be updated for this instead to clearly mention this.
@mramendi commented on GitHub (Oct 9, 2025):
@tjbck no it does not, please refer to the openai cookbook link I already published: https://cookbook.openai.com/examples/how_to_call_functions_with_chat_models
@rgaricano commented on GitHub (Oct 9, 2025):
@tjbck
Tim, but the chat stuck in this circunstance, as I tested & posted.
The tool is executed fine, without streaming, but the response is never displayed and the chat stuck with any error or notification.
@tjbck commented on GitHub (Oct 9, 2025):
@mramendi the tools are called from Open WebUI, it's literally how their chat completion API behaves. I'd appreciate if you could actually try using the chat completion endpoint and see the behaviour for yourself instead of referencing a post that has nothing to with this.
@tjbck commented on GitHub (Oct 9, 2025):
@rgaricano it's because if you turn off the stream it returns a tool call response. As per my message above, we do not "execute" the tool from our end to follow the existing API behaviour when the streaming if set to False. This IS an intended behaviour and will NOT be supported.
@tjbck commented on GitHub (Oct 9, 2025):
@Classic298 was half correct here. This is not an "issue" and is a matter of how stream off should be "interpreted".